let 和 const
let 和 const 是 es6 新增的两个变量声明关键字,与 var 的不同点在于:
(1)let 和 const 都是块级作用域,在 {} 内有效,这点在 for 循环中非常有用,只在循环体内有效。var 为函数作用域。
(2)使用 let 和 const 声明的变量,不存在变量提升,必须先声明再使用。使用 var 声明的变量可以先使用再定义。
(3)不可重复声明。一旦用 var,let 或者 const 声明过的变量,再次用 let 或者 const 声明时会报错,函数的参数名如果用 let 或者 const 在函数体内声明同名的参数时,也会报错。
const 特殊要点:
(1)const 顾名思义常量,但这个常量与高级语言的常量有所不同,这里的常量指的是在定义就确定其值,并且这个值只读,不可以修改;高级语言的常量更狭隘一点;
(2)使用 const 声明的变量,一旦声明需要立即初始化,只声明的变量无法用 const,const a; 编译会报错;并且一旦初始化,就不能改变。
(3)const 用于定义一个复合型对象或者数组时,只是对对象或者数组本身不可赋值,但依然可以为对象添加属性或者为数组 push 元素。
解构赋值
解构是按照一定的模式,从数组和对象中提取值,对变量进行赋值,解构表达式的左侧是一般 [] 或者 {}。当解构表达式的左侧是[] 时,右侧也必须是对应的具有可遍历属性的对象,因此可以是 [],map 或者 string;当解构表达式的左侧为{} 时,javascript 解析器会先将右侧的值转换为对象,然后从转换的对象获取对应的属性值。总之,解构一个很重要的原则就是“模式匹配”,根据左侧是 [] 或者{},对右侧进行转换,如果转换后,两侧模式匹配,则进行解构赋值,否则报错。
同时,解构时允许设置默认值,但这里的执行顺序是:先解构,如果解构得到的值为非 undefined,则变量值 = 解构的值,默认赋值表达式不执行;只有当解构得到的值严格等于 undefined 时,才会执行默认赋值表达式,否则默认赋值表达式是不执行的。
1. 数组解构
数组的解构是按照变量的顺序进行赋值的,因此变量的值与数组的顺序息息相关,不同的顺序,解构得到的值也不同。
2. 对象解构
对象解构与数组解构不同,对象解构与元素的顺序无关,对象解构的主要依据是对象的属性,对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
3. 函数参数解构
函数参数解构其实是数组解构或者对象解构的一种应用,在 es6 中可以为函数参数指定默认值,这点和解构一起使用,对于参数赋值非常实用。函数参数的解构同样要求模式匹配,函数定义时的参数的数据类型和调用时传入的参数类型保持一致。
另外:对于已经声明的变量进行解构赋值时,要非常小心。下面的示例中,首先用 let 对变量进行了声明,由于 let 和 const 声明的变量不能重复声明,在通过解构表达式赋值时,javascript 解析器会将行首的 {} 解析为代码块,报语法错误。因此在行首加(),将其强制转化为表达式执行。
4. 字符串的解构赋值
字符串也可以进行解构赋值,因为字符串可以转化为一个具有类似数组的对象。
5. 数字和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错。
参考文献:http://es6.ruanyifeng.com/#do…
http://es6.ruanyifeng.com/#do…