arrays object - JavaScript-Matices de myArray.forEach vs for loop




json recorrer (4)

He visto muchas preguntas que sugieren usar:

for (var i = 0; i < myArray.length; i++){ /* ... */ }

en lugar de:

for (var i in myArray){ /* ... */ }

para matrices, debido a la iteración inconsistente ( ver aquí ).

Sin embargo, parece que no puedo encontrar nada que parezca preferir el bucle orientado a objetos:

myArray.forEach(function(item, index){ /* ... */ });

Lo cual me parece mucho más intuitivo.

Para mi proyecto actual, la compatibilidad de IE8 es importante, y estoy considerando usar el polyfill de Mozilla , sin embargo, no estoy 100% seguro de cómo funcionará.

  • ¿Hay alguna diferencia entre el estándar for loop (el primer ejemplo anterior) y la implementación Array.prototype.forEach de los navegadores modernos?
  • ¿Hay alguna diferencia entre las implementaciones modernas del navegador y la implementación de Mozilla vinculada a las anteriores (con especial atención a IE8)?
  • El rendimiento no es un gran problema, solo la coherencia con la que se iteran las propiedades.

Answers

Algunos desarrolladores (por ejemplo, Kyle Simpson) .forEach utilizar .forEach para indicar que la matriz tendrá un efecto secundario y .map para funciones puras. for bucles en esta ecuación, entonces, en mi opinión, cabe en esta ecuación como una solución de propósito general que es más fácil de comunicar, ya que se admite en una gran cantidad de idiomas, especialmente cuando el número de iteraciones está precalculado.


La diferencia más importante entre el bucle for y el método forEach es que, con el primero, puede salir del bucle. Puede simular continue simplemente volviendo de la función pasada a forEach , pero no hay forma de detener el bucle por completo.

Aparte de eso, los dos logran efectivamente la misma funcionalidad. Otra diferencia menor implica el alcance del índice (y todas las variables que lo contienen) en el ciclo for, debido a la elevación variable.

// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }

// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });

Sin embargo, me parece que forEach es mucho más expresivo: representa tu intención de iterar a través de cada elemento de una matriz, y te proporciona una referencia al elemento, no solo al índice. En general, todo se reduce a un gusto personal, pero si puedes usar forEach , te recomendaría usarlo.

Hay algunas diferencias más sustanciales entre las dos versiones, específicamente con respecto al rendimiento. De hecho, el bucle for simple tiene un rendimiento considerablemente mejor que el método forEach , como lo demuestra esta prueba jsperf .

Si usted necesita o no tal desempeño es decisión suya, y en la mayoría de los casos, preferiría la expresividad sobre la velocidad. Esta diferencia de velocidad probablemente se deba a las diferencias semánticas menores entre el bucle básico y el método cuando se opera en matrices dispersas, como se señala en esta respuesta .

Si no necesita el comportamiento de forEach y / o necesita salir temprano del ciclo, puede usar Lo-Dash como alternativa, lo que también funcionará en todos los navegadores. Si está utilizando jQuery, también proporciona un $.each similar, solo tenga en cuenta las diferencias en los argumentos pasados ​​a la función de devolución de llamada en cada variación.

(En cuanto al para forEach polyfill, debería funcionar en navegadores más antiguos sin problemas, si elige seguir esa ruta).


Puede usar su función foreach personalizada que funcionará mucho mejor que Array.forEach

Debe agregar esto una vez a su código. Esto agregará una nueva función a la matriz.

function foreach(fn) {
    var arr = this;
    var len = arr.length;
    for(var i=0; i<len; ++i) {
        fn(arr[i], i);
    }
}

Object.defineProperty(Array.prototype, 'customForEach', {
    enumerable: false,
    value: foreach
});

Entonces puedes usarlo en cualquier lugar como el Array.forEach

[1,2,3].customForEach(function(val, i){

});

La única diferencia es 3 veces más rápido. https://jsperf.com/native-arr-foreach-vs-custom-foreach

ACTUALIZACIÓN: en la nueva versión de Chrome, se mejoró el rendimiento de .forEach (). Sin embargo, la solución puede proporcionar el rendimiento adicional en otros navegadores.


Llegué a esta pregunta porque buscaba una forma sencilla de mantener una colección de complementos de JavaScript útiles. Después de ver algunas de las soluciones aquí, se me ocurrió esto:

  1. Configura un archivo llamado "plugins.js" (o extensions.js o lo que sea). Mantenga sus archivos de complementos junto con ese archivo maestro.

  2. plugins.js tendrá una matriz llamada "pluginNames []" que repetiremos en cada (), luego agregaremos una etiqueta a la cabeza para cada complemento

    // configurar la matriz para que se actualice cuando agregamos o eliminamos archivos de complemento var pluginNames = ["lettering", "fittext", "butterjam", etc.]; // una etiqueta de script para cada complemento $ .each (pluginNames, function () {$ ('head'). append ('');});

  3. manualmente llame solo el archivo en su cabeza:
    <script src="js/plugins/plugins.js"></script>

Descubrí que a pesar de que todos los complementos se caían en la etiqueta de la cabeza de la forma en que debían hacerlo, el navegador no siempre los ejecutaba al hacer clic en la página o actualizar.

Descubrí que es más confiable simplemente escribir las etiquetas de script en un PHP incluido. Solo tienes que escribirlo una vez y eso es tanto trabajo como llamar al complemento usando JavaScript.





javascript arrays for-loop internet-explorer-8 iterator