.数组的解构赋值
。解构不成功,相应变量的值为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]; // 正确
