2011-05-16 26 views
6

Estoy pensando que quizás me perdí algo en JavaScript que estoy recogiendo ahora.JSON.stringify() y objetos de JavaScript

yo probamos este código en la consola de Chrome:

a = []; 
a.name = "test"; 
JSON.stringify(a); 
// which returns value [] 
a = new Object(); 
a.name = "test"; 
JSON.stringify(a); 
// which returns value {"name":"test"} 

¿Cuál es la diferencia? Pensé que el nuevo objeto() era algo de Microsoft JScript. ¿Qué me estoy perdiendo? Debe haber perdido algo en alguna especificación. Gracias.

+0

¿qué estás esperando? – hvgotcodes

+2

* "Pensé que Object() era una cosa de Microsoft JScript?" * No, en absoluto. Eso es JavaScript estándar (aunque es detallado, simplemente use '{}' en su lugar, lo que funciona bien tanto en JScript como en otras implementaciones de ECMAScript). –

Respuesta

20
a = new Object() 

y

a = [] 

no son equivalentes. Pero,

a = {} 

y

a = new Object() 

son.

+0

Ok. Gracias. Siente como si obtuviera mi tonta pregunta del día ahora. – BuddyJoe

+0

yo también lo eché de menos. –

1

Para datos JSON, las matrices deben tener índices numéricos, y los objetos tienen pares clave/valor.

a = []; 
a[ 0 ] = "test"; 

JSON.stringify(a); // returns value ["test"] 
1

Sí, está utilizando [] para definir su objeto, que en realidad es una matriz, pero dependiendo del idioma de donde provenga podría ser confuso porque no es una matriz asociativa.

objetos predeterminados son todos los mapas de número-> de datos y se instancian con llaves {}

Si lo hizo

a = {}; 
a.name = "test"; 
JSON.stringify(a); 

Se debe trabajar.

+0

* "...podría ser confuso porque no es una matriz asociativa "* En realidad, es más confuso que eso, porque * es * una matriz asociativa, y las claves no numéricas (nombres de propiedad) son perfectamente válidas en JavaScript, ya que [las matrices no son realmente matrices] (http://blog.niftysnippets.org/2011/01/myth-of-arrays.html). Pero se eliminarán si convierte la matriz a JSON, porque la notación de matriz JSON no permite - teclas numéricas (por una buena razón, muy pocos idiomas las soportarían). –

3

new Object() es equivalente a {} (excepto cuando no es debido a problemas de redefinición extraños -. Pero ignorar que por ahora) [] es equivalente a new Array(), a los cuales tiene a continuación, añadir una propiedad .name. JSON codifica las matrices de una manera especial que no captura la asignación de propiedades arbitrarias a la matriz en sí.

1

Establecer la propiedad name de una matriz no tiene nada que ver con su formulario serializado (JSON-stringified). No pone una entrada en la matriz. Para hacer eso, necesitas a.push('test').

Los objetos son partes estándar de Javascript (consulte, por ejemplo, MDC docs). La forma normal de crear un objeto es con {}, pero new Object() también funciona.

Entonces ...

var a = []; 
a.push('test'); 
JSON.stringify(a); //"["test"]" 

a = {}; 
a.name = 'test'; 
JSON.stringify(a); //"{"name":"test"}"