ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
1:数组解构
它采取次序解构的原则进行赋值。
原则一:位置匹配
let [a,b,c] = [1,2,3];
console.log(a+","+b+","+c); //1,2,3
// 可以留空位置
let [ , , c] = [1,2,3]; // c = 3
// rest形式
let [a,...b] = [1,2,3,4] // a = 1,b=[2,3,4]
原则二:形式匹配
let [a,[b],c] = [1,[2],3];
console.log(a+","+b+","+c); //1,2,3
位置二是数组,所以赋值形式也是数组。
原则三:可以有默认值,但必须保证赋值之后是undefined
例子1:
let [a=1] = [];
console.log(a); // a=1
上例中,a按照位置匹配赋值为undefiend,符合条件三,所以可以使用默认值1。
例子2:
let [a=2] = [null]; // null不严格等于undefiend,所以不能采用默认值,所以a=null
2.对象解构
数组解构按次序解构,对象解构按模式解构,即顺序对解构无影响,按照模式查找
let {a:b} = {a:'123'};
console.log(b); // b='123'
可以看到:a只是匹配对照用的模式,真正赋值的其实a后面的值b。
————————————————华丽的分隔线——————————————————————
例子1:解构与顺序无关。
let { a:A, b:B} = { b:'456' ,a: '123'};
console.log(A); // A=123
console.log(B); // B=456
例子2:解构失败得到的是undefined
let {a : A} = {b : '123'};
console.log(A); // A = undefined
上例无a模式匹配,所以A是undefined。
例子3:用于嵌套解构的对象
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
console.log(p); //['hello',{y:'World'}]
console.log(x); // hello
console.log(y); // World
如果不看解析你能看懂为什么p是这个结果,那么恭喜你,你真的很棒了。
解析:let { p, p: [x, { y }] } = obj;
是let { p:p, p: [x, { y }] } = obj;
的简写,另外你看不懂的原因是,这是两个匹配,两次都是把obj的值赋给左边。
{p:p}=obj
即{p:p}={p:[ 'Hello',{ y: 'World' }]}
现在这个模式就是最简单的模式匹配了。
————————————————华丽的分割线————————————————————
默认值
规则与数组的解构相同,需要严格等于undefiend
3.字符串解构
字符串可以被解构成一个类似数组的对象。
const [a,b,c] = 'abc';
console.log(a); // a
console.log(b); // b
console.log(c); // c
参考:http://es6.ruanyifeng.com/#docs/destructuring