JS:在非严格模式下具有相同名称的两个或多个对象属性?

时间:2016-03-30 23:49:55

标签: javascript theory

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

  

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

我找不到任何例子 - 它甚至可能吗?我试过了

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

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

这是依赖于实现的吗?这本书是2011年版,ECMAScript 5就在那里。

我应该读一本新书吗?

1 个答案:

答案 0 :(得分:2)

这本书是对的; 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 /