2010-05-05 9 views
7

In Firefox-Konsole, wird dieser Code generieren Fehler:JavaScript Objektliteral Notation Verwirrung

{"d" : ["bankaccountnumber", "$1234.56"] } 
> SyntaxError: invalid label { 
> message="invalid label", more...} 

dieser Code funktioniert gut

{d : ["bankaccountnumber", "$1234.56"] } 
> ["bankaccountnumber", "$1234.56"] 

dieser Code funktioniert auch

var a = {'d' : ["bankaccountnumber", "$1234.56"] }; 
a.d 
> ["bankaccountnumber", "$1234.56"] 

Kann jemand helfen zu erklären, warum der Unterschied ist? Vielen Dank!

+1

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 ist eine scheinbar irrelevante Frage, aber mit einer relevanten Antwort auf eine Sache können Sie auf –

Antwort

6

Dies ist wegen der mehrdeutigen Syntax. Wenn Sie versuchen, ein einfaches Objektliteral in den ersten beiden Zeilen zu machen, JavaScript wirklich ist es als eine Reihe von Klammern zu interpretieren, dann ein Etikett, dann eine Aussage:

{ 
    d: ["bankaccountnumber", "$1234.56"] 
} 

Dieser Code wertet nicht auf ein Objekt , aber nur zum Array. Im ersten Beispiel haben Sie versucht, eine Zeichenfolge als Bezeichnung zu verwenden, was eine falsche Syntax ist. Das dritte Beispiel funktioniert ordnungsgemäß, indem ein Objekt erstellt und in a gespeichert wird.

+4

+1 @OP stolpern : Damit es ein Ausdruck (ein Objektliteral) anstelle einer Klammer um ein Label gefolgt von einem Arrayliteral ist, müssen Sie es als rechten Wert verwenden (wie in Ihrem letzten Beispiel). Als rechte Werte wären alle drei gültige Objektliteralnotation (die mit 'd:', die mit '" d ":' und die mit '' d ': '). Etwas OT, aber nur das "d": "wäre ein gültiger JSON, wenn das für das, was Sie tun, relevant ist, weil JSON eine * Teilmenge * der Objektliteralnotation ist. (http://json.org) –

+0

Warum, oh warum, haben sie GOTOs in Javascript eingefügt ... * seufz * –

+1

@Bears: Sie haben nicht, Javascript hat keine 'goto' Aussagen. Es hat Etiketten, die nützlich sind, um innere Schleifen aufzubrechen und so weiter. (Siehe Abschnitt 12.12 der 5. Ausgabe-Spezifikation. In früheren Spezifikationen war "Goto" ein reserviertes Symbol, aber es gab keine "Goto" -Aussage - z. B. wetteten sie ihre Wetten. Ab der 5. Ausgabe kein Hedging mehr.) –

4

es ist wahrscheinlich schwer zu entscheiden, ob es sich um einen Ausdruck oder einen Block handelt. Wenn Sie Klammern um das Objekt herum verwenden, funktioniert es so, wie es einen Ausdruck erzwingt. Der Gruppierungsoperator ( und ) zwingt { und }, als Objektliteral analysiert zu werden.

({"d" : ["bankaccountnumber", "$1234.56"] }) // works 

Named function expressions demystified lesen. Es bezieht sich nicht direkt auf dieses Problem, spricht es aber an, wenn es um die Verwendung von Gruppierungsklammer und eval() geht.