为什么使用Spread语法与原语和函数一起工作



在测试一些代码时,我遇到了一些以前并不完全熟悉的语法:

const obj = {
key: "tree",
value: "narra"
}
let condition = false;
var x = {...(condition && obj)};
console.log(x);

当我运行上面的代码时,我想,我想你可以传播布尔值。但我也在其他原始数据上进行了测试,比如整数,甚至在一个函数上:

let x = {...123};
console.log(x);
x = {...function(){}}
console.log(x)

我一直认为spread语法只适用于数组、对象;其他可迭代项,如字符串,否则会导致语法错误。为什么它在我的例子中有效,为什么它们返回void?

对象排列只是Object.assign的语法糖。Object.assign将每个源值转换为一个对象,就像尝试访问基元值的属性一样。

然而,从基元创建的对象没有自己的属性:

console.log(Object.getOwnPropertyNames(false));

(它们怎么可能呢,它们毕竟是基元(它们所有的属性都来自于它们的原型(

所以它对最终结果并没有真正的影响。

对于函数,Object.assign只考虑可枚举的属性,并且函数的默认属性都不可枚举。

最新更新