Javascript 什么';允许重复属性名称的目的是什么?

Javascript 什么';允许重复属性名称的目的是什么?,javascript,standards,ecmascript-6,Javascript,Standards,Ecmascript 6,我正在阅读,因此以下代码不再返回false: function haveES6DuplicatePropertySemantics(){ "use strict"; try { ({ prop: 1, prop: 2 }); // No error thrown, duplicate property names allowed in strict mode return true; } catch (e) { // Error thrown, du

我正在阅读,因此以下代码不再返回
false

function haveES6DuplicatePropertySemantics(){
  "use strict";
  try {
    ({ prop: 1, prop: 2 });

    // No error thrown, duplicate property names allowed in strict mode
    return true;
  } catch (e) {
    // Error thrown, duplicates prohibited in strict mode
    return false;
  }
}
在ECMAScript 5严格模式代码中,出现了重复的属性名称 被认为是通税犯。随着计算属性的引入 ECMAScript 6删除了使运行时复制成为可能的名称 这一限制

我的问题是,允许在初始值设定项中使用重复的财产名称有什么实际好处?我可以看到,当动态分配对象属性时,有时可能会发生这种情况,但由于优先级顺序显然决定了在新创建的对象上实际设置了哪些属性,因此这似乎比最好避免的不确定行为更为重要

在初始值设定项中允许重复属性名称的实际好处是什么

这样做没有实际好处。现在ECMA脚本6中有了计算属性键,这些键的实际值将仅在运行时确定。实际上,可以在运行时将键添加到对象中,它们会覆盖现有的键和值。ES-6中扩展了相同的行为,并且取消了不允许编译时重复键检查的限制

引用艾伦·维尔夫斯·布罗克的话

计划是对包含计算属性键和当前规范的任何对象文本执行运行时验证。草案包含用于执行检查的伪代码。但是,错误报告()指出了当前规范的一个问题。例如,当前规范在以下方面抛出错误:

({get a() {},
   get ["a"]() {}
 });
但不是关于:

({get ["a"]() {},
   get a() {}
 });
基本上,在处理包含计算键的属性定义时,仅检查已定义的属性键是不够的。如果存在任何计算键,则即使对于具有文字属性名称的定义,也必须进行检查。仅仅考虑属性键和数据/访问器属性的区别是不够的,验证还必须考虑定义的语法形式以及严格模式是否适用>/P> 事实证明,即使在伪代码中,这也是一组相当复杂的运行时验证规则。我很难说服自己,这种动态验证的运行时计算和元数据成本是合理的。它的成本太高,而实际收益却相当小

出于这个原因,我建议我们放弃对对象文本(和类定义)的运行时验证。对于没有计算键的属性定义,我们仍然会有静态验证和早期错误。但任何通过这些检查的内容(包括所有具有计算名称的属性定义)都将按顺序进行处理,而不进行重复的名称检查。

因此,建议保留对普通键的编译时检查,并在稍后取消检查。在,

消除了对对象文字和类定义的重复属性名限制


在chromium v40上为我抛出一个错误
Uncaught SyntaxError:object literal中的重复数据属性在严格模式下不允许
,但在chromium v42/firefox 37上不被捕获。
try..catch
返回
true
,可能需要“实验性JavaScript功能”标记以获得v40上的等效行为?您希望在ES6(实验)或ES5中执行脚本吗?chromium v42和firefox 37现在是否在ES6模式下运行标准版?是的,我相信后者是这样。好啊在ES6中,我假设只有在计算属性名称时,即在
[…]
中,才会取消复制限制。对我来说似乎是倒退,或者他们搞错了。看看答案是什么会很有趣。因此,您认为编写编译时检查代码太难了,无法维护ES5中定义的“严格”规则,只需将“严格”改为“不严格”以符合ES6计算属性键就更容易了。或者它实际上是在当前的ES6规范中写的,必须删除它,我在规范中找不到答案?@Xotic750它在ECMAScript 2015的-
中提到过,在对象初始值设定项中有重复的属性名称不再是早期的错误。
好的,谢谢你给我指参考。对我来说,消除这么早的错误似乎很奇怪。除了可能的编码困难之外,我不理解它背后的原因。虽然添加了键(这将具有明确的优先级),但使用两个相同的键初始化
{prop:1,prop:2}
(至少我认为优先级有点令人惊讶)。它们在运行时是否不一定完全相同?我不确定为什么您提供的引用也没有提到严格模式?@user3467349对象文本中的键将从左到右处理。参考文献中没有提到任何关于严格模式的内容,因为不管是什么模式,这个检查都不会出现。