Sebbene gli array in JavaScript siano oggetti, non ci sono valide ragioni
per usare il ciclo for in. Infatti, ci sono varie
buone ragioni per evitare l'utilizzo di for in con gli array.
Nota: gli array in JavaScript non sono array associativi. JavaScript ha solo oggetti per mappare chiavi con valori. E mentre gli array preservano il loro ordine, gli oggetti non lo fanno.
Dato che il ciclo for in enumera tutte le proprietà che sono presenti nella
catena di prototipi, e dal momento che il solo modo per escludere queste
proprietà è quello di usare hasOwnProperty,
esso è già venti volte più lento di un normale ciclo for.
Per poter ottenere la miglior performance durante l'iterazione degli array,
è meglio usare il classico ciclo for.
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}
In questo esempio c'è un ulteriore particolare da notare, che è il caching
della lunghezza dell'array tramite l = list.length.
Sebbene la proprietà length sia definita nell'array stesso, c'è ancora un
sovraccarico di lavoro dato dal fatto che deve essere ricercata ad ogni
iterazione del ciclo. E mentre i motori JavaScript recenti potrebbero
applicare delle ottimizzazioni in questo caso, non c'è modo di dire se il
codice verrà eseguito su uno di questi nuovi motori oppure no.
Infatti, l'omissione della parte di caching può risultare in un ciclo eseguito soltanto alla metà della velocità con cui potrebbe essere eseguito facendo il caching della lunghezza.
Mentre il getter della proprietà length ritorna semplicemente il numero di
elementi che sono contenuti nell'array, il setter può essere usato per
troncare l'array.
var arr = [1, 2, 3, 4, 5, 6];
arr.length = 3;
arr; // [1, 2, 3]
arr.length = 6;
arr.push(4);
arr; // [1, 2, 3, undefined, undefined, undefined, 4]
Assegnando una lunghezza più piccola si tronca l'array. Incrementandola si crea un array frammentato.
Per la miglior performance, si raccomanda di usare sempre il ciclo for
classico e fare il caching della proprietà length. L'uso di for in su di
un array è segno di un codice scritto male che è suscettibile a bug e pessima
performance.