变量的析构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
数组的解构赋值
1 | let [foo, [[bar], baz]] = [1, [[2], 3]]; |
如果解构不成功,变量的值就等于undefined。解构赋值允许指定默认值。
1 | let [x, y = 'b'] = ['a']; // x='a', y='b' |
上面代码中,如果一个数组成员是null
,默认值就不会生效,因为null
不严格等于undefined
。
对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
1 | let { bar, foo } = { foo: "aaa", bar: "bbb" }; |
下面代码中,foo
是匹配的模式,baz
才是变量。真正被赋值的是变量baz
,而不是模式foo
。
1 | let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; |
与数组一样,解构也可以用于嵌套结构的对象。
1 | let obj = { |
注意,这时p
是模式,不是变量,因此不会被赋值。要p
作为变量赋值,可以写成下面这样。
1 | let { p, p: [x, { y }] } = obj; |
下面是嵌套赋值的例子。
1 | let obj = {}; |
对象的解构也可以指定默认值。默认值生效的条件是,对象的属性值严格等于undefined
。
1 | var {x, y = 5} = {x: 1}; |
如果要将一个已经声明的变量用于解构赋值,必须非常小心。
1 | // 错误的写法, JavaScript 引擎会将{x}理解成一个代码块 |
对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。
1 | let { log, sin, cos } = Math; |
字符串的解构赋值
字符串也可以解构赋值。此时,字符串被转换成了一个类似数组的对象。
1 | const [a, b, c, d, e] = 'hello'; |
函数参数的解构赋值
1 | function move({x = 0, y = 0} = {}) { |
换一种指定默认值的方法会有不同的结果
1 | function move({x, y} = { x: 0, y: 0 }) { |