传播功能是啥意思。 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
。它有自己的属性,如name
、call
、apply
等。
执行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中的普通函数是不是可迭代的主要内容,如果未能解决你的问题,请参考以下文章
java 类中的建构函式和解构函式名都是啥,java需要手动释放资源吗?