let [foo] = []; let [bar, foo] = [1]; foo // undefined 解构不成功就会返回undefined。
let [x, y] = [1, 2, 3]; 不完全解构。
let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {}; 会报错,因为等号右边是不可便利的结构。
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b' 只有对应的位置严格等于(===)undefined,默认值才会生效。
对象的解构赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
let {foo, bar} = {foo: "aaa", bar: "bbb"}; let {foo: foo, bar: bar} = {foo: "aaa", bar: "bbb"}; let {foo: baz} = {foo: "aaa", bar: "bbb"} // baz->"aaa" foo->报错 let {foo} = {bar: "bbb'} //解构失败 foo->undefined 解构赋值的键其实是匹配的模式,而值才是指向真正的值。
var {x = 3} = {x: undefined}; x // 3 var {x = 3} = {x: null}; x // null 默认值的生效条件是对应匹配的值为undefined。
let arr = [1, 2, 3]; let {0: first, [arr.length - 1]: last} = arr; first // 1 last // 3 数组可以进行对象属性的结构,**数组本质是特殊的对象**
字符串的解构赋值
1 2 3
let {length: len} = 'hello'; len //5 String类中有个length属性与之匹配。
数值和布尔值的解构赋值
1 2 3 4 5 6 7 8 9 10
let {toString: s} = 123; s === Number.prototype.toString // true
let {toString: s} = true; s === Boolean.prototype.toString // true 如果等号右边是数值或者布尔值,则会转为包装对象
let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError undefined和null无法转为对象。