严格模式必须遵循以下规则:
变量名必须声明后再使用
函数的参数不能同名
不能使用with语句
不能对只读属性赋值
不能使用前缀0表示八进制数
不能删除不可删除的属性
eval不会再它的外层作用域引入变量
eval和arguments不能被重新赋值
不能使用arguments.callee、arguments.callee.caller
禁止this指向全局对象window
不能使用fn.caller和fn.arguments获取函数调用堆栈
增加保留字(比如protected、static、interface)
箭头函数:
箭头函数是对JavaScript this绑定错误的处理。
目前掌握的this用法:
this 在对象的属性中,指向window
this 在对象的方法中,指向调用该方法的对象
this 在回调函数中使用,会指向window因为在回调函数中,this指向哪个函数都会说不通,因此this自动会重新指向window
this 在事件侦听函数中使用,this指向添加事件侦听的对象
this 在箭头函数中,指向函数外部
Symobl:
表示独一无二的。作用:消除魔术字符串,设置对象的属性不可修改
生成器函数:
1 function* fn(a,b){ 2 yield a; 3 a++; 4 yield a; 5 yield b; 6 b++; 7 yield b; 8 yield a+b; 9 return a+b; 10 } 11 var a=fn(3,4); 12 /* console.log(a.next()); 13 console.log(a.next()); 14 console.log(a.next()); 15 console.log(a.next()); 16 console.log(a.next()); 17 console.log(a.next()); */ 18 for(let value of a){ 19 console.log(value); 20 }
解构赋值:
解构赋值分为两种: 数组的解构赋值,对象的解构赋值
作用1:交换值
[arr[i],arr[i+1]] = [arr[i+1],arr[i]];
作用2:给函数参数设置初始值
1 function fn([a,b=2]){ 2 console.log(a,b); 3 } 4 fn([3,5]); // 3 , 5 5 fn([4]); // 4, 2
作用和数组解构的作用因该是一致的
如果多重对象解构时,属性名相同,可以使用:设置新的属性名
var {a,b:{a:a1}} = {a:1,b:{a:2}}; console.log(a,a1); // 1,2
输出b的话会报错,因为b属性被解构了,就不存在了,所以要重新设置b属性,如果要输出b,就得在写一个。
var {a,b:{a:a1},b} = {a:1,b:{a:2}}; console.log(a,a1,b); // 1, 2, {a:2}