【问题标题】: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};

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

【问题讨论】:

标签: javascript ecmascript-6 spread-syntax


【解决方案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} 这样的情况吗
猜你喜欢
  • 1970-01-01
  • 2013-07-11
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多