2016-03-30 3 views
2

Lese David Flanagans Definitive Guide (6. Auflage), stolperte auf diesem:JS: zwei oder mehr Objekteigenschaften mit demselben Namen im nicht strikten Modus?

In Strict-Modus ist es ein Syntaxfehler für eine Objektliteral zwei oder mehr Eigenschaften mit dem gleichen Namen zu definieren. (Im nicht strikten Modus tritt kein Fehler auf.)

Ich kann keine Beispiele finden - ist das überhaupt möglich? Ich habe versucht,

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

... aber natürlich habe ich mit nur einem Objekt am Ende (Object {prop: "bar"}), in den beiden streng und nicht-strengen Modi.

Ist diese Implementierung abhängig? Das Buch ist eine Ausgabe 2011, ECMAScript 5 ist da drin.

Sollte ich ein neueres Buch lesen?

+1

Huh, das ist seltsam. Es ist definitiv eine der strengen Modusbeschränkungen gemäß der ES5-Spezifikation: https://es5.github.io/#C und https://es5.github.io/#x11.1.5. Ich überprüfe, ob ES6 es jetzt aufgehoben hat (vielleicht für berechnete Eigenschaften). – Ryan

+0

kein Fehler auftritt, bedeutet kein Syntaxfehler. Ein Objekt kann nicht mehrere Eigenschaften mit demselben Namen haben. – thangngoc89

+0

@ thangngoc89 In beiden Modi tritt kein Syntaxfehler auf. Irgendwelche Ideen warum? – montrealist

Antwort

2

Das Buch ist richtig; Die ES5-Spezifikation besagt, dass das Definieren mehrerer Eigenschaften mit demselben Namen in einem Objektliteral ein Syntaxfehler ist.

Siehe section 11.1.5 hier:

Wenn vorherige nicht undefiniert ist dann eine Syntax Ausnahme auslösen, wenn eine der folgenden Bedingungen erfüllt sind

und die informativen Annex C:

Es ist ein SyntaxError, wenn der strikte Moduscode ein ObjectLiteral mit mehr als einer Definition einer Dateneigenschaft enthält (11.1.5).

Die Implementierungen Sie testen sind auch richtig, aber, wie die aktuelle ECMAScript-Spezifikation ES2015 ist, die diese Einschränkung fällt! Es ist nicht in seiner Annex C oder anderswo aufgeführt.

Wenn ich raten müsste, würde es sein, dass der Grund für diese Entfernung war die Übereinstimmung mit berechneten Eigenschaften, so würden diese Literale immer gleichwertig sein:

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

Aber ja, jeder hat Recht. \ o/

+0

Ja, IIRC, berechnete Eigenschaften waren der Grund, obwohl sie ein schrecklicher Grund sind imo. – Bergi

+0

Danke - so viele gute Infos hier hatte ich keine Ahnung. Gut, dass ich gefragt habe. – montrealist

Verwandte Themen