【问题标题】:Can you overwrite a property in the definition of an object literal without mutating data?您可以在不改变数据的情况下覆盖对象字面量定义中的属性吗?
【发布时间】:2017-08-29 01:38:52
【问题描述】:

在关于不可变更新模式的 redux 文档中,我注意到他们说您可以通过使用扩展运算符然后覆盖属性来更新对象。

对象扩展运算符有什么特别之处吗?如果不是,那为什么你可以在不改变数据的情况下覆盖对象字面量定义中的属性(如下面的代码)?

const a = {
  foo: 'bar',
  foo: 'bla'
}

【问题讨论】:

  • 尚不清楚... 扩展语法与接受多个相似键的对象字面量语法有何关联。
  • “为什么你可以覆盖”——因为标准允许这样做。
  • 具有重复键的对象是您的 linter 应该发现的错误。 (这甚至在旧浏览器中都不起作用,他们只在 ES6 中允许这样做,因为他们不知道如何处理计算属性)。
  • "您可以使用扩展运算符更新对象" - 不!扩展语法是对象字面量的一部分,它创建一个新对象
  • @Bergi ecma-international.org/ecma-262/5.1/#sec-11.1.5 在 es2015 之前真的被禁止了吗?

标签: javascript


【解决方案1】:

在对象字面量中,我们可以使用扩展运算符 (...),它将给定对象的属性插入到对象字面量中... 所以如果你有:

const a = {
  foo: 'bar',
  test: 'test'
}

可以使用对象字面量定义中的扩展运算符创建新对象..

const b = {
   ...a, //spread operator that introduces object properties
   foo:'bla'
}

b 对象是

{ foo: 'bla', test: 'test' }

考虑到如果两个属性具有相同的名称,则顺序将定义哪个优先级实际上我们可以覆盖对象字面量中的属性定义。

如果定义是:

const b = {
   foo:'bla',
   ...a, //the spread operator is defined at the end
}

b 对象将是:

{foo: "bar", test: "test"}

参考this article

注意:这是一个 ES2018 提案,目前正在使用 chrome..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多