记录一下阅读阮老师的《ECMAScript 6入门》,本篇包含的内容:变量的解构赋值。
数组的解构赋值
基本用法
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
1 | // 解构赋值不仅适用于var命令,也适用于let和const命令。 |
如果解构不成功(也就是模式没配对上),变量的值就等于undefined。
如果等号的右边不是数组,那么将会报错。
1 | // 对于Set结构,也可以使用数组的解构赋值。 |
默认值
解构赋值允许指定默认值。ES6内部使用严格相等运算符(===),判断一个位置是否有值。如果一个数组成员不严格等于undefined,默认值是不会生效的。
1 | var [x = 1] = [undefined]; |
如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
1 | function f() { |
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
1 | var { bar, foo } = { foo: "aaa", bar: "bbb" }; |
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
1 | var { foo: baz } = { foo: "aaa", bar: "bbb" }; |
注意,采用这种写法时,变量的声明和赋值是一体的。对于let和const来说,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。
1 | let foo; |
和数组一样,解构也可以用于嵌套结构的对象。
1 | var obj = { |
对象的解构可以指定默认值(规则与数组类似)。
由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
1 | var arr = [1, 2, 3]; |
字符串的解构赋值
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
1 | const [a, b, c, d, e] = 'hello'; |
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
1 | let {length : len} = 'hello'; |
数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。如果不能转为对象会报错,例如null
和undefined
。
1 | let {toString: s} = 123; |
函数参数的解构赋值
函数参数的解构也可以使用默认值。
1 | function move({x = 0, y = 0} = {}) { |
圆括号问题
不能使用圆括号的情况:
(1)变量声明语句中,不能带有圆括号。
(2)函数参数中,模式不能带有圆括号。
(3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
可以使用圆括号的情况:
只有一种: 赋值语句的非模式部分,可以使用圆括号。
解构赋值的用途
(1)交换变量的值
(2)从函数返回多个值
(3)函数参数的定义
(4)提取JSON数据
(5)函数参数的默认值
(6)遍历Map结构
(7)输入模块的指定方法