默认参数和解构的这种特殊情况如何运作?

Shy*_*abu 9 javascript destructuring default-parameters

我今天正在尝试一些事情,并且遇到了我想要理解的行为.

var b = ({a = 1, b = 1, c = 1}) => a + b + c;

b(); // throws error.
Run Code Online (Sandbox Code Playgroud)

但如果它是这样定义的

var b = ({a = 1, b = 1, c = 1} = 0) => a + b + c;

b() // returns 3
b([]) // returns 3
Run Code Online (Sandbox Code Playgroud)

这不应该是一个错误吗?零在某种程度上成为了一个对象吗?它在某种程度上等同于以下?

var b = ({a = 1, b = 1, c = 1} = {}) => a + b + c; // this is possible I guess.
Run Code Online (Sandbox Code Playgroud)

我的问题不是常规的destrcuturing和default params如何工作,而只是如何评估这个特定的场景.

谁可以给我解释一下这个?

Seb*_*mon 5

({a = 1, b = 1, c = 1} = something) => {}
Run Code Online (Sandbox Code Playgroud)

只是意味着something必须是一个对象或可以转换为一个,即它不能是nullundefined.1

因此,在的情况下0,进行到抢a,bc特性0,即(0).a,(0).b,(0).c,所有这些都是undefined,因此,他们都默认为1,其提供的默认值.

0当然可以强迫一个Number物体.这就是为什么你可以做(0).toString(){toString} = 0.这就是这里发生的事情.

它通常不等同于{}默认使用,因为它将使用空对象的属性(自己的属性和原型链上的属性),而不是数字的属性.


1:这种"结构验证"最简化的形式是({} = something).对于数组的解构,它就是([] = something)并且它意味着something必须也是可迭代的.顺便说一下,那些空的解构分配不会创建任何变量,它们只是进行结构检查.