2010-05-05 16 views
7

En la consola de Firefox, este código generará error:JavaScript objeto literal confusión notación

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

este código funciona bien

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

este código funciona bien, así

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

¿Alguien puede ayudar a explicar por qué es la diferencia? ¡Gracias!

+1

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

Respuesta

6

Esto se debe a la sintaxis ambigua. Cuando intenta hacer un objeto liso literal en las dos primeras líneas, JavaScript es realmente interpreta como un conjunto de llaves, a continuación, una etiqueta, a continuación, una declaración:

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

Este código no se evalúa como un objeto , pero solo para la matriz. El primer ejemplo, trataste de usar una cadena como etiqueta, que es una sintaxis incorrecta. El tercer ejemplo funciona correctamente, crea un objeto y lo almacena en a.

+4

+1 @OP : Para que sea una expresión (un objeto literal) en lugar de llaves alrededor de una etiqueta seguida de una matriz literal, debe usarla como un valor de la mano derecha (como en su último ejemplo). Como valores a la derecha, los tres habrían sido una notación literal de objeto válida (la que usa 'd:', la que usa '" d ":', y la que usa ''d':'). Algo OT, pero solo el '" d ":' uno sería JSON válido, si eso es relevante para lo que estás haciendo, porque JSON es un * subconjunto * de la notación literal del objeto. (http://json.org) –

+0

¿Por qué, oh por qué, pusieron GOTO en Javascript ... * suspiro * –

+1

@Bears: No lo hicieron, Javascript no tiene declaraciones 'goto'. Tiene etiquetas, que son útiles para 'romper' fuera de bucles internos y tal. (Consulte la sección 12.12 de la especificación de la 5.ª edición. En las especificaciones anteriores, 'goto' era un símbolo reservado, pero no había una declaración' goto', por ejemplo, estaban cubriendo sus apuestas. A partir de la 5ª edición, no hay más cobertura) –

4

probablemente esté teniendo dificultades para decidir si se trata de una expresión o un bloque. Si usa paréntesis alrededor del objeto, funciona ya que fuerza una expresión. El operador de agrupación, ( y ), fuerza { y } para analizarse como objeto literal.

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

Leído Named function expressions demystified. No está directamente relacionado con este problema, pero lo aborda cuando habla sobre el uso de agrupar-paréntesis y eval().

Cuestiones relacionadas