在JavaScript中,为什么任何值都可以散布在对象中,而不能散布在数组中?

In JavaScript, why can any value be spread in an object, but not in an array?

在对象中传播任何 "empty" 值是有效的(不会抛出错误,而是变成一种无操作):

{
  ...undefined,
  ...null,
  ...false,
  ...true,
  ...'',
  ...{},
  ...[],
  ...Symbol(),
  ...() => {},
} // evaluates to {}

但是在数组中做同样的事情会抛出除 ''[] 之外的所有上述值的错误。错误消息说不起作用的值是不可迭代的,但是,它们显然 可迭代的,因为它们可以传播到一个对象中。诚然,从直觉上讲,字符串、数组和对象在散布到对象中时可以转换为 entries/key-value 对,在散布到数组中时转换为值,但即便如此,为什么所有这些的条目值是可迭代的但值不是?如果条目是可迭代的,那么值不应该也是如此吗?这只是不同 JavaScript 引擎的怪癖吗?这是怎么回事?

object literals the spread operator copies own enumerable properties 从提供的对象到新对象。因此,在您的示例中,向传播运算符提供的 "entities" 的 none 具有任何可枚举的属性。

对于数组,扩展语法仅适用于 iterable objects

或实现 iterator protocol 的对象 ... 含义:

The object (or one of the objects up its prototype chain) must have a property with a @@iterator key which is available via constant Symbol.iterator

这样做的核心对象是: