开发者问题收集

为什么 JavaScript 的扩展语法允许 {...null} 但不允许 [...]?[重复]

2020-07-13
15920

今天更新了一些代码,该代码将可选的 props 返回给 React 组件。我发现,即使该函数有时返回 null ,当返回值立即解包时也不会出错。

代码的详尽摘要:

const returnPropsOrDont = (condition) => {
  if (condition) return null;
  return { optionalProp: 'foo' };
}
...
render() {
  const { condition } = props;
  return <SomeComponent
           staticProp="staticProp"
           {...returnPropsOrDont(condition)}
         />
}

意识到这很酷后,我跑到控制台并在对象和数组上尝试了它。唉 -

> {...null} // {}
   > {...undefined} // {}, which is interesting because null is an object but undefined is not
   > [...null] // Uncaught TypeError: object null is not iterable

我进行了一些简单的 Google 搜索, 找到了一篇文章 ,其中提到 TypeScript 认为这是一个功能,以确保可选定义的值不会困扰毫无戒心的开发人员。很好,但是 a) 我没有使用 TypeScript,并且 b) 我不知道为什么 JS 不以同样的方式保护数组。

既然这看起来像是对可选定义值的保护,为什么 {...null 没问题而 [...null] 不可以?

2个回答

通常,使用 ...x 要求 x 可迭代 的,因为 ... 的目的通常是将可迭代对象展平为其组件。数组是可迭代对象的典型示例。

null 不是 可迭代 的。它没有组件,因此对 null 进行迭代是没有意义的。 for (const e of null) 也会失败,因为 of 也要求 可迭代 的。

但是, {...x 要求 x 可枚举 的,因为它不仅需要值,还需要键。对象是可枚举对象的典型示例。

null 可枚举 的。 null 有时被视为对象,这就是其中一种情况。对象是可枚举的,因为它们可以具有属性。 for (const p in null) 类似地会成功,因为 in 需要 可枚举

ikegami
2020-07-13

[…null] - 在这里您使用 spear 运算符,它仅适用于可迭代对象(如字符串、数组、生成器或自定义可迭代对象),但 null 不是可迭代对象,将收到错误。您可以通过添加特殊属性 Symbol 来创建自己的可迭代对象。迭代器

{...null} - 有效,因为 typeof null == 'object' ,但在现实生活中它没有意义

Slawa Eremin
2020-07-13