【问题标题】:JS: two or more object properties with the same name in non-strict mode?JS:非严格模式下具有相同名称的两个或多个对象属性?
【发布时间】:2016-07-19 05:18:57
【问题描述】:

阅读 David Flanagan 的权威指南(第 6 版),偶然发现:

在严格模式下,定义对象字面量是语法错误 具有相同名称的两个或多个属性。 (在非严格模式下,没有错误 发生。)

我找不到任何示例 - 有可能吗?我试过了

var obj = {prop: 'foo', prop: 'bar'};

...当然我最终只有一个属性 (Object {prop: "bar"}),在严格和非严格模式下。

这是否依赖于实现?这本书是 2011 年版,里面有 ECMAScript 5。

我应该读一本新书吗?

【问题讨论】:

  • 呃,这很奇怪。根据 ES5 规范,这绝对是严格的模式限制之一:es5.github.io/#Ces5.github.io/#x11.1.5。我正在检查 ES6 是否现在解除了它(可能是计算属性)。
  • 没有错误发生意味着没有语法错误。一个对象不能有多个同名的属性。
  • @thangngoc89 两种模式都没有语法错误。任何想法为什么?

标签: javascript theory


【解决方案1】:

这本书是对的; ES5 规范指出,在一个对象字面量中定义多个同名的属性是一种语法错误。

在此处查看section 11.1.5

如果previous不是未定义的,那么如果以下任一条件为真,则抛出SyntaxError异常

以及内容丰富的Annex C

如果严格模式代码包含具有多个任何数据属性定义的 ObjectLiteral (11.1.5),则会出现 SyntaxError。

您正在测试的实现也是正确的,但是,因为当前的 ECMAScript 规范是 ES2015,它取消了这个限制!它没有在其Annex C 或其他任何地方列出。

如果我不得不猜测,这将是删除的原因是与计算属性的一致性,所以这些文字总是等价的:

({ a: 1, ['a']: 2 })
({ a: 1, a: 2 })

但是,是的,每个人都是对的。 \o/

【讨论】:

  • 是的,IIRC,计算属性是原因,尽管 imo 是一个可怕的原因。
  • 谢谢 - 这里有这么多好信息,我一无所知。好东西我问了。
  • 当您的属性使用相同的名称时,第二个属性将覆盖第一个。 (ECMAScript 2015)
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多