【问题标题】:What's the purpose of allowing duplicate property names?允许重复的属性名称的目的是什么?
【发布时间】:2015-08-17 11:43:37
【问题描述】:

我正在阅读MDN javascript reference,因此以下代码不再返回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 已删除 这个限制。

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

【问题讨论】:

  • 在铬 v40 Uncaught SyntaxError: Duplicate data property in object literal not allowed in strict mode 上为我抛出错误,但未被 try..catch 捕获
  • 它在 chromium v​​42 / firefox 37 上为我返回 true,它可能需要“实验性 JavaScript 功能”标志才能在 v40 上获得等效行为?
  • 您想在 ES6(实验性)还是在 ES5 中执行脚本? Chromium v​​42 和 firefox 37 现在是否在 ES6 模式下运行标准?
  • 是的,我相信是后者。 kangax.github.io/compat-table/es6
  • 好的。我会假设在 ES6 中,只有在计算属性名称时才会取消重复限制,即在 [..] 中。对我来说似乎是一个倒退,或者他们弄错了。看看自己会给出什么样的答案会很有趣。

标签: javascript standards ecmascript-6


【解决方案1】:

在初始化器中允许重复的属性名有什么实际好处

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

discussion in ESDiscuss Mailing list 引用 Allen Wirfs-Brock,

计划是对包含计算属性键和当前规范的任何对象文字执行运行时验证。草稿包含进行检查的伪代码。然而,错误报告 (https://bugs.ecmascript.org/show_bug.cgi?id=1863) 指出了当前规范存在的问题。例如,当前的规范。引发错误:

({get a() {},
   get ["a"]() {}
 });

但不在:

({get ["a"]() {},
   get a() {}
 });

基本上,在处理包含计算键的属性定义时,仅检查已定义的属性键是不够的。如果存在任何计算键,则即使对于具有文字属性名称的定义也必须进行检查。仅考虑属性键和数据/访问器属性的区别是不够的,验证还必须考虑定义的句法形式以及是否适用严格模式..

事实证明,即使在伪代码中,这也是一组相当复杂的运行时验证规则。我很难说服自己这种动态验证的运行时计算和元数据成本是合理的。成本太高,实际收益微乎其微。

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

因此,建议保留对普通键的编译时检查,as per this comment 后来取消了检查。在Revision 26

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

【讨论】:

  • 所以你认为编写编译时检查代码太难了,难以维护 ES5 中定义的“严格”规则,而且更容易让“严格”不那么“严格”以符合 ES6计算的属性键。还是在当前的 ES6 规范中确实写了必须删除,我在规范中找不到答案?
  • @Xotic750 提到在Annex E - In ECMAScript 2015, it is no longer an early error to have duplicate property names in Object Initializers.
  • 好的,谢谢你指点我参考。对我来说,删除这样一个早期错误似乎很奇怪。除了可能的编码困难之外,我不明白其背后的原因。
  • 虽然添加了键(这将具有明确的优先级),但使用两个相同的键 {prop: 1, prop:2} 进行初始化(至少我认为优先级有点令人惊讶)。无论如何,它们是否不确定在运行时是相同的?我不确定为什么您提供的参考资料也没有提到严格模式?
  • @user3467349 对象文字中的键将从左到右处理。并且该参考文献没有提及任何有关严格模式的内容,因为无论模式如何,此检查都不会存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2016-04-02
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多