1.基本用法(数组的解构)
let [a,b,c] = [1,2,3]; let [foo, [[bar],baz]] = [1,[[2],3]]; let [ , ,third] = ['foo','bar','baz']; let [x, ,y] = [1,2,3]; let [head, ...tail] = [1,2,3,4];//tail=[2,3,4] let [x,y,...z] = ['a'];//y=undefined,z=[]
解构不成功就等于undefined,
不完全解构,右边只匹配数组的一部分,也可以成功。但是如果是不可迭代的结构,解构就会报错。
// 不完全解构 let [x,y] = [1,2,3]; let [a,[b],d] = [1,[2,3],4]; // 报错 let [foo] = 1; let [foo] = false; let [foo] = NaN;
解构生成器函数
function* fibs(){
let a=0;
let b=1;
while(true){
yield a;
[a,b]=[b,a+b];
}
}
let [first,second,third,fourth,fifth,sixth] = fibs();
console.log(sixth);;//5指定默认值
let [x=1] = [undefined];//x=1 let [y=1] = [null];//y=null
也可以引用解构赋值的其他变量
let [x1=1,y1=x] = []; let [x2=1,y2=x2] = [2]; let [x3=1,y3=x3] = [1,2];//x3=1,y3=2
2.对象的解构
对象的解构是没有次序的
let {foo,bar}={bar:'b',foo:"a"};将对象的方法赋值到某个变量
let {log} = console;
log('hello');也可以这样写
let obj = {first:'hello', last:'world'};
let {first:f,last:l} = obj;
console.log(f,l);// hello world实际上对象的解构是下面的简写
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };前面的是匹配的模式,后面的才是真正的变量,被赋值的也是后者
搞懂这个就能搞懂复杂一点的解构赋值
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}3.字符串的解构赋值
const [a, b, c, d, e] = 'hello';
4.数值和布尔值的解构赋值
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true5.函数参数的解构赋值
[[1, 2], [3, 4]].map(([a, b]) => a + b);
当然也可以使用默认值。