Javascript forEach vs for

Cuando necesitas iterar sobre un array de elementos en javascript existe una funcion especifica llamada forEach

arr.forEach(function (item){
  // codigo de trabajo
});

Esta seria la versión educada para iterar y trabajar sobre los elementos de ese array. Sin embargo que tan productiva puede ser  ?

En el benchmark realizado en jsperf, se observa que utilizar forEach puede ser sensiblemente mas lenta ( ok ... muuuucho mas lenta ) que su contraparte, la vieja confiable "for".

La pregunta seria porque es mas lenta ( tan lenta ), para poder responder examinaremos el codigo de la funcion forEach

  Array.prototype.forEach = function(fun /*, thisArg */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t)
        fun.call(thisArg, t[i], i, t);
    }
  };

Primero verificamos que el array no sea null, calculamos la longitud del array y verificamos la funcion de callback exista. Hasta aca, no hay mucho drama, ya que todo eso se realiza solo una vez.

Sin embargo, luego entramos a un elemento for ( si un for dentro del forEach que estamos usando, el mismo for que no quisimos usar en lugar del forEach ). Llegado a este punto uno se siente medio hipster  ... 

Dentro del for ( dentro del forEach ) se debe ejecutar un operador ( i in t ). Donde T es el array e i el indice. Basicame le esta preguntando si el array t tiene el indice i. Y luego de eso llama a la funcion callback pasandole varios argumentos.

Son estos 2 ultimos pasos los que generan toda la lentitud en el proceso del forEach. El costo de hacer la validacion ( i in t ) y el costo de llamar a una funcion ( cada vez que llamamos a una funcion, hacemos que el codigo salte a otra ubicacion en la memoria y eso tiene un costo en tiempo de ejecucion, y si lo hacemos en un for pues el costo se multiplica )

Conclusion: Evita usar forEach, asi tengas un array de pocos elementos ( luego se hace costumbre )

 



Contactanos