2012-02-07 9 views
14

enumerazione i tasti di oggetti JavaScript riproduzioni chiavi nell'ordine di inserimento:È accettabile lo stile per le librerie Node.js per fare affidamento sull'ordine delle chiavi dell'oggetto?

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

Questo non è parte dello standard, ma è ampiamente implementata (come discusso here):

ECMA 262 non specifica l'ordine di enumerazione. Lo standard è quello di abbinare ordine di inserimento, che V8 fa anche, ma con un'eccezione:

V8 dà alcuna garanzia sull'ordine di enumerazione per gli indici di matrice (cioè, una proprietà nome che può essere analizzato come un 32 -bit intero senza segno).

È pratica accettabile affidarsi a questo comportamento durante la costruzione di librerie Node.js?

+2

in genere cerco di evitare di fare affidamento su un comportamento particolare quando si tratta di JS. – zzzzBov

+1

No, non lo è. Qual è il tuo caso d'uso? – georg

+0

Ho visto questo stile in alcune librerie di nodi, e ha voluto verificare con la comunità prima che infastidiva gli sviluppatori. Il (nuovo) node.js Dynamo, la libreria, ad esempio, utilizza un argomento schema di due chiavi in ​​cui l'ordine è importante. Il primo specifica "hash" e il secondo specifica "range". –

risposta

12

Assolutamente no! Non è una questione di stile tanto come una questione di correttezza.

Se si dipende da questo standard "de facto", il codice potrebbe non funzionare su un 5 ° Ed. ECMA-262. interprete conforme perché quella specifica non specifica l'ordine di enumerazione. Inoltre, il motore V8 potrebbe cambiare il suo comportamento in futuro, ad esempio nell'interesse della performance, ad es.

1

No. Affidati allo standard ECMAScript, o dovrai discutere con gli sviluppatori sul fatto che esista uno "standard de facto" come le persone su quell'errore.

7

Definitivamente non fare affidamento su sull'ordine delle chiavi. Se lo standard non specifica un ordine, le implementazioni sono libere di fare ciò che vogliono. Le tabelle hash sono spesso alla base di oggetti come questi, e non hai modo di sapere quando potresti essere usato. Javascript ha molte implementazioni e tutti sono in competizione per essere il più veloce. L'ordine delle chiavi varierà tra le implementazioni, se non ora, poi in futuro.

+3

"* se non ora, poi in futuro. *" - in realtà è improbabile, dato che i motori sono interessati alla retrocompatibilità. Tutto ciò che viene utilizzato in un browser Web si asterrà dal rompere il Web e ci sono già abbastanza persone che erroneamente fanno affidamento sull'ordine di proprietà. Le implementazioni convergeranno invece che diverranno più diversificate, a meno che non vi sia un guadagno di prestazioni spaventoso. – Bergi

Problemi correlati