for循环中,设置循环变量的那部分是一个副作用域,而循环体内部是一个单独的子作用域。
暂时性死区:代码块内,使用let声明变量之前,对该变量的操作都会抛出ReferenceError异常。
let & const的一个重要性是其不出现变量提升。
如果块区中存在let和const命令,则这个块区对这些命令声明的变量从一开始就形成封闭作用域,只要在声明前使用,就会报错。
注意:影响typeof安全性。const大致和let相似,但其实际上保证的是变量指向的那个内存地址不得改动。
注意:使用freeze可以冻结对象及其属性。
const foo = Object.freeze ({ });
ES6中:let, const, class命令声明的全局变量不属于顶层对象window的属性。
解构赋值:
原则:只要等号右边的值不是对象或数组,就会先将其转为对象,undefined和null无法转为对象,所以解构赋值会失败。
- 解构不成功,变量的值就等于undefined。
let foo = [ ];
let [bar, foo] = [1];
- 不完全解构,也是可以成功。
- 等号右边的值不具备Iterator接口就会报错。只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
- 解构赋值允许默认值。ES6内部用“===”判断一个位置是否有值,数组成员不严格等于undefined,默认值不生效(即可以赋值null)。
- 对象的解构
- 对象解构赋值的属性没有次序,但变量必须与属性同名。
- 内部机制:先找到同名属性,再赋值给对应的变量。真正被赋值的是后者。
- 解构失败,值为undefined。
- 圆括号与解构赋值的关系
- 解构赋值允许等号左边的模式之中不放置任何变量名。
- 解构赋值提取JSON对象数据很有用。