2

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

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)

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

4

1 回答 1

3

对象传播只是Object.assign. Object.assign将每个源值转换为对象,就像您尝试访问原始值的属性时发生的情况一样。

但是,从原语创建的对象没有自己的属性:

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

(他们怎么可能,他们毕竟是原始人(他们所有的属性都来自他们的原型))

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

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

于 2020-09-04T06:20:10.420 回答