字符转换
16进制与10进制相互转换
var sHex=(255).toString(16);//ff
var iNum=parseInt(“ff”,16);//255
JavaScript字符与ASCII码间的转换
console.log(“\n”.charCodeAt(0));//10
console.log(String.fromCharCode(65));//A
克隆对象
function clone(obj) { |
server状态码
301永久重定向
302临时重定向
304未修改,从本地度缓存
404未找到
500服务器
favicon.ico 默认请求ico
response.setHeader(‘Cache-Control’, ‘public, max-age=3600’); //缓存一小时
闭包
闭包域内声明的方法外部无法直接访问,但它可以访问外部的变量或方法,每声明一个函数,就产生一个域(函数栈),每个域内部有个function scope内默认有个Global全局引用
当一个函数包含另一个函数,子函数生命周期依附于父函数,子函数的function scope会产生一个closure对象属性,它包含子域对父域的所有引用,只要子函数存活其父函数就依旧存活,如果父函数存活期间对私有变量做了改变,那引用的子函数function scope的closure对象属性的内容也会发生变化,因为他们只是引用关系
for(var i = 0;i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++) { |
for(var i = 0; i<arr.length;i++) { |
for(var i = 0; i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++) { |
for(var i = 0;i<arr.length;i++){ |
typeof
通常同来检测一个对象是否已经定义或者是否已经赋值Value Class Type
-------------------------------------
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object
Class 一列表示对象的内部属性 [[Class]] 的值,只可能是下面字符串中的一个
Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.
强烈推荐使用 Object.prototype.toStringfunction is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1)
return obj !== undefined && obj !== null && clas === type
}
is('String', 'test') // true
is('String', new String('test')) // true
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(2) // "[object Number]"
instanceof
比较自定义的对象时才有意义,如果用来比较内置类型,将会和 typeof 操作符 一样用处不大。
比较自定义对象function Foo() {}
function Bar() {}
Bar.prototype = new Foo();
new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true
// 如果仅仅设置 Bar.prototype 为函数 Foo 本身,而不是 Foo 构造函数的一个实例
Bar.prototype = Foo;
new Bar() instanceof Foo; // false
比较内置对象new String('foo') instanceof String; // true
new String('foo') instanceof Object; // true
'foo' instanceof String; // false
'foo' instanceof Object; // false
instanceof 操作符应该仅仅用来比较来自同一个 JavaScript 上下文的自定义对象
类型转换
javascript是弱类型语言,所以会在可能的情况下应用强制类型转换// 下面的比较结果是:true
new Number(10) == 10; // Number.toString() 返回的字符串被再次转换为数字
10 == '10'; // 字符串被转换为数字
10 == '+10 '; // 同上
10 == '010'; // 同上
isNaN(null) == false; // null 被转换为数字 0
// 0 当然不是一个 NaN(译者注:否定之否定)
// 下面的比较结果是:false
10 == 010;
10 == '-10';
内部类型的构造函数new Number(10) === 10; // False, 对象与数字的比较
Number(10) === 10; // True, 数字与数字的比较
new Number(10) + 0 === 10; // True, 由于隐式的类型转换
最好把选择比较的值显示的转换为三中可能的类型之一'' + 10 === '10'
+ '10' === 10
'+010' === 10
Number('010') === 10
parseInt('010', 10) === 10
转换布尔型!!'foo' // true
!!'' // false
!!'0' // true
!!'1' // true
!!'-1' // true
!!{} // true
!!true // true
eval
为什么不要使用eval
eval 函数会在当前作用域中执行一段 JavaScript 代码字符串var foo = 1;
function test() {
var foo = 2
eval('foo = 3')
return foo
}
test() // 3
foo // 1
但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行var foo = 1
function test() {
var foo = 2
var bar = eval
bar('foo = 3')
return foo;
}
test() // 2
foo // 3
上面的代码等价于在全局作用域中调用 eval,和下面两种写法效果一样:// 写法一:直接调用全局作用域下的 foo 变量
var foo = 1;
function test() {
var foo = 2;
window.foo = 3;
return foo;
}
test(); // 2
foo; // 3
// 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域
var foo = 1;
function test() {
var foo = 2;
eval.call(window, 'foo = 3');
return foo;
}
test(); // 2
foo; // 3
伪装的eval
定时函数 setTimeout 和 setInterval 都可以接受字符串作为它们的第一个参数。
这个字符串总是在全局作用域中执行,因此 eval 在这种情况下没有被直接调用function foo() {
// 将会被调用
}
function bar() {
function foo() {
// 不会被调用
}
setTimeout('foo()', 1000)
}
bar()
不要在调用定时器函数时,为了向回调函数传递参数而使用字符串的形式function foo(a, b, c) {}
// 不要这样做
setTimeout('foo(1,2, 3)', 1000)
// 可以使用匿名函数完成相同功能
setTimeout(function() {
foo(1, 2, 3);
}, 1000)
应该避免使用 setInterval,因为它的定时执行不会被 JavaScript 阻塞function foo(){
// 阻塞执行 1 秒
setTimeout(foo, 100)
}
foo()
locaion
Date
// 输出星期几? |
fastClick
http://www.cnblogs.com/vajoy/p/5522114.html
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
https://gist.github.com/allenm/5e22379cb8055f4402bcd417f682ae8f //dingding
xss 攻击
面试题
http://javascript-puzzlers.herokuapp.com/
https://github.com/qiu-deqing/FE-interview#%E7%BC%96%E5%86%99javascript%E6%B7%B1%E5%BA%A6%E5%85%8B%E9%9A%86%E5%87%BD%E6%95%B0deepclone
Object.defineProperty
vue 双向绑定的核心原理就是使用了 Object.defineProperty() 方法来监听数据的变化