2009-03-15 9 views
16

en PHP, si usted tiene el siguiente código:¿Es predecible el orden de los campos en un objeto javascript al recorrerlos?

$map = array(
    "first" => 1, 
    "second" => 2 
); 

$map["third"] = 3; 

foreach($map as $key => $value) { 
    // code 
} 

Usted sabe que las entradas se enumeran en el orden en que se han añadido a la matriz.

Ahora, ¿puedo asumir que la misma regla se aplica al equivalente de Javascript a continuación?

map = { 
    "first": 1, 
    "second": 2 
}; 

map["third"] = 3; 

for (key in map) { 
    // code 
} 

Este es un duplicado de: Elements order - for (… in …) loop in javascript

+0

posible duplicado de [Orden de elementos - para (... en ...) bucle en javascript] (http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript) – Borgar

Respuesta

10

La mayoría de los navegadores recorren las propiedades en el orden en que se agregaron al objeto, pero el estándar Javascript dice que el orden no está definido, por lo que no debe confiar en este comportamiento. Por ejemplo, hace un tiempo leí un blog post sobre cómo Google Chrome no siempre exhibía este comportamiento.

Si necesita la funcionalidad ordenada, debe crear una nueva clase para usted que pueda usar tanto el objeto como las teclas numéricas.

+1

Muchas gracias por el enlace. Lo que John dice es que, aunque no es estándar, los proveedores de navegadores lo aplican como si fuera (por lo que el equipo de Chrome corregirá el "error"). –

+1

Sí. Aunque todavía no creo que debas confiar en el comportamiento. Es más seguro crear una clase personalizada donde usted mismo pueda definir el comportamiento. –

0

No, el comportamiento depende de la aplicación y no está garantizada. Use una matriz cuando la orden necesita ser preservada.

+1

Sí, pero (en el estándar): "La mecánica de enumerar las propiedades (paso 5 en el primer algoritmo, paso 6 en el segundo) depende de la implementación. El orden de enumeración está definido por el objeto". Así que la enumeración en sí misma depende de la implementación, pero el orden depende del objeto, ¿no? –

+1

@Julian: la próxima edición 3.1 de ECMA-262 es menos ambigua: "La mecánica y el orden de enumeración de las propiedades [...] no están especificados". – Christoph

Cuestiones relacionadas