2012-02-07 6 views
14

Enumeración de las llaves de objetos JavaScript repeticiones las teclas en el orden de inserción:¿Es aceptable el estilo para las bibliotecas de Node.js confiar en el orden de las claves de objeto?

> for (key in {'z':1,'a':1,'b'}) { console.log(key); } 
z 
a 
b 

Esto no es parte de la norma, pero se implementa ampliamente (como se discutió here):

ECMA- 262 no especifica el orden de enumeración. El estándar de facto es para que coincida orden de inserción, que V8 también hace, pero con una excepción:

V8 no da garantías en el orden de enumeración para los índices de matriz (es decir, un nombre de propiedad que puede ser analizada como un 32 -bit entero sin signo).

¿Es aceptable la práctica de confiar en este comportamiento al construir bibliotecas de Node.js?

+2

normalmente trato de evitar confiar en un comportamiento particular cuando se trata de JS. – zzzzBov

+1

No, no lo es. ¿Cuál es tu caso de uso? – georg

+0

He visto este estilo en algunas bibliotecas de nodos, y quería verificar con la comunidad antes de haber molestado a los desarrolladores. El (nuevo) node.js Dynamo, biblioteca, por ejemplo, toma un argumento de esquema de dos claves donde el orden es importante. El primero especifica el "hash", y el segundo especifica el "rango". –

Respuesta

12

Absolutamente no! No es una cuestión de estilo tanto como una cuestión de corrección.

Si usted depende de este estándar "de facto", su código podría fallar en un ECMA-262 5th Ed. intérprete compatible porque esa especificación no especifica el orden de enumeración. Además, el motor V8 podría cambiar su comportamiento en el futuro, por ejemplo, en interés del rendimiento, p.

1

No. Confíe en el estándar ECMAScript, o tendrá que discutir con los desarrolladores si existe un "estándar de facto" como las personas en ese error.

7

Definitivamente no confíe en el orden de las teclas. Si el estándar no especifica un pedido, las implementaciones son libres de hacer lo que quieran. Las tablas hash a menudo subyacen a objetos como estos, y no hay manera de saber cuándo se puede usar. Javascript tiene muchas implementaciones, y todas compiten para ser las más rápidas. El orden clave variará entre implementaciones, si no ahora, luego en el futuro.

+3

"* si no ahora, en el futuro. *" - en realidad eso es poco probable, ya que los motores están preocupados por la compatibilidad con versiones anteriores. Todo lo que se utiliza en un navegador web se abstendrá de romper la web, y ya hay suficientes personas que confían erróneamente en el pedido de propiedad. Las implementaciones convergerán en lugar de ser más diversas, a menos que haya un aumento en el rendimiento anormal. – Bergi

Cuestiones relacionadas