定义:从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)
(1)如果结构不成功,变量的值就为undefined
(2)不完全解构(简单理解为左侧变量少,右侧值多)
(3)如果等号右边的不是数组(或者严格的说,不是可遍历的解构),那么将会报错
(4)解构赋值允许使用默认值,但要注意,ES6内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。如:
let [x = 1] = [undefined];
x // 1
let [x = 1] = [null];
x // null
上面代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。
(5)如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。如:
function f() {
console.log('aaa');
}
let [x = f()] = [1];
上面代码中,因为x能取到值,所以函数f根本不会执行。上面的代码其实等价于下面的代码。
let x;
if ([1][0] === undefined) {
x = f();
} else {
x = [1][0];
}
(6)默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
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
最后一个表达式之所以会报错,是因为x用y做默认值时,y还没有声明。
网友评论