解构是一种从存储在(可能是嵌套的)对象和数组中的数据中提取多个值的方法。它可以用于接收数据的位置或作为对象的值。我们将通过一些示例来了解如何使用解构:
数组解构
数组解构适用于所有可迭代值
const iterable = ['a', 'b'];
const [x, y] = iterable;
// x = 'a'; y = 'b'
解构有助于处理返回值
const [all, year, month, day] =
/^(\d\d\d\d)-(\d\d)-(\d\d)$/
.exec('2999-12-31');
对象解构
const obj = { first: 'Jane', last: 'Doe' };
const {first: f, last: l} = obj;
// f = 'Jane'; l = 'Doe'
// {prop} is short for {prop: prop}
const {first, last} = obj;
// first = 'Jane'; last = 'Doe'
在哪里使用解构的例子
// Variable declarations:
const [x] = ['a'];
let [x] = ['a'];
var [x] = ['a'];
// Assignments:
[x] = ['a'];
// Parameter definitions:
function f([x]) { ··· }
f(['a']);
// OR USE IT IN A FOR-OF loop
const arr = ['a', 'b'];
for (const [index, element] of arr.entries()) {
console.log(index, element);
}
// Output:
// 0 a
// 1 b
解构模式
任何解构都涉及两方
- 解构源:要解构的数据,例如解构赋值的右侧。
- 解构目标:用于解构的模式。例如,解构赋值的左侧。
解构目标是以下三种模式之一:
- 赋值目标:通常赋值目标是一个变量。但是在解构赋值中你有更多的选择。(例如 x)
- 对象模式:对象模式的部分是属性,属性值又是模式(递归)(例如 { first: «pattern», last: «pattern» } )
- 数组模式:数组模式的部分是元素,元素又是模式(例如 [ «pattern», «pattern» ])
这意味着您可以任意深入地嵌套模式:
const obj = { a: [{ foo: 123, bar: 'abc' }, {}], b: true };
const { a: [{foo: f}] } = obj; // f = 123
**模式如何访问值的内部?**
对象模式在访问属性之前将解构源强制转换为对象。这意味着它适用于原始值。使用 ToObject() 执行对对象的强制转换,该方法将原始值转换为包装对象并保持对象不变。遇到 Undefined 或 Null 时会抛出类型错误。可以使用空对象模式来检查值是否可以强制转换为对象,如下所示:
({} = [true, false]); // OK, Arrays are coercible to objects
({} = 'abc'); // OK, strings are coercible to objects
({} = undefined); // TypeError
({} = null); // TypeError
数组解构使用迭代器来获取源的元素。因此,您可以对任何可迭代的值进行数组解构。
例子:
// Strings are iterable:
const [x,...y] = 'abc'; // x='a'; y=['b', 'c']
// set value indices
const [x,y] = new Set(['a', 'b']); // x='a'; y='b’;
如果一个值有一个方法,其键是 symbol.iterator 并返回一个对象,那么它就是可迭代的。如果要解构的值不可迭代,则数组解构会抛出 TypeError
例子:
let x;
[x] = [true, false]; // OK, Arrays are iterable
[x] = 'abc'; // OK, strings are iterable
[x] = { * [Symbol.iterator]() { yield 1 } }; // OK, iterable
[x] = {}; // TypeError, empty objects are not iterable
[x] = undefined; // TypeError, not iterable
[x] = null; // TypeError, not iterable
// TypeError is thrown even before accessing elements of the iterable which means you can use empty Array pattern [] to check if value is iterable
[] = {}; // TypeError, empty objects are not iterable
[] = undefined; // TypeError, not iterable
[] = null; // TypeError, not iterable
可以设置默认值
默认值可以设置为后备
例子:
const [x=3, y] = []; // x = 3; y = undefined
未定义触发默认值