2010-02-23 12 views
6

yo soy un gran fan de utilizar el método forEach en NodeLists así:velocidad de [] .forEach.call (...

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

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

Me preguntaba, sin embargo, no hacerlo de esa manera tomar ya que la forma regular? por ejemplo

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

Por cierto 'for (var i = 0, EL; el = nodos [i]; i ++)' funciona tan bien :) –

+0

¿Tiene un caso rendimiento específico que se está tratando de resolver? De lo contrario, en caso de que lo haga, evite la optimización prematura. – mikemaccana

Respuesta

7

Aquí hay una nice performance comparison. de acuerdo con lo Array.forEach es más lento que un bucle nativo for.

+0

Saludos, gracias por el enlace. Eso es exactamente lo que buscaba. Por cierto, la velocidad de jQuery.each es un poco sorprendente. – Yansky

1

se Depen ds en el navegador. Y no te olvides de while() que es el más rápido en Firefox 4. Here's a comparison.

También tenga en cuenta que si admite navegadores antiguos que no son compatibles con cada uno, debe agregar el tiempo que lleva a implement a polyfill.

4

Sé que es una publicación anterior, pero utilizando el método forEach se puede hacer robando también el prototipo de matriz.

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

+1 Hacer esto una vez, y luego tener someNodeList.forEach() parece mucho más ordenado que utilizar .call() para cada ciclo o usar 'ES' estilo gigantesco para 'loops' – mikemaccana

+1

Pero [la especificación ES5] (http: // es5 .github.io/# x15.4.4.18) dice que "si la función forEach se puede aplicar con éxito a un objeto host [como NodeList] depende de la implementación". Por lo que sé, Chrome y Firefox soportan cada uno de los objetos host. No sé sobre IE, Safari, Opera, etc. –

+0

Depende de la implementación, pero esto no cambiará la implementación en los navegadores que lo hayan hecho (aún no encontré ninguno, intentaré Chrome aunque .) –