在测试一些代码时,我遇到了一些以前并不完全熟悉的语法:
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
只考虑可枚举的属性,并且函数的默认属性都不可枚举。