###数组的解构赋值
- 可以以如下方式赋值
两边模式相同,变量就会被赋予相对应的值let [a, b, c] = [1, 2, 3]; let [ , , third] = ["foo", "bar", "baz"]; third // "baz"
- 不完全解构
let [x, y] = [1, 2, 3]; x // 1 y // 2
- 若右边数据结构具有Iterator接口,都可以进行数组解构赋值(如generator函数)
- 允许有默认值,等号右边对应值完全等于undefined默认值才生效
let [x = 1] = [undefined]; x // 1 let [x = 1] = [null]; x // null
- 如果默认值是表达式,那么表达式会惰性求值,用到才会求值
###对象的解构赋值
- 对象属性没有次序,只要名字相等就可以赋值
let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb" let { baz } = { foo: 'aaa', bar: 'bbb' }; baz // undefined
- 也可以如下操作
// 例一 let { log, sin, cos } = Math; // 例二 const { log } = console; log('hello') // hello
- 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" foo // error: foo is not defined
- 与数组一样,解构也可以用于嵌套结构的对象
- 对象解构也可以指定默认值,与数组结构类似
- 只有不将大括号写在行首,js才不会把他解析成代码块
let x; ({x} = {x: 1});//正确写法 {x} = {x: 1};//报错,会被解析成代码块
- 可以对数组进行对象的解构赋值
let arr = [1, 2, 3]; let {0 : first, [arr.length - 1] : last} = arr; first // 1 last // 3
###字符串的解构赋值
const [a, b, c, d, e] = 'hello';
###数值和布尔值的解构赋值
- 若等号右边是数值或布尔值,会先转换成对象
以上代码的123和true转换成对象后都有toString属性,故变量s能被赋值let {toString: s} = 123; s === Number.prototype.toString // true let {toString: s} = true; s === Boolean.prototype.toString // true
###函数参数的解构赋值
function add([x, y]){
return x + y;
}
add([1, 2]); // 3
- 参数解构也可以使用默认值
###圆括号的使用 +情况只有一种,赋值语句的非模式部分可以使用圆括号
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
###用途
- 交换变量值
let x = 1;
let y = 2;
[x, y] = [y, x];
- 从函数返回一个数组或对象用于解构赋值
- 函数参数定义
- 提取JSON对象