在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
这样做的核心对象是:
在对象中传播任何 "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
这样做的核心对象是: