1.关于解构和默认值的关系

function foo(){
    console.log('foo');
}
let [x=foo()]=[1];

上面的代码执行后我们可以发现foo函数没有马上执行,其实内部的判断逻辑如下:

let x;
if ([1][0] === undefined) {
     x = f();
} else {
    x = [1][0];
}

也就是说只有右边是undefined才会执行foo(),否则不执行,直接赋值。

2.一些不能被对象解构的情况

不可枚举类型不能被解构成功:

var obj=Object.create(null,{
    x:{
    value:'x',
        enumerable:true,
    },
    y:{
    value:'y',
        enumerable:false
    }
});
let {...a}=obj;
/*
结果:
{x: "x"}
*/

class的对象只能解构它的this上的对象,不能解构方法。

class foo{
    constructor(){
    this.name='abc';
    }
    hello(){
    console.log('hello');
    }
}
var f=new foo();
let {...b}=f;
/*
结果:
{name: "abc"}
*/

3.解构的时候关于小括号的问题

一般正常正确写法:

//对象
/*方式1*/
let {key1:a}={key1:'aa'}
/*方式2*/
let b;
({key2:b}={key2:'bb'})
//数组
let [a]=[1]

对象的第二种方式要用小括号阔起来,因为{}开头会被当成代码块。

解构的时候小括号不能随便使用,在解构的模式中遇到了小括号就会报错,只有在解构的非模式部分才能用小括号,现在我们来一起分析一些错误情况:

/*包裹整个模式出错*/
let ([a])=[1]
let ({key1:a})={key1:'aa'}/*包裹在外侧*/
let {(key1:a)}={key1:'aa'}/*包裹在内侧*/
([a])=[1]
({key1:a})={key1:'aa'}
/*包裹部分模式出错*/
let {(key1):a}={key1:'aa'}/*key1是负责匹配的模式,不能包裹*/
/*let和包裹非模式部分一起用出错*/
let [(a)]=[1];/*相当于let (a)=1;这样会报错*/
function foo([(z)]){}/*相当于let (z)报错*/

我们可以发现,let和解构在一起更容易出错,排除上面的几种会出错的情况,剩下的不会出错的情况就是,非let和非模式部分括号不会出错:

[(a)]=[1];
({key1:(a)}={key1:'aa'})

整个匹配结构如下:

回到顶部
我要评论

所有评论

返回
邮箱:
绑定
取消
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

邮箱:
绑定邮箱后,若有回复,会邮件通知。
提交
还可以输入500个字