我今天尝试了一些事情,遇到了一个我想了解的行为。
var b = ({a = 1, b = 1, c = 1}) => a + b + c;
b(); // throws error.
但是如果这样定义
var b = ({a = 1, b = 1, c = 1} = 0) => a + b + c;
b() // returns 3
b([]) // returns 3
这不应该是一个错误吗?零不知何故成为了这里的一个对象吗?它在某种程度上等同于以下内容吗?
var b = ({a = 1, b = 1, c = 1} = {}) => a + b + c; // this is possible I guess.
我的问题不是常规解构和默认参数如何工作,而是如何评估这个特定场景。
有人能给我解释一下吗?
最佳答案
({a = 1, b = 1, c = 1} = something) => {}
只是意味着 something
必须是一个对象或可以转换为一个对象,即它不能是 null
或 undefined
。<支持1
因此,对于 0
,它会继续获取 a
、b
和 c
属性0
,即 (0).a
、(0).b
、(0).c
,所有这些都是 undefined
,因此它们都默认为 1
,即它们提供的默认值。
0
当然可以强制转换为 Number
对象。这就是为什么您可以执行 (0).toString()
或 {toString} = 0
的原因。这正是这里发生的事情。
它通常不等同于将 {}
用作默认值,因为这将使用空对象的属性(包括自身属性和原型(prototype)链上的属性),而不是数字的属性。
1:这种“结构验证”的最简化形式是({} = something)
。对于数组的解构,它是 ([] = something)
这意味着 something
也必须是 iterable .顺便说一句,那些空的解构赋值不会创建任何变量,它们只是进行结构检查。
关于javascript - 这种默认参数和解构的特殊场景是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50154734/