2008-12-19 14 views
26

¿Cuál es la sintaxis correcta para crear objetos en Javascript que trabajarán a través de la mayoría de los navegadores web (con esto quiero decir: IE 6+, Firefox 2+, Opera 9+)sintaxis JSON para nombres de propiedad

Es esta válida


var a={ "class": "Person", 
     "name": "William Shakespeare", 
     "birthday": -12802392000000, 
     "nickname": "Bill" 
     } ; 

O es la siguiente:


var a={ class: "Person", 
     name: "William Shakespeare", 
     birthday: -12802392000000, 
     nickname: "Bill" 
     } ; 

y cuál es la diferencia entre los dos?

Respuesta

30

@AndreasN is correct: el JSON specification dicta el uso de comillas para que realmente sea JSON. Si no utiliza comillas, puede ser un literal de objeto válido en Javascript, pero no es JSON. Otros servicios, además del Javascript del lado del navegador, usan JSON (por ejemplo, servicios web que utilizan php, Java, etc.) y si construyes una cadena que carece de comillas, no hay garantía de que se analizará correctamente, aunque sospecho que la mayoría de las implementaciones serían lo suficientemente robusto para hacerlo.

FYI es peligroso en Javascript utilizar directamente eval() en cadenas JSON de fuentes que no pueden evitar ataques maliciosos. Una vez más, vea el JSON site que brinda más explicaciones, así como un archivo javascript muy corto que analiza cadenas JSON de forma segura en objetos Javascript.

edición: supongo que técnicamente su pregunta original no se trata de JSON, sino más bien la sintaxis del Javascript para objetos literales. La diferencia es que los objetos construible a partir de una cadena JSON excluirá a muchos otros objetos literales posibles, por ejemplo:

var a = {cat: "meow", dog: "woof"}; 
var aname = {cat: "Garfield", dog: "Odie"}; 
var b = { 
    counter: 0, 
    pow: function(x) { return x+1; }, 
    zap: function(y) { return (counter += y); } 
}; 
var c = { 
    all: [a,aname], 
    animals: a, 
    names: aname, 
}; 

objetos literales "a" y "aname" se puede expresar en JSON (mediante la adición de cotizaciones a los nombres de propiedad) . Pero los literales de objeto "b" y "c" no pueden. El literal del objeto "b" contiene funciones (no permitidas en JSON). El literal de objeto "c" anterior contiene referencias a otras variables de una manera que no es representable en JSON porque algunas de las referencias se comparten. Si realiza un cambio en c.names, también cambiará c.all[1] ya que comparten una referencia a la misma variable. JSON solo puede expresar objetos que tienen una estructura de árbol (por ejemplo, cada subelemento del objeto global es independiente).

7

El spec dice que se debe usar "".

Firefox acepta sin, pero IE no lo hace.

par se define como

string : value 

valor puede ser una cadena se define cadena como

" chars " 
+0

IE también. Incluso IE6 lo acepta. – Tomalak

+0

sí, no he notado ningún problema con el método sin cita – nickf

4

Usted tiene que usar "comillas" alrededor de edificios que contienen otra cosa que no sea caracteres de palabra

{foo-bar: 3} // invalid 
{"foo-bar": 3} // valid 

Aparte de eso, no hay diferencia entre los dos y me imagino que ambas formas funcionan en todos los navegadores

8

Si IE falla con su segundo ejemplo es porque 'Clase' es una palabra reservada (solo en IE). En general, siempre es mejor incluir sus nombres de propiedad con comillas, lo que significa que SIEMPRE funcionará, cualquiera que sea la circunstancia.

+2

clase es en realidad una palabra reservada en todos los navegadores. Es solo que IE decide fallar cuando se usa. – Triptych

Cuestiones relacionadas