2012-04-09 11 views
30

Como se demuestra en this jsfiddle, si tiene un archivo JS y se crea un objeto JSON sin usarlo, se comporta de manera diferente, dependiendo de si las teclas (miembros) están envueltos en citas o no.extraño JSON comportamiento de análisis en JS, "símbolo inesperado:"

código válido: { a: 1};
código no válido: { "a": 1 };

Lo que se obtiene es un mensaje de error (en Chrome, diferentes para FF/IE, pero todavía falla en la sintaxis)

Uncaught SyntaxError: Unexpected token :

sino si usa el objeto de alguna manera, por ejemplo: alert({ "a": 1 }); todo está bien de nuevo.

¿Por qué sucede esto?

Respuesta

53

La declaración:

{ a: 1 }; 

es no un objeto literal. Es una declaración de bloque con una expresión etiquetada. Es valido

Este:

{ "a": 1 }; 

es un error de sintaxis, porque no es sólo analizable. La "a" citada inicia un enunciado de expresión dentro del bloque, pero luego el siguiente token después de la cadena es dos puntos, y no hay forma de expresión que se parece a una expresión seguida de dos puntos.

Ahora:

var x = { "a": 1 }; 

obras debido a que el "{" no se interpreta como parte de un bloque de sentencias. Esa declaración comienza con var, por lo que es una declaración de variable. Dentro de la expresión del lado derecho del token "=", lo único que puede significar "{" es el comienzo de un objeto literal. Del mismo modo, tenga en cuenta que:

({ "a": 1 }); 

está bien porque el paréntesis de apertura hace que el analizador espera una subexpresión anidada, por lo que una vez más el "{" sin ambigüedades significa que es el inicio de un objeto literal.

+0

pero asignándolo a var lo convierte en un objeto literal? – karnyj

+0

Sí, porque no hay ambigüedad. – Pointy

+5

javascript internals son realmente algo :) gracias – karnyj

2

Este error puede emergente cuando se hace una llamada jQuery AJAX utilizando jsonp cuando jsonp no es necesario. Trate de cambiar el tipo de datos en su llamada AJAX, si este es el caso a la normalidad json

$.ajax({ 
    dataType: 'json', // try using json rather than json p 
    ... 
}); 
0

me he dado cuenta de que cuando se carga el JSON a través de require y el nombre del archivo no termina el .json me sale este error. Renombrar el archivo al bla.json y funciona bien.

Cuestiones relacionadas