《ES6标准入门》读书笔记 第3章

数组的解构赋值

解构赋值遵循模式匹配原则。

下面看例子:

let [a, b] = [1, 2] // 基础用法
let [a, b] = [1, [2, 3]] // b = [2, 3],模式匹配
let [a, [b]] = [1, [2]] // b = 2,模式匹配
let [a, ...b] = [1, 2, 3] // b = [2, 3],残余全接收,行为与函数rest参数一致
let [a] = [1, 2] // a = 1,冗余
let [a, , c] = [1, 2, 3] // a = 1, c = 3,丢弃写法,不像python需要_占位
let [x, y = 'd'] = ['a'] // x = 'a', y = 'd',指定默认值
[a, b] = [b, a] // 可以用于交换变量

对象的解构赋值

按键解构,如果键不同名需要指定别名。该特性也让我们可以方便地从函数返回多个值,或提取JSON解析结果。

下面看例子:

let { a, b } = {a: 1, b: 2} // a = 1, b = 2
let { b, a } = {a: 1, b: 2} // a = 1, b = 2
let { b: c, a } = {a: 1, b: 2} // a = 1, c = 2,注意b、c的顺序与直觉相反
let { c } = {a: 1} // c = undefined,这是易于理解的
let { x = 3 } = { } // x = 3,应用默认值的条件是===undefined
let { length } = 'hello' // length = 5,这是因为字符串对象有length属性
let { x } = undefined // or null,导致TypeError

更多

我们在这里只讨论了最常见的两种解构赋值的用法。实际上,解构赋值的形式是多样的,用处是大的。当掌握了这两种解构赋值的基础后,自然而然会在编码中用到各种形式的解构赋值,无需特别讨论。