En JavaScript, ¿un bucle for es una mala práctica?

No creo que “mala práctica” sea el término apropiado. No hay nada particularmente “malo” en un bucle for. Los métodos que mencionó, como map o forEach, son más modernos en sus implementaciones, ya que se ajustan a la tendencia actual (o recurrente) de la programación funcional en Javascript. Y, como usted dice, el uso de los métodos anteriores tiende a hacer que su código sea mucho más fácil de entender y más compacto. Con los bucles for, tendrás que trabajar un poco más con ellos para que sean más legibles. Por lo que vale, los bucles while no sufren el problema de legibilidad tan mal como los bucles for.

Sin embargo, es importante tener en cuenta que esto no hace que los bucles sean inútiles. La programación funcional no se trata de velocidad o eficiencia, sino de capacidad de composición y mantenimiento de su código. Simplemente se ve más agradable en general. Pero los bucles tienden a ser MUCHO (y me refiero a MUCHO) más rápido que los métodos de programación funcional. Si está lidiando con un cuello de botella en el rendimiento de su aplicación porque tiene una lista muy grande de objetos masivos para moverse y ya está utilizando un algoritmo de búsqueda bastante eficiente, un bucle es probablemente la siguiente mejor opción para probar. En cuanto al rendimiento, un bucle siempre superará el mapa, la reducción, el filtro o cualquier otra cosa, por un margen bastante grande, y tiende a ser más eficiente en la memoria.

Entonces no se trata de cuál es una “mala práctica”. Se trata de qué herramienta utilizar para lograr lo que necesita lograr. En general, el uso de los métodos mencionados anteriormente es bueno para la legibilidad. Sin embargo, si la memoria y la velocidad están a la orden del día, como cuando el rendimiento ultra alto de su aplicación es una demanda crítica, entonces los bucles probablemente le darán esa ventaja adicional.

Por lo tanto, mi recomendación es: usar map, reduce, filter y forEach de forma predeterminada, pero use un bucle cuando la optimización sea absolutamente necesaria.

(Lo anterior también se aplica al método “cada” de jQuery).

Para los bucles son generalmente superiores. Algo así como forEach no puede hacer cosas como ordenar, comparar, acumular, eliminar duplicados, etc. porque debe proporcionar una llamada a la función. De forma similar, el mapeo y el filtro no le permiten decidir si algún elemento debe manejarse de manera diferente como una excepción, como valores negativos, valores no inicializados, etc.

La pregunta es realmente una de programación procesal versus funcional, y en mi opinión, el procedimiento casi siempre es superior porque brinda el máximo control del programador sobre exactamente los resultados que desea.

For-loops introduce el estado a su programa. Y el estado es malo .

Imagina que estás haciendo malabares con 2 bolas. Esta bien. Puedes manejar eso. Pero cuando agrega otra pelota, y otra más, en algún momento su desempeño artístico se estrellará . Lo mismo ocurre con las variables en su programa. Cuanto más se presente, más difícil será administrar el estado de su programa. Se ahogará en los efectos secundarios en su mayor parte. Un bucle for utiliza variables para gestionar el progreso del bucle. Por lo tanto, se suma a la complejidad del estado del programa.

Lo que quieres es un programa sin estado: sin estado. Javascript es una gran elección para eso, ya que permite la programación funcional. Con ese paradigma, tiene el lujo de las funciones de orden superior. Ya los encontraste (mapear, filtrar, reducir). Úselos y disfrute de la programación sin efectos secundarios.

Creo que está bien usar forEach, map, y filter cuando esas funciones tienen sentido, y está bien usarlo para bucles cuando estas últimas tienen sentido.

A veces no estás iterando sobre todos los datos. A veces no solo estás haciendo algo trivial para cada elemento.

A veces se trata de una matriz que se siente bien al iterar con un bucle tradicional. Quizás cada dos veces que acceda a la matriz tenga una razón justificada para usar un bucle for tradicional, pero hay un lugar que podría usar forEach; Yo diría que está bien seguir usando el bucle for para paralelismo, y está bien usar forEach en ese caso.

Lo que es una mala práctica es exigir que se realicen copias de matriz adicionales innecesarias con map, o que para cada uno se use exclusivamente cuando realmente tenga sentido por razones de rendimiento o de otra manera usar el nativo for loop.

Aparte del hecho de que la sintaxis no es fea, simplemente no es familiar. Pregúntele a cualquier programador de C con más de 5 años de experiencia. Te acostumbras. 😉

Es importante comprender que la sintaxis de corchetes de Javascript Array ( [] ) para acceder a las indicaciones en realidad se hereda del Object

obj.prop === obj [‘prop’] // verdadero

La estructura for..in no funciona como un for..each/in más tradicional que se encontraría en otros lenguajes (php, python, etc.).

Javascript for..in está diseñado para iterar sobre las propiedades de un objeto . Produciendo la clave de cada propiedad. Con esta tecla combinada con la sintaxis de corchetes del Object , puede acceder fácilmente a los valores que busca.

var obj = {foo: “bar”, fizz: “buzz”, moo: “muck”}; for (var prop in obj) {console.log (prop); // foo / fizz / moo console.log (obj [prop]); // bar / buzz / muck}

Y debido a que la matriz es simplemente un objeto con nombres de propiedad numéricos secuenciales (índices), for..in funciona de manera similar, produciendo las indicaciones numéricas tal como produce los nombres de propiedades anteriores.

Una característica importante de la estructura for..in es que continúa buscando propiedades enumerables en la cadena de prototipos. También iterará propiedades enumerables heredadas . hasOwnProperty() usted verificar que la propiedad actual existe directamente en el objeto local y no en el prototipo al que está asociado con hasOwnProperty()

for (var prop in obj) {if (obj.hasOwnProperty (prop)) {// prop es en realidad propiedad de obj (no heredada)}}

(Más sobre herencia prototípica)

El problema con el uso de la estructura for..in en el tipo Array es que no hay un asistente en cuanto al orden en que se producen las propiedades … y, en términos generales, es una característica muy importante en el procesamiento de una matriz.

Otro problema es que generalmente es más lento que un estándar for implementación.

Línea de fondo

Usar un for...in para iterar arreglos es como usar la punta de un destornillador para clavar un clavo … ¿por qué no usarías un martillo ( for )?

referencia: Cuidado con el JavaScript incorrecto para el bucle

Personalmente prefiero un bucle simple. Mi razón es que es simple, consistente y fácil de leer.

Un desarrollador novato o intermedio también podría entender fácilmente el bucle simple. Para los otros tipos de mecanismo de iteración, el desarrollador necesita aprenderlo para comprender el código. Se vuelve doloroso y propenso a errores.

Escribe tu código para mantenerlo.

No es una mala práctica per se. Por lo general, es mejor usar un mapa o para cada uno, etc., porque cuando se trata de datos, por lo general, queremos hacer algo al respecto o compararlo con algo.

Si está buscando algo mediante la búsqueda lineal, es probable que desee dejar de buscar cuando haya encontrado lo que está buscando. Esto es imposible con map / reduce. Solo obtendrá los resultados que desea con el filtro, pero supongamos que solo desea un elemento (el primero, por ejemplo).

Puede salir de un bucle for en este caso. O, si no le gusta cómo se ve en el código, use un bucle while.

Dicho esto, “hacer lo que quieres decir” generalmente se lee mejor, así que optaría por usar esas soluciones primero. Pero cuando necesita la funcionalidad de un bucle, siempre puede escribir una función para que sea más legible en su código.

Oh, vamos, gente … Está jodidamente bien.

Su programa no se irá a la mierda mágicamente si usa un bucle for, o estado, o cualquiera que sea la nueva palabra de moda del día. ¿Se puede abusar de él? Sí. Entonces puede casi cualquier cosa. Eso no lo hace inútil o inútil.

El filtro es genial, pero eso no significa que los bucles de repente no funcionen o sean el demonio. La gente ha estado usando bucles para crear cosas increíbles durante décadas.

Odio profundamente esta actitud en la industria de que las cosas son malas solo porque hay nuevas formas de hacer las cosas.

No, definitivamente no lo es, si los usas adecuadamente. Debe usar los bucles más expresivos la mayor parte del tiempo, pero los bucles básicos durante y generalmente son mucho más rápidos y se usan mejor en un código que se ejecutará decenas o cientos de miles de veces por segundo, donde la ventaja es significativa y el sacrificio por la claridad vale la pena.

Detrás de escena, todas esas funciones de orden superior usan buenos bucles anticuados (o, a veces, mientras). Es bueno abstraer esa complejidad, pero mientras sea legible, no hay nada de malo en usar la fuente.

Y podría argumentar que es una mejor práctica porque las versiones anteriores de js no tienen estas funciones de orden superior, por lo que debe rellenarlas.

Creo que estamos entrando en un campo donde cada desarrollador tiene una opinión y estas opiniones pueden ser muchas. Entonces, como me lo pidieron, daré mis dos centavos.

Me gusta mucho la programación funcional y algunas personas dicen que Javascript es un lenguaje funcional. Sí, tiene algunas herramientas. Pero un núcleo de la mayoría de los lenguajes funcionales es la inmutabilidad. Un bucle for requiere un estado mutable que es completamente compatible con Javascript. De lo contrario, generalmente no tiene sentido. Entonces, si desea escribir código JavaScript funcional, debe evitar los bucles for. Pero hay casos de uso en los que un bucle for podría tener sentido. No diría que es una mala práctica per se. Pero creo que solo hay unos pocos casos de uso en los que realmente lo necesitas. Personalmente prefiero usar reducir de mapa