为什么 JavaScript 的扩展语法允许 {...null} 但不允许 [...]?[重复]
今天更新了一些代码,该代码将可选的 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]
不可以?
通常,使用
...x
要求
x
是
可迭代
的,因为
...
的目的通常是将可迭代对象展平为其组件。数组是可迭代对象的典型示例。
null
不是
可迭代
的。它没有组件,因此对
null
进行迭代是没有意义的。
for (const e of null)
也会失败,因为
of
也要求
可迭代
的。
但是,
{...x
要求
x
是
可枚举
的,因为它不仅需要值,还需要键。对象是可枚举对象的典型示例。
null
是
可枚举
的。
null
有时被视为对象,这就是其中一种情况。对象是可枚举的,因为它们可以具有属性。
for (const p in null)
类似地会成功,因为
in
需要
可枚举
。
[…null] - 在这里您使用 spear 运算符,它仅适用于可迭代对象(如字符串、数组、生成器或自定义可迭代对象),但 null 不是可迭代对象,将收到错误。您可以通过添加特殊属性 Symbol 来创建自己的可迭代对象。迭代器
{...null} - 有效,因为
typeof null == 'object'
,但在现实生活中它没有意义