2009-06-10 14 views
18

Supponiamo che io sono un oggetto JavaScript che viene inizializzatoIterazione ordine dei cicli for..in in Javascript

var letters = {q:0, t:0, o:0, b:0, y:0, n:0, u:0, m:0, p:0, 
       w:0, a:0, d:0, k:0, v:0, c:0, z:0, l:0, j:0, 
       i:0, e:0, g:0, s:0, x:0, r:0, h:0, f:0}; 

e poi voglio scandire le chiavi di questo oggetti

for(var letter in letters) { 
    // code goes here 
} 

In entrambi Firefox 3 e Internet Explorer 8 gli oggetti vengono iterati nell'ordine in cui sono elencati nella dichiarazione dell'oggetto (q, t, o, b, y, ecc.).

Posso contare su questo? Supponiamo di non modificare il mio oggetto in alcun modo prima dell'iterazione. Fa parte dello standard ECMAScript? Qualcuno sa quali browser iterano nell'ordine dichiarato?

+3

Dup: http://stackoverflow.com/questions/919027/are-object-variables-in-javascript-enumerated-in-the-order-the-were-added e http://stackoverflow.com/questions/280713/elements-order-per-in-loop-in-javascript –

risposta

13

No, non può essere fatto valere, almeno not in Firefox:

A per ... in itera loop all'interno di una proprietà di un oggetto in un ordine arbitrario.

+2

In realtà, in Firefox è possibile dipendere da questo, ma non in Chrome; vedi http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript – doekman

+3

Non devi dipendere da un ordine riproducibile in nessun browser. L'ordine è dato dall'implementazione corrente ma può cambiare in qualsiasi momento. Il documento collegato di Mozilla chiama esplicitamente l'ordine arbitrario. –

0

No, non dovresti fare affidamento su questo.

1

L'ordine è definito nelle specifiche come "arbitrario", quindi no; non dovresti fare affidamento sull'ordine definitivo.

2

Per garantire un ordine particolare per l'elaborazione delle proprietà di un oggetto in un ciclo for-in, è necessario definire un ordinamento o un metodo di elenco per l'oggetto. Se si definiscono tutte le proprietà quando si crea l'oggetto, verrà eseguita una matrice di nomi di proprietà, ma se è possibile aggiungere o rimuovere proprietà, è necessario un metodo.

Se l'ordine di elaborazione è essenziale per qualche motivo, può essere preferibile un array.

Problemi correlati