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

JS: two or more object properties with the same name in non-strict mode?

本文关键字:属性 对象 模式 两个 JS      更新时间:2023-10-20

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

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

我找不到任何例子——这可能吗?我试过

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

但当然,我最终只得到了一个性质(Object {prop: "bar"}),无论是严格模式还是非严格模式。

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

我应该读一本新书吗?

这本书是对的;ES5规范指出,在对象文字中定义具有相同名称的多个属性是语法错误。

参见第11.1.5节:

如果先前未定义,则如果以下任何条件为真,则抛出SyntaxError异常

以及资料性附录C:

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

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

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

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

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