2010-09-17 12 views
15

La siguiente mostrará en Firebug o en jsconsole.com o en otra consola interactiva Javascript:¿Cuál es el comportamiento de tipear {a: 1} dando 1, y {a: 1, b: 2} dando un error en una consola de 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 

¿Por qué el 1 Vuelta para {a : 1} y por qué se {a : 1, b : 2.2} dando un error? En Ruby, regresarían de la misma manera que tú lo definiste.

+1

Esta es una gran pregunta seguida por una respuesta excelente! Obviamente estoy hablando de la respuesta de CMS. –

+0

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 es una pregunta aparentemente irrelevante, pero con una respuesta relevante a una cosa en la que puede estar tropezando. –

Respuesta

24

La segunda línea le está dando una SyntaxError porque el token { al comienzo de la misma causa una ambigüedad, el analizador lo trata como si fuera un Block statement, no el comienzo de un objeto literal.

Por ejemplo, una declaración válida del bloque:

{ foo: 'bar' } 

Lo anterior se ve como un objeto literal, pero no lo es, ya que el código se evalúa en el contexto comunicado.

Se analizará como un bloque, que contiene un labelled statement (foo), seguido de un enunciado de expresión ('bar').

Para asegurarse de que está utilizando la gramática de un objeto literal, se puede envolver con paréntesis (también conocidos como the grouping operator):

({ foo: 'bar' }) 

El operador agrupación sólo puede tener expresiones, por lo tanto, no hay ninguna ambigüedad .

Consulte también:

+0

+1 Aprendí algo nuevo hoy. Nunca puse solo la sintaxis literal de objeto en un REPL sin asignarlo a una var, pero esto es interesante de saber ... – Matt

+0

(una 'declaración etiquetada' es algo JavaScript heredado de C, donde se puede usar para 'goto' 'S. Las declaraciones etiquetadas casi nunca se usan en JavaScript, por lo que es una sorpresa que' {foo: 'bar'} 'pueda tomarse como una declaración válida.) – bobince

+0

Respuesta totalmente sorprendente, se podría votar dos veces si es posible ! –

0

no estoy 100% seguro, pero lo que creo que ocurre es que en la segunda línea se está definiendo un bloque, no un objeto . Por lo tanto, el error de análisis aparece cuando el analizador llega a la coma, ya que espera un semi color. Las etiquetas definidas son etiquetas, como en una declaración goto o switch. Espero que esta explicación tenga sentido.

0

consola hacer como eval ('que de entrada')

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