【问题标题】:Javascript ES6 spread operator on undefined [duplicate]未定义的Javascript ES6扩展运算符[重复]
【发布时间】:2021-05-21 06:34:11
【问题描述】:

在开发我的 react 应用程序时,我需要向组件发送一个条件 prop,因此我在某处找到了这样做的模式,尽管这对我来说似乎很奇怪,而且我不明白它是如何以及为什么工作的。

如果我输入:

console.log(...undefined)   // Error 
console.log([...undefined]) // Error
console.log({...undefined}) // Work

当在 undefined 上激活扩展运算符时,会引发错误,尽管当 undefined 在对象内部时,会返回一个空对象。

我对这种行为感到非常惊讶,它真的应该是这样吗,我可以依赖它吗?这是一个好习惯吗?

【问题讨论】:

  • 我认为任何依赖迭代器的东西都会抛出nullundefined,因为没有办法在这些值上实现所需的方法。我不知道为什么对象传播语法有效。
  • 想一想,我想对象字面量传播语法不会失败是有道理的,因为它传播的通常是另一个普通对象,并且默认情况下它们不是迭代器,所以它们在这种情况下几乎必须破例。
  • {...undefined} 这甚至不能用 Babel 编译,所以我不会使用。
  • 实际上废弃了,它需要 stage-0 所以我假设不是 ES6 .. 这个传播特性会是 ES7 吗?

标签: javascript ecmascript-6 javascript-objects spread-syntax


【解决方案1】:

此行为对于执行可选传播之类的操作很有用:

function foo(options) {
  const bar = {
    baz: 1, 
    ...(options && options.bar) // options and bar can be undefined
  } 
}

使用optional chaining 会变得更好,它现在在Stage 4 中(并且已经在available in TypeScript 3.7+):

function foo(options) {
  const bar = {
    baz: 1, 
    ...options?.bar //options and bar can be undefined
  } 
}

一个想法:太糟糕了,它也不适用于传播到数组中

【讨论】:

  • 是可选传播...options || {}的唯一解决方案?
  • 您可以像这样对数组进行可选的扩展:[...(options?.bar ? [options.bar] : [])]。没有对象那么优雅,但效果很好。
  • 也可以使用的数组的简写是[...(options?.bar || [])]
猜你喜欢
  • 2019-06-15
  • 2020-04-13
  • 2016-02-26
  • 2018-04-21
相关资源
最近更新 更多