数组的解构赋值
- 基本用法
(1)直接定义
let [a, b, c] = [1, 2, 3];
(2)“模式匹配”
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
如果解构不成功的话变量的值就等于undefined
(3) 完全解构与不完全解构
以上情况都属于完全解构,另一种情况是不完全解构,即等号左边的模式,只匹配一部分等号右边的数组。这种情况下,解构依然可以成功。
let [x, y] = [1, 2, 3];
let [a, [b], d] = [1, [2, 3], 4];
(4)数据解构不一致无法解构
如果等号右边的不是数组,或者说不是可遍历的数据结构,那么就会报错,以下都会报错。
// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
- 默认值
(1)解构赋值允许指定默认值。
let [foo = true] = [];foo // true
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
【注】ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。如下:
let [x = 1] = [undefined]; x // 1
let [x = 1] = [null]; x // null 默认值没有生效
(2)如果默认值是表达式,那么这个表达式是惰性求值的,只有在用到的时候才会求值。
function f() {
console.log('aaa');
}
let [x = f()] = [1]; //函数f根本没有执行,因为x已经取到值了~
(3)默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x = 1, y = x] = []; // x=1; y=1
let [x = 1, y = x] = [2]; // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = []; // ReferenceError: y is not defined