.数组的解构赋值
。解构不成功,相应变量的值为undefined
。等号右边不是数组,则会报错,
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
。es6内部使用严格相等运算符(===),当数组元素严格相等于undefined的时候,数组元素的默认值才会调用
let [x = 1] = [null] // x = null;let [x = 1] = [undefined] // x = 1
.对象的解构赋值
。默认值生效的条件是对象的属性值严格等于undefined,let {x = 1} = {x: undefined} // x = 1,let {x = 1} = {x: null} // x = null
。解构的模式是嵌套的对象,而且子对象所在的父属性不存在,则报错,let {a = {b = 1}} = {c = 'ddd'}} // referenceError
。声明的变量用于解构赋值会报错,let x; {x} = {x: 1} // 报错,因为大括号会将{x}理解为一个代码块从而报错,正确用法:
let x; ({x} = {x: 1});
。左边模式中可以不放置任何变量名,({} = [true, false]);
.字符串的解构赋值
。const [a, b] = 'he'; // a = h,b = e;let {length: len} = 'hello'; // len = 5
.数值、布尔值解构赋值
。只要等号右边不是数组或对象,都会先转为对象,而undefined和null是无法转为对象的,所以对它们解构会报错
.圆括号问题
。变量声名语句不得使用圆括号,
// 全部报错
let [(a)] = [1];
let {x: (c)} = {};
let ({x: c}) = {};
let {(x: c)} = {};
let {(x): c} = {};
let { o: ({ p: p }) } = { o: { p: 2 } };
。函数参数,同上,报错
。只有模式有圆括号
({ p: a }) = { p: 42 };
([a]) = [5];
。可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确