从数组和对象中提取值,对变量进行赋值
数组(一 一 对 应)
完全解构(必须一一对应):
1 | let [foo, [[bar], baz]] = [1, [[2], 3]]; |
不完全解构(即等号左边的模式,只匹配一部分的等号左边的数组):
1 | let [a, [b], d] = [1, [2, 3], 4]; |
默认值
- 数组/对象成员严格等于undefined,默认值才会生效。
- 数组/对象成员是null,默认值就不会生效
1
2
3
4
5
6
7
8let [foo = true] = [];
foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
let [x = 1] = [undefined];
x // 1
对象
1 | // 解构失败,返回undefined |
嵌套
1 | let obj = { |
注意点
如果要将一个『已经声明的变量』用于解构赋值,必须非常小心。
// 错误的写法 // 正确的写法 let x; let x; {x} = {x: 1}; ({x} = {x: 1});
解构赋值允许等号左边的模式之中,不放置任何变量名
1
({} = [true, false]);
数组本质是特殊的对象,因此对数组进行对象属性的解构。
1
2
3
4let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3不要使用圆括号
字符串(被转换成了一个类数组的对象)
1 | // 类似数组中length属性 |
数值、布尔值(等号右边不管是什么,会先转为对象)
1 | let {toString: s} = 123; |
函数参数
- 遍历时数组存在undefined,则会被默认值替代
1
2[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]