阅读David Flanagan的权威指南(第6版),偶然发现了这一点:
在严格模式下,要定义的对象文字是语法错误 两个或多个属性相同的名称。 (在非严格模式下,没有错误 发生。)
我找不到任何例子 - 它甚至可能吗?我试过了
var obj = {prop: 'foo', prop: 'bar'};
...但当然我在严格和非严格模式下只有一个属性(Object {prop: "bar"}
)。
这是依赖于实现的吗?这本书是2011年版,ECMAScript 5就在那里。
我应该读一本新书吗?
答案 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 /