首页 > 解决方案 > 在 JavaScript 中,为什么任何值都可以散布在对象中,而不能散布在数组中?

问题描述

在对象中传播任何“空”值都是有效的(不会引发错误,而是成为一种无操作):

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

但是在数组中执行相同操作会引发除''和之外的所有上述值的错误[]。错误消息说不起作用的值是不可迭代的,但是,它们显然可迭代的,因为它们可以传播到一个对象中。诚然,从直觉上讲,字符串、数组和对象在传播到对象时可以转换为条目/键值对,在传播到数组中时可以转换为值,但即便如此,为什么所有这些的条目值是可迭代的,但值不是?如果条目是可迭代的,那么值不应该也是如此吗?这只是不同 JavaScript 引擎的怪癖吗?这里发生了什么?

标签: javascriptiteratoriterablespread-syntax

解决方案


对象字面量中,将提供的对象中的spread operator 可枚举属性复制到新对象上。因此,在您的示例中,为展开运算符提供的“实体”都没有任何可枚举的属性。

对于数组,展开语法仅适用于可迭代对象

或实现迭代器协议的对象......含义:

对象(或其原型链上的对象之一)必须具有带有 @@iterator 键的属性,该键可通过常量 Symbol.iterator 获得

这样做的核心对象是:


推荐阅读