2010-09-17 6 views
15

Die folgende in Firebug oder in jsconsole.com oder in anderen Javascript interaktive Konsole zeigen:Wie lautet das Verhalten bei der Eingabe von {a: 1} für 1 und {a: 1, b: 2} für einen Fehler in einer Javascript-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 genau so zurückkommen, wie du es definiert hast.

+1

durch eine hervorragende Antwort folgte Dies ist eine große Frage! Offensichtlich rede ich über die Antwort von CMS. –

+0

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

Antwort

24

Die zweite Zeile gibt Ihnen ein SyntaxError weil die { Token am Anfang es eine Mehrdeutigkeit verursacht, der Parser es behandelt, als ob es eine Block statement war, nicht der Beginn eines wörtlichen Objekts.

Zum Beispiel eine gültige Blockanweisung:

{ foo: 'bar' } 

Die obige sieht wie ein Objektliteral, aber es ist nicht, weil der Code in Anweisung Kontext ausgewertet wird.

Es wird als Block geparst, der eine labelled statement (foo) enthält, gefolgt von einer Ausdrucksanweisung ('bar').

Um sicherzustellen, dass Sie die Grammatik eines Objektliteral verwenden, können Sie es mit Klammern wickeln (auch als the grouping operator bekannt):

({ foo: 'bar' }) 

Der Betreiber Gruppierung kann nur Ausdrücke nehmen, deshalb gibt es keine Zweideutigkeit .

Siehe auch:

+0

+1 Ich habe heute etwas Neues gelernt. Ich habe niemals nur eine objektliterale Syntax in eine REPL gesetzt, ohne sie einer var zuzuordnen, aber das ist interessant zu wissen. – Matt

+0

(eine 'markierte Anweisung' ist etwas, das JavaScript von C geerbt hat, wo es für 'goto verwendet werden kann 'Labeled Statements werden fast nie in JavaScript verwendet, weshalb es eine Überraschung ist, dass '{foo:' bar '}' als gültige Aussage genommen werden kann.) – bobince

+0

Total tolle Antwort, würde zweimal upvote wenn möglich ! –

0

Ich bin nicht 100% positiv, aber was ich denke, ist passiert, dass in der zweiten Zeile sind ein Block definiert, kein Objekt . Daher kommt der Parse-Fehler, wenn der Parser das Komma erreicht, da er eine Semifarbe erwartet. Die angegebenen Labels sind Labels, wie in einer goto oder switch Anweisung. Ich hoffe, dass diese Erklärung einen Sinn ergibt.

0

Konsole tun, wie eval (‚Eingabe‘)

eval({....}) --- this will get an error 
eval('({....})')---eval string as a function