what are the practical benefits of allowing duplicate property-names in the initializers
There are no practical benefits as such. Now that there are computed property keys in ECMA Script 6, the actual value of the keys will be determined only at the runtime. As it is, keys can be added to objects at runtime and they overwrite the existing key and value. The same behavior is extended in ES-6 and the restriction of not allowing compile time duplicate keys check is removed.
Quoting Allen Wirfs-Brock from the discussion in ESDiscuss Mailing list,
The plan has been that runtime validation would be performed for any object literals containing computed property keys and the current spec. draft contains pseudo code for doing the checks. However a bug report (https://bugs.ecmascript.org/show_bug.cgi?id=1863 ) points out an issue with the current spec. For example, the current spec. throws an error on:
({get a() {},
get ["a"]() {}
});
but not on:
({get ["a"]() {},
get a() {}
});
Basically, it isn't sufficient to only check for an already defined property key when processing property definitions that contains a computed key. If any computed keys exist the checking has to be done even for the definitions that have literal property names. And it isn't sufficient to just consider the property keys and the data/accessor property distinction, the validation also has to take into account the syntactic form of the definition and whether or not strict mode applies..
It turns out that even in pseudo code, this is a fairly complicated set of runtime validation rules to apply. I'm having a hard time convincing myself that the runtime computational and meta data costs of this dynamic validation is justified. It costs too much and the actual benefit is pretty small.
For that reason, I propose that we drop this runtime validation of object literals (and class definition). We would still have the static validation and early errors for property definitions that don't have computed keys. But anything that makes it past those checks (including all property definitions with computed names) are just processed sequentially with no duplicate name checking.
So, the proposal was to retain the compile time check for normal keys and as per this comment the check was dropped later. In Revision 26,
Eliminated duplicate property name restrictions on object literals and class definitions
Uncaught SyntaxError: Duplicate data property in object literal not allowed in strict mode
but is not caught bytry..catch
– Schadetrue
for me on chromium v42 / firefox 37, it might require the "Experimental JavaScript features" flag to get the equivalent behaviour on v40? – Gileadite[..]
. Seems like a backward step to me, or they got it wrong. will be interesting to see what answers present themselves. – Schade