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:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
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 un for
.
Beneficios:
- eficiente
- terminación anticipada del ciclo (honores
break
y continue
)
- control de condición (
i<n
puede ser cualquier cosa y no estar vinculado al tamaño de una matriz)
- alcance variable (
var i
deja i
disponible después de que finaliza el ciclo)
para cada
.forEach
son métodos que iteran principalmente sobre matrices (también sobre otros enumerables, como Map
y Set
objetos). Son más nuevos y proporcionan un código que es subjetivamente más fácil de leer. Ejemplo:
[].forEach((val, index)=>{
...
});
Beneficios:
- no implica la configuración de variables (itera sobre cada elemento de la matriz)
- functions / arrow-functions amplían la variable al bloque
En el ejemplo anterior, val
sería un parámetro de la función recién creada. Por lo tanto, cualquier variable llamada val
antes del ciclo mantendría sus valores después de que finalice.
- subjetivamente más mantenible, ya que puede ser más fácil identificar qué está haciendo el código: está iterando sobre un enumerable; mientras que un bucle for podría usarse para cualquier número de esquemas de bucle
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:
for (var i=0; i < arr.length; ++i ){}
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:
for (var i=0, n=arr.length; i < n; ++i){}
Esto hace lo mismo, pero solo se recupera arr.length
una vez, almacenando en caché la variable y optimizando su código.