2010-09-17 4 views
15

Ce qui suit montrera à Firebug ou jsconsole.com ou dans une autre console interactive Javascript:Quel est le comportement de taper {a: 1} donnant 1, et {a: 1, b: 2} donnant une erreur dans une console Javascript?

>>> 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 

pourquoi le 1 pour {a : 1} et retournaient pourquoi est {a : 1, b : 2.2} sortir une erreur? En Ruby, ils reviendraient de la même façon que vous l'avez défini.

+1

Ceci est une grande question suivie d'une réponse formidable! Évidemment, je parle de la réponse de CMS. –

+0

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 est une question apparemment non pertinente, mais avec une réponse pertinente à une chose que vous pourriez trébucher sur. –

Répondre

24

La deuxième ligne vous donne un SyntaxError parce que le jeton { au début de celui-ci provoque une ambiguïté, l'analyseur traite comme si elle était un Block statement, pas le début d'un littéral d'objet.

Par exemple, une instruction de bloc valide:

{ foo: 'bar' } 

Le ci-dessus ressemble comme un objet littéral, mais ce n'est pas, parce que le code est évalué dans contexte de déclaration.

Il sera analysé comme un bloc, qui contient un labelled statement (foo), suivi d'une instruction d'expression ('bar').

Pour vous assurer que vous utilisez la grammaire d'un objet littéral, vous pouvez l'envelopper avec des parenthèses (également connu sous le nom the grouping operator):

({ foo: 'bar' }) 

L'opérateur de regroupement ne peut prendre des expressions, donc il n'y a pas d'ambiguïté .

Voir aussi:

+0

+1 J'ai appris quelque chose de nouveau aujourd'hui. Je n'ai jamais mis juste une syntaxe objet-littérale dans un REPL sans l'assigner à un var, mais c'est intéressant à savoir .. – Matt

+0

(une 'instruction label' est quelque chose que JavaScript a hérité de C, où il peut être utilisé pour 'goto Les instructions étiquetées ne sont presque jamais utilisées en JavaScript, c'est pourquoi il est surprenant que '{foo: 'bar'}' puisse être considéré comme une déclaration valide.) – bobince

+0

Une réponse totalement géniale, qui serait remise en cause deux fois si possible ! –

0

Je ne suis pas 100% positif, mais ce que je pense qui se passe est que, dans la deuxième ligne que vous définissez un bloc, pas un objet . Ainsi, l'erreur d'analyse survient lorsque l'analyseur atteint la virgule, car il attend une semi-couleur. Les étiquettes définies sont des étiquettes, comme dans une instruction goto ou switch. J'espère que cette explication a un sens.

0

console faites comme eval ('vous entrez')

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