为啥使用扩展语法适用于基元和函数?

Posted

技术标签:

【中文标题】为啥使用扩展语法适用于基元和函数?【英文标题】:Why Does Using the Spread Syntax Work with Primitives and Functions?为什么使用扩展语法适用于基元和函数? 【发布时间】:2020-12-23 08:48:05 【问题描述】:

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

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?

【问题讨论】:

我希望这足以消除您的困惑ecma-international.org/ecma-262/11.0/… 它适用于布尔值和函数对我来说没问题,但我不明白为什么它不会抛出 nullundefined...***.com/questions/47155141/… 【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于为啥使用扩展语法适用于基元和函数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用扩展语法复制对象后 getter/setter 不再工作?

为啥我的扩展语法在节点 v7.0.0 中不起作用?

为啥扩展语法会将我的字符串转换为数组?

vue中使用.扩展符为啥会报unexpected token的语法错误

为啥在我的 Postgres 函数中使用 IF 语句时出现语法错误?

为啥 erlang spawn 函数调用中出现语法错误 - “之前的语法错误:')'”?