【问题标题】:Why does JavaScript's spread syntax allow {...null} but not [...null]? [duplicate]为什么 JavaScript 的扩展语法允许 {...null} 而不允许 [...null]? [复制]
【发布时间】:2020-11-03 04:54:24
【问题描述】:

今天更新了一些代码,将可选的 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

我做了一些简单的谷歌搜索和found one article,这表明 TypeScript 认为这是一个确保可选定义的值不会困扰毫无戒心的开发人员的功能。很好,但是 a) 我没有使用 TypeScript,并且 b) 我不知道为什么 JS 不会以同样的方式保护数组。

既然这似乎是对可选定义值的一种保护,为什么{...null} 可以,而[...null] 不行?

【问题讨论】:

标签: javascript spread-syntax


【解决方案1】:

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

null 不是可迭代。它没有组件,因此迭代null 是没有意义的。 for (const e of null) 同样会失败,因为of 也需要一个iterable

但是,{...x} 要求 x可枚举的,因为它不仅需要值,还需要键。

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

【讨论】:

  • 是的,我想我被看似超载的 ... 运算符误导了,我发现的后续文章没有​​帮助,将其声明为“功能”,使使用 Array 看起来像监督。
  • null 不是一个对象。它没有属性(甚至没有一个空的属性列表)。试试Object.getOwnPropertyDescriptors(null)
  • @Felix King,好的,我调整了措辞。
【解决方案2】:

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

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

【讨论】:

  • 那为什么要和undefined一起工作呢? {...undefined} 也产生一个空对象,afaik typeof undefined == 'undefined'
  • 所以真正的问题是... 在上下文中是不同的。也许这篇文章有误导性,它不是一个特殊功能,只是 JS 是 JS
猜你喜欢
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2011-01-12
  • 2010-11-01
  • 2018-04-02
相关资源
最近更新 更多