Was ist das Verhalten der Eingabe {a: 1} geben 1 und {a: 1, b: 2} einen Fehler in einer Javascript-Konsole geben?

StackOverflow https://stackoverflow.com/questions/3731802

Frage

Im Folgenden wird in Firebug zeigen oder in jsconsole.com oder in anderen Javascript interaktive Konsole:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

, warum die 1 für {a : 1} Rückkehr und warum {a : 1, b : 2.2} einen Fehler geben? In Ruby, würden sie die gleiche Art und Weise kommen, wie ihr es definiert ist.

War es hilfreich?

Lösung

Die zweite Zeile gibt Ihnen eine SyntaxError weil die { am Anfang es eine Mehrdeutigkeit Token verursacht, der Parser behandelt, als ob es ein waren Block-Anweisung , nicht der Beginn eines Objektliteral.

Zum Beispiel eine gültige Blockanweisung:

{ foo: 'bar' }

Das oben gezeigt Aussehen wie ein Objektliteral, aber es ist nicht, weil der Code in ausgewertet Aussage Kontext .

Es wird als Baustein analysiert werden, die eine benannte Anweisung (foo), gefolgt von einer Ausdrucksanweisung ('bar').

Um sicherzustellen, dass Sie die Grammatik eines Objektliteral verwenden, können Sie es mit Klammern wickeln (auch als die Gruppierung Operator ):

({ foo: 'bar' })

Die Gruppierung Operator kann nur Ausdrücke nehmen, daher gibt es keine Zweideutigkeit.

Siehe auch:

Andere Tipps

Ich bin nicht 100% positiv, aber was ich denke, ist passiert, dass in der zweiten Zeile einen Block ist definiert, kein Objekt. So ist der Parse-Fehler kommt, wenn der Parser das Komma erreicht, da es eine Halb Farbe erwartet. Die Etiketten defniert sind Etiketten, wie in einem goto oder switch-Anweisung. Ich hoffe, diese Erklärung Sinn macht.

Konsole tun, wie eval ( 'Eingabe')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top