2010-02-23 16 views
6

Jestem wielkim fanem przy użyciu metody foreach na nodeLists tak:Prędkość [] .forEach.call (...

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

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

Zastanawiałem się jednak, czy robi to w ten sposób podjąć dłużej niż zwykły sposób? np

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

BTW 'for (var i = 0, EL; el = węzłów [i]; i ++)' działa równie dobrze :) –

+0

Czy masz konkretny przypadek wydajności próbujesz rozwiązać? W przeciwnym razie możesz uniknąć przedwczesnej optymalizacji. – mikemaccana

Odpowiedz

7

Oto nice performance comparison. Według niego Array.forEach jest wolniejsze niż native for pętli.

+0

Pozdrawiam, dzięki za link. Właśnie tego szukałem. BTW, szybkość jQuery.each jest nieco zaskakująca. – Yansky

1

to depen ds w przeglądarce. I nie zapomnij o czasie while(), który jest najszybszy w Firefoksie 4. Here's a comparison.

Należy również pamiętać, że jeśli obsługujesz starsze przeglądarki, które nie obsługują opcji Any, musisz dodać czas potrzebny na implement a polyfill.

4

Wiem, że to stary post, ale za pomocą metody forEach można również wykonać kradzież prototypu Array.

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

+1 Robiąc to raz, a następnie mając NodeList.forEach() wygląda znacznie bardziej niż przy użyciu .call() dla każdej pętli lub przy użyciu gigantycznych pętli "na" stylu ES3 – mikemaccana

+1

Ale [specyfikacja ES5] (http: // es5 .github.io/# x15.4.4.18) mówi, że "czy funkcja forEach może zostać pomyślnie zastosowana do obiektu hosta [jak NodeList] jest zależna od implementacji." O ile wiem, Chrome i Firefox obsługują ONA na obiektach hosta. Nie wiem o IE, Safari, Operze itp. –

+0

Jest to zależne od implementacji, ale to nie będzie miało znaczenia dla implementacji w przeglądarkach, które to zrobiły (jeszcze nie znalazłem żadnego, spróbuję Chrome chociaż .) –