解构:ES6允许按照一定模式从数据和对象中提取值来对变量进行赋值
1.数组的解构赋值
let [a, b, c] = [1, 2, 3];
let [x, , y] = [1, 2, 3]; x // 1 y // 3
如果解构不成功,变量的值就等于undefined
let [x, y, ...z] = ['a']; x // "a" y // undefined z // []
不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组
let [a, [b], d] = [1, [2, 3], 4]; a // 1 b // 2 d // 4
如果等号右边不是可遍历(本身不具备Iterator接口)的解构,那么将会报错
默认值
解构赋值允许指定默认值。
注意,ES6 内部使用严格相等运算符(===
),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined
,默认值才会生效。
let [x = 1] = [undefined]; x // 1 let [x = 1] = [null]; x // null
2.对象的解构赋值
let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb"
实际上为
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };
foo
是匹配的模式,baz
才是变量。真正被赋值的是变量baz
,而不是模式foo
。
let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" foo // error: foo is not defined
默认值
默认值生效的条件是,对象的属性值严格等于undefined
。
var {x = 3} = {x: undefined}; x // 3 var {x = 3} = {x: null}; x // null