2010-02-23 7 views
6

Ich bin ein großer Fan von der foreach-Methode auf Nodelisten wie folgt aus:Geschwindigkeit [] .forEach.call (...

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

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

ich aber frage mich, ist es zu tun auf diese Weise nehmen länger als die normale Art und Weise? zB

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

BTW 'for (var i = 0, el, el = Knoten [i]; i ++)' funktioniert auch :) –

+0

Haben Sie einen bestimmten Leistungs Fall, dass Sie versuchen zu lösen? Andernfalls könnten Sie eine vorzeitige Optimierung vermeiden. – mikemaccana

Antwort

7

Hier ist ein nice performance comparison. nach ihrem Array.forEach ist langsamer als eine native for Schleife.

+0

Prost, danke für den Link. Genau danach war ich. BTW, ist die jQuery.each Geschwindigkeit ein bisschen überraschend. – Yansky

1

es Depen ds im Browser. Und vergiss nicht while(), was bei Firefox 4 am schnellsten ist. Here's a comparison. Wenn Sie ältere Browser unterstützen, die forEach nicht unterstützen, müssen Sie die benötigte Zeit zu implement a polyfill hinzufügen.

4

Ich weiß, es ist ein alter Beitrag, aber die forEach-Methode kann auch durch den Diebstahl des Array-Prototyps getan werden.

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

+1 Wenn man das einmal macht, sieht es mit someNodeList.forEach() viel besser aus, als entweder .call() für jede Schleife zu verwenden oder riesige ES3-Stile für 'loops – mikemaccana

+1

Aber [die ES5-Spezifikation] (http: // es5 .github.io/# x15.4.4.18) besagt, dass "ob die forEach-Funktion erfolgreich auf ein Host-Objekt [wie NodeList] angewendet werden kann, implementierungsabhängig ist." Soweit ich weiß, unterstützen Chrome und Firefox forEach auf Host-Objekten. Ich weiß nicht über IE, Safari, Opera, etc. –

+0

Es ist abhängig von der Implementierung, aber das wird keinen Unterschied machen bei der Implementierung in Browsern (ich habe bisher noch keine gefunden, werde Chrome ausprobieren) .) –