为什么使用 Spread 语法可以处理原语和函数?
Why Does Using the Spread Syntax Work with Primitives and Functions?
在测试一些代码时,我遇到了一些我以前并不完全熟悉的语法:
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)
我一直认为扩展语法只适用于数组、对象和其他可迭代对象(如字符串),否则会导致语法错误。为什么它在我的示例中有效,为什么它们 return 无效?
对象传播只是 Object.assign
的语法糖。 Object.assign
将每个源值转换为对象,就像您尝试访问原始值上的 属性 时发生的情况一样。
但是,从基元创建的对象没有自己的属性:
console.log(Object.getOwnPropertyNames(false));
(怎么可能,毕竟是原始人(所有属性都来自原型))
所以它对最终结果并没有真正的影响。
对于函数,Object.assign
只考虑可枚举的属性,而none函数的默认属性是可枚举的。
在测试一些代码时,我遇到了一些我以前并不完全熟悉的语法:
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)
我一直认为扩展语法只适用于数组、对象和其他可迭代对象(如字符串),否则会导致语法错误。为什么它在我的示例中有效,为什么它们 return 无效?
对象传播只是 Object.assign
的语法糖。 Object.assign
将每个源值转换为对象,就像您尝试访问原始值上的 属性 时发生的情况一样。
但是,从基元创建的对象没有自己的属性:
console.log(Object.getOwnPropertyNames(false));
(怎么可能,毕竟是原始人(所有属性都来自原型))
所以它对最终结果并没有真正的影响。
对于函数,Object.assign
只考虑可枚举的属性,而none函数的默认属性是可枚举的。