2010-02-23 6 views
6

io sono un grande fan di utilizzare il metodo forEach su nodeLists come questo:velocità di [] .forEach.call (...

var nodes = document.querySelectorAll(".foo"); 

[].forEach.call(nodes, function (item) { 
    //do stuff with item 
}); 

Mi chiedevo però, non facendo in questo modo prendere più lungo la strada normale? esempio

for(var i=0;i<nodes.length;i++){ 
    //do stuff with nodes[i]; 
} 
+3

BTW 'for (var i = 0, el; el = nodi [i]; i ++)' funziona così :) –

+0

Avete un caso specifico delle prestazioni si sta cercando di risolvere? Altrimenti, in questo caso si potrebbe evitare l'ottimizzazione prematura. – mikemaccana

risposta

7

Ecco una nice performance comparison. In base ad esso Array.forEach è più lento di un ciclo for nativo.

+0

Ciao, grazie per il link. Questo è esattamente quello che stavo cercando. BTW, la velocità di jQuery.each è un po 'sorprendente. – Yansky

1

E Depen ds sul browser. E non dimenticarti di quando() che è il più veloce su Firefox 4. Here's a comparison.

Inoltre, tieni presente che se stai supportando i browser meno recenti che non supportano per Each, è necessario aggiungere il tempo necessario a implement a polyfill.

4

So che è un vecchio post ma l'utilizzo del metodo forEach può essere eseguito anche rubando il prototipo di Array.

NodeList.prototype.forEach = Array.prototype.forEach; 
+0

+1 Facendo questo una volta, poi avere someNodeList.forEach() sembra molto più ordinario di usare .call() per ogni ciclo o usando loop "for" di tipo ES3 gigante – mikemaccana

+1

Ma [la specifica ES5] (http: // es5 .github.io/# x15.4.4.18) afferma che "se la funzione forEach può essere applicata correttamente a un oggetto host [come NodeList] dipende dall'implementazione." Per quanto ne so, Chrome e Firefox supportano per Each sugli oggetti host. Non conosco IE, Safari, Opera, ecc. –

+0

Dipende dall'implementazione, ma ciò non farà alcuna differenza per l'implementazione sui browser che l'hanno fatto (non ne ho ancora trovato nessuno, proverò Chrome .) –