数组
// ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
let [a, b, c] = [1, 2, 3]; // a:1 b:2 c:3
// 这种写法属于'模式匹配',只要等号两边的模式相同,左边的变量就会被赋予对应的值
let [aa, [[bb], cc]] = [1, [[2], 3]]; // aa:1 bb:2 cc:3
let [, , z] = [1, 2, 3]; // z:3
let [x, ...y] = [1, 2, 3, 4]; // x=1 y=[2,3,4]
let [aaa, bbb] = [11]// aaa=11 bbb=undefined 解构不成功,变量的值就等于undefined
// 解构值允许指定默认值
let [aaaa = true] = [] // aaaa=true
let [xa, xb = 22] = [11, undefined] // xa = 11 xb = 22
let [aaaaa, bbbbb = 1] = [11] // aaaaa=11 bbbbb=1
// es6内部使用严格相等运算符(===)判断一个位置是否有值,所以只有当一个成员严格等于
// undefined默认值才会生效
let [xx = 1] = [undefined]; // xx=1
对象
let {a, b} = {a: 1, b: 2}; // a=1 b=2
let {c, d} = {d: 3, c: 4}; // c=4 d = 3
let {ab} = {aa: 11, bb: 12}; // ab=undefined,没有对应的同名属性就取不到值,解构失败
let {aaa: bbb} = {aaa: 'aaa ', xyz: 'bbb'}; // bbb = 'aaa'
// 对象的解构赋值内部机制是先找到同名属性,然后再赋值给对应变量,真正被赋值的是后者,而不是前者
let obj = {first: 'hello', last: 'world'};
let {first: e, last: f} = obj // e:'hello' f:'world'
let obj1 = {
o: [
'hello',
{j: 'world'}
]
}
let {o: [h, {j}]} = obj1 // h='hello' j='world'