¿El bucle "for ... in" en Javascript recorre las tablas / elementos hash en el orden en que se declaran? ¿Hay un navegador que no lo hace en orden?
El objeto que deseo usar se declarará una vez y nunca se modificará.
Supongamos que tengo:
var myObject = { A: "Hello", B: "World" };
Y los uso más en:
for (var item in myObject) alert(item + " : " + myObject[item]);
¿Puedo esperar que 'A: "Hola" siempre aparezca antes de "B:" Mundo "en la mayoría de los navegadores decentes?
javascript
for-loop
chakrit
fuente
fuente
Respuestas:
Citando a John Resig :
Todos los navegadores respetan el orden de definición con la excepción de Chrome y Opera, que lo hacen para cada nombre de propiedad no numérico. En estos dos navegadores, las propiedades se extraen en orden antes de la primera propiedad no numérica (esto tiene que ver con la forma en que implementan las matrices). El orden también es el mismo
Object.keys
.Este ejemplo debería dejar en claro lo que sucede:
Los tecnicismos de esto son menos importantes que el hecho de que esto puede cambiar en cualquier momento. No confíe en que las cosas se mantengan de esta manera.
En resumen: use una matriz si el orden es importante para usted.
fuente
Topando esto un año después ...
Es 2012 y los principales navegadores aún difieren:
esencia o prueba en el navegador actual
Safari 5, Firefox 14
Chrome 21, Opera 12, Nodo 0.6, Firefox 27
IE9
fuente
delete
es interesante porque al menos en V8, instantáneamente hace que el objeto sea respaldado por una tabla hash. Sin embargo, la tabla hash en V8 se almacena en orden de inserción. El resultado más interesante aquí es IE, me pregunto qué tipo de fealdad hacen para lograrlo ...De la especificación del lenguaje ECMAScript , sección 12.6.4 (en el
for .. in
bucle):Y la sección 4.3.3 (definición de "Objeto"):
Supongo que eso significa que no puede confiar en las propiedades que se enumeran en un orden consistente en todas las implementaciones de JavaScript. (De todos modos, sería un mal estilo confiar en detalles específicos de la implementación de un idioma).
Si desea definir su orden, necesitará implementar algo que lo defina, como una matriz de claves que clasifique antes de acceder al objeto con él.
fuente
Los elementos de un objeto que para / in enumera son las propiedades que no tienen establecido el indicador DontEnum. El estándar ECMAScript, también conocido como Javascript, dice explícitamente que "Un objeto es una colección desordenada de propiedades" (ver http://www.mozilla.org/js/language/E262-3.pdf sección 8.6).
No va a ser compatible con los estándares (es decir, seguro) asumir que todas las implementaciones de Javascript se enumerarán en orden de declaración.
fuente
El orden de iteración también se confunde con respecto a la eliminación de propiedades, pero en este caso solo con IE.
El deseo de cambiar la especificación para corregir el orden de iteración parece ser un deseo bastante popular entre los desarrolladores si la discusión en http://code.google.com/p/v8/issues/detail?id=164 es una indicación.
fuente
en IE6, el pedido no está garantizado.
fuente
No se puede confiar en el pedido. Tanto Opera como Chrome devuelven la lista de propiedades desordenadas.
El código anterior muestra B, A, C en Opera y C, A, B en Chrome.
fuente
Esto no responde la pregunta per se, pero ofrece una solución al problema básico.
Suponiendo que no puede confiar en el orden para preservar, ¿por qué no utilizar una matriz de objetos con clave y valor como propiedades?
Ahora, depende de usted asegurarse de que las claves sean únicas (suponiendo que esto también sea importante para usted. Además, los cambios de direccionamiento directo y para (... en ...) ahora devuelve índices como 'claves'.
Vea la Pluma para (... en ...) direccionamiento en orden por JDQ ( @JDQ ) en CodePen .fuente