传播功能是啥意思。 javascript中的普通函数是不是可迭代

Posted

技术标签:

【中文标题】传播功能是啥意思。 javascript中的普通函数是不是可迭代【英文标题】:What does it mean to spread a function. Are normal functions iterable in javascript传播功能是什么意思。 javascript中的普通函数是否可迭代 【发布时间】:2018-09-01 20:43:27 【问题描述】:

我正在控制台中执行类似以下代码的操作

function add(a,b)return a+b;;
const obj = ...add;

令我惊讶的是,它没有引发错误。也没有

const obj = ...123;

扩展语法应该只适用于可迭代的实体,如对象、数组、字符串、映射、集合等。 那么为什么在使用不可迭代实体时它不会抛出错误呢? 还是我在这里遗漏了什么?

【问题讨论】:

在 ES2018 规范之前的时代,你是对的。然而,随着 ES2018 的发布,spread syntax for object initializers. 【参考方案1】:

javascript 中的函数也是objects。它有自己的属性,如namecallapply 等。

执行const obj = ...add 只是获取function object可枚举 属性,将它们放入另一个对象并分配给obj。您可以通过

查看

function add(a,b)return a+b;;
add.test = 1;

const obj = ...add;

console.log('test' in obj);

123 呢,它被转换为 Number 包装器,其余的都是一样的

const obj = ...123;

console.log('valueOf' in obj);

【讨论】:

另见规范文本中的 CopyDataProperties:tc39.github.io/ecma262/2018/#sec-copydataproperties ...source 中的源对象在展开操作开始时转换为对象。 @surenSrapyan 这不是一个很好的例子。 console.log('valueOf' in obj);在任何情况下都会返回 true,因为每个对象都已经拥有它。至于函数 add() 之类的代码;常量 obj = ...添加; console.log('call' in obj) 将返回 false,即使它存在于原型链中。使用上面的扩展运算符仅对自己的属性进行迭代。 iterable 这个词有点误导,因为它暗示所有对象都是可迭代的,但它们不是。对象传播适用于 enumerable 属性 @CodingIntrigue 已更新。谢谢【参考方案2】:

您所拥有的是用于对象文字的spread syntax ...(并非所有user agents 都支持)。

在对象字面量中传播

Rest/Spread Properties for ECMAScript 提案(第 4 阶段)将传播属性添加到 object literals。它将自己的可枚举属性从提供的对象复制到新对象。

function add(a, b)  return a + b; 

const obj =  ...add ;

console.log(obj); // no properties because no own enumerable properties

【讨论】:

同样说明:如果插入add.foo = "bar",很容易看到obj 打印为foo: "bar"。默认情况下,函数没有可迭代的道具。 我不认为这是正确的。如果你做 ``` function add(a, b) return a + b; 常量 obj = ...添加 ; console.log('call' in obj) ``` 它返回 false,你的逻辑应该是 true @Amadan 解释了它。如果您执行 console.log('call' in obj),您提供的 sn-p 将不起作用,尽管它在函数原型链中可用。默认函数没有可迭代的道具。 我已经改变了答案。 @Amadan 你能解释一下像 const obj = ...123 这样的情况吗

以上是关于传播功能是啥意思。 javascript中的普通函数是不是可迭代的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的双括号是啥意思以及如何访问它们

java 类中的建构函式和解构函式名都是啥,java需要手动释放资源吗?

switch是啥意思

不传播的原因是啥(es 6传播运算符)javascript错误对象[重复]

STD是啥意思

Javascript 中的“”是啥意思? [关闭]