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