¿Cuál es el estándar actual en 2017 en Javascript con bucles for () frente a .forEach?
Actualmente estoy trabajando mi camino a través de Colt Steele "Web Dev Bootcamp" en Udemy y está a favor de forEach
más for
en sus enseñanzas. Sin embargo, he buscado varias cosas durante los ejercicios como parte del trabajo del curso y encuentro más y más recomendaciones para usar un for
-loop en lugar de forEach
. La mayoría de la gente parece afirmar que el ciclo for es más eficiente.
¿Es esto algo que ha cambiado desde que se escribió el curso (alrededor de 2015) o son realmente los pros y los contras de cada uno, que se aprenderá con más experiencia?
Cualquier consejo será muy apreciado.
javascript
loops
for-loop
foreach
tonyrobbins
fuente
fuente
for
es difícil de superar por pura velocidad.forEach()
invoca una devolución de llamada para cada iteración; por lo que obviamente lleva consigo algunos gastos generales.map
únicamente para la iteración y descarta la nueva matriz que genera. No sé cuántas personas he tenido que corregir en esa opción de función en particular solo en este sitio.Respuestas:
para
for
los bucles son mucho más eficientes. Es una construcción de bucle diseñada específicamente para iterar mientras una condición es verdadera , al mismo tiempo que ofrece un mecanismo de pasos (generalmente para aumentar el iterador). Ejemplo:Esto no sugiere que los bucles for siempre serán más eficientes, solo que los motores y navegadores JS los han optimizado para serlo. A lo largo de los años, ha habido compromisos en cuanto a qué construcción de bucle es más eficiente (para, mientras, reducir, invertir-mientras, etc.): diferentes navegadores y motores JS tienen sus propias implementaciones que ofrecen diferentes metodologías para producir los mismos resultados. A medida que los navegadores se optimizan aún más para satisfacer las demandas de rendimiento, teóricamente se
[].forEach
podría implementar de tal manera que sea más rápido o comparable a unfor
.Beneficios:
break
ycontinue
)i<n
puede ser cualquier cosa y no estar vinculado al tamaño de una matriz)var i
dejai
disponible después de que finaliza el ciclo)para cada
.forEach
son métodos que iteran principalmente sobre matrices (también sobre otros enumerables, comoMap
ySet
objetos). Son más nuevos y proporcionan un código que es subjetivamente más fácil de leer. Ejemplo:Beneficios:
En el ejemplo anterior,
val
sería un parámetro de la función recién creada. Por lo tanto, cualquier variable llamadaval
antes del ciclo mantendría sus valores después de que finalice.Actuación
El rendimiento es un tema complicado, que generalmente requiere algo de experiencia cuando se trata de previsión o enfoque. Para determinar de antemano (durante el desarrollo) cuánta optimización puede ser necesaria, un programador debe tener una buena idea de la experiencia pasada con el caso del problema, así como una buena comprensión de las posibles soluciones.
El uso de jQuery en algunos casos puede ser demasiado lento a veces (un desarrollador experimentado puede saber eso), mientras que otras veces puede no ser un problema, en cuyo caso la compatibilidad de la biblioteca con el navegador cruzado y la facilidad para realizar otras funciones (por ejemplo, AJAX, manejo de eventos) valdría la pena el tiempo de desarrollo (y mantenimiento) ahorrado.
Otro ejemplo es, si el rendimiento y la optimización lo fueran todo, no habría otro código que máquina o ensamblaje. Obviamente, ese no es el caso, ya que hay muchos lenguajes diferentes de alto y bajo nivel, cada uno con sus propias compensaciones. Estas compensaciones incluyen, entre otras, especialización, facilidad y velocidad de desarrollo, facilidad y velocidad de mantenimiento, código optimizado, código libre de errores, etc.
Acercarse
Si no comprende bien si algo requerirá un código optimizado, generalmente es una buena regla general escribir primero código mantenible. A partir de ahí, puede probar e identificar qué necesita más atención cuando sea necesario.
Dicho esto, ciertas optimizaciones obvias deberían ser parte de la práctica general y no requieren ningún pensamiento. Por ejemplo, considere el siguiente ciclo:
Para cada iteración del ciclo, JavaScript recupera las
arr.length
operaciones de costeo de búsqueda de claves en cada ciclo. No hay ninguna razón por la que esto no debería ser:Esto hace lo mismo, pero solo se recupera
arr.length
una vez, almacenando en caché la variable y optimizando su código.fuente
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Creo que con lalet
declaración para declarar una variable local de alcance de bloque, el segundo beneficio deforEach
ya no es una ventaja sobre elfor
bucle a menos que esté en un entorno sin soporte paralet
.