Artículo: El bucle For Each

bucle

Esta es una curiosidad que noté tras intentar aprender como se hace un bucle for each en otros lenguajes aparte de los que conozco. Es interesante notar que hay lenguajes que tardaron décadas en implementarlo y otros que lo hicieron apenas nacieron, así que hoy hago un análisis de lo que aprendí al respecto.

Introducción

El bucle for each es una estructura de control que permite recorrer colecciones (como listas, arrays o mapas) de forma sencilla y legible. A diferencia del clásico for, no requiere índices ni condiciones explícitas: simplemente ejecuta una acción para cada elemento de la colección.

En lenguaje natural: “Para cada elemento en esta colección, haz esto”.

Si bien no es de las estructuras mas básicas que se enseñan en fundamentos de programación, porque es solo otra forma del bucle for, es una de las primeras cosas que se aprenden al usar arreglos y vectores debido a que, por lo general, es una herramienta nativa que se recomienda su uso.

Cada lenguaje de programación tiene su propia implementación utilizando sus propios métodos para lograr este barrido de colecciones, por lo que puede darse el caso de que el bucle for no se llame igual en todos. Así, tenemos por ejemplo, Javascript, el lenguaje que mas uso, que si cuenta con un método for each

const numeros = [1, 2, 3, 4, 5];

numeros.forEach(function(numero) {
  console.log(numero);
});

Mientras que en java, no hay un for each propiamente dicho, sino que usan un bucle for que actúa como el foreach de javascript

String[] nombres = {"Sophie", "Tim", "Anna", "John", "Melissa"};

for (String nombre : nombres) {
    System.out.println(nombre);
}

Cronología de la aparición del bucle for each y equivalentes

Uno de mis primeros errores fue creer que python seria de los primeros en implementar este bucle, pero resulta que lo hizo después de javascript, siendo que python lo hizo en el 2001 y javascript lo hizo en 1995. Pero esto me hizo incurrir en otro error. vamos viendo esta linea de tiempo para entender la situación:

Fecha de aparición
Métodos de bucle
Notas

Lisp Logo
Lisp
1958

mapcar, dolist

Primer lenguaje con estructuras funcionales para iterar.

ada horizon
ada horizon
1983

for...of

Iteración sobre arrays y rangos.

C++ logo
C++
1985

Desde C++11:

for (auto x : container)

Introducido oficialmente en C++11.

Java Logo
Java
1995
for (Type item : collection)

Añadido en 2004 con Java 5.

PHP logo
PHP
1995

foreach ($array as $value)

Introducido en PHP 4 (2000)

Javascript logo
Javascript
1995
array.forEach()

Método de array desde ECMAScript 5 (2009).

C# Logo
C#
2000

foreach (var item in collection)

Parte del lenguaje desde su primera versión

Python Logo
Python
2001

for item in iterable:

Aunque no usa

foreach

, su

for

actúa como tal.

Ruby Logo
Ruby
2003

collection.each do |item|

Iteración elegante con bloques.

Go Logo
Go
2009

for _, value := range collection

Iteración con

range

.

Swift Logo
Swift
2014

for item in collection

Sintaxis similar a Python.

Esta tabla es interesante por cuanto al ver los años en los que apareció por primera vez este bucle, puede dar una falsa impresión de innovación temprana/atraso de progreso, debido a que, por ejemplo, Lisp, en 1958 ya tenia su primer implementación de su propia versión de bucle for each, mientras que swift recién la implementaba por el año 2014. Es por esto que preparé otra linea del tiempo que permitiría entender mejor estas cronologías.

Lapso de tiempo en el que se adoptó el bucle For Each desde el nacimiento del lenguaje de programación

👆Tremendo titulazo. Ojala el SEO no me putee.

Bueno, esta cronología traerá sorpresas, puesto que hay lenguajes que son considerados modernos pero que tardaron realmente un montón en implementar algo que ya consideramos común en estos días. Los lenguajes de programación que empezaron a aparecer desde el año 2014 en adelante, ya traían esa implementación desde sus orígenes, así que podríamos poner una tasa de adopción inmediata para ellos, a pesar de que Lisp fue de los primeros en hacerlo ya por el 1958.

Año de Creación
Año de Implementación
Tiempo Transcurrido
Notas

Lisp Logo
Lisp
1958

1958

0 años

Desde el inicio con

mapcar y dolist

ada horizon
ada horizon
1983

1983

0 años

for ... of

disponible desde el diseño inicial.

C++ logo
C++
1985

2011

26 años

introducido en C++11.

Java Logo
Java Logo
1995

2004

9 años

añadido en Java 5.

PHP logo
PHP
1995

2000

5 años

introducido en PHP 4.

Javascript logo
Javascript
1995

2009

14 años

forEach()

como método de array en ECMAScript 5.

C# Logo
C#
2000

2000

0 años

foreach

incluido desde la primera versión.

Python Logo
Python
1991

1991

0 años

Su

for

actúa como

foreach

desde el inicio.

Ruby Logo
Ruby
1995

1995

0 años

each

disponible desde el comienzo.

Go Logo
Go
2009

2009

0 años

range

incluido desde el diseño inicial.

Swift Logo
Swift Logo
2014

2014

0 años

for-in

disponible desde el inicio.

Observaciones interesantes

He creado esta lista con los lenguajes de programación mas populares y de los cuales se algo, pero se notan estas curiosidades por cuanto lenguajes funcionales o modernos como Lisp, Python, Ruby y Swift nacieron con estructuras similares a foreach, mientras que lenguajes más antiguos o de sistemas como C++ tardaron décadas en adoptar una sintaxis más expresiva. En lenguajes como JavaScript, el for each no es una construcción del lenguaje sino un método de objeto, lo que influye en su rendimiento y flexibilidad.

Algunos ejemplos de uso del bucle For Each

Ya que estamos con estas, vamos viendo unos cuantos ejemplos de lenguajes de programación y sus correspondientes implementaciones de bucles For Each. Por supuesto son ejemplos muy simplificados, así que no constan la declaración de variables y otras cosas más.

🔹 C#

Utiliza foreach para nombrar su bucle

foreach (var item in lista) {
  Console.WriteLine(item);
}

🔹 Java

Mediante un selector de fila por columna, utilizaa el for clasico en lugar de tener un for each dedicado

for (String nombre : nombres) {
  System.out.println(nombre);
}

Otro ejemplo mas moderno que si usa el for each en Java

List<String> nombres = Arrays.asList("Ana", "Luis", "María", "Pedro");
 
nombres.forEach(nombre -> {
  System.out.println("Hola, " + nombre); 
});

🔹 JavaScript

El primer lenguaje en el que aprendí a usar este metodo 😀

nombres.forEach(function(nombre) {
  console.log(nombre);
});

🔹 Python

Al igual que Java, no tiene un for each aparte.

for nombre in nombres:
  print(nombre)

🔹 PHP

Utiliza el for each como un método separado de for

foreach ($nombres as $nombre) {
    echo $nombre;
}

Funcionamiento interno de los bucles en sus respectivos lenguajes de programación

Cada lenguaje de programación juzga y decide apropiado utilizar una implementación de for each de acuerdo a su propia ideología y objetivos. Por esta razón, es muy diferente como funcionan de forma interna a pesar de que de forma externa, puedan parecerse mucho entre si.

🔹 C#

Implementación:

foreach se basa en la interfaz IEnumerable y su método GetEnumerator(), que devuelve un enumerador con los métodos MoveNext() y Current.

  • Ventaja: Muy legible y seguro (no hay errores de índice).
  • Desventaja: Puede ser más lento que for en arrays simples, ya que implica llamadas a métodos y boxing en algunos casos.

🔹 Java

Implementación: Usa internamente un Iterator sobre colecciones que implementan Iterable.

  • Ventaja: Evita errores de índice y es más limpio.
  • Desventaja: No permite modificar la colección durante la iteración (lanza ConcurrentModificationException).

Actualización:

Un lector hace este aporte:

El iterator ya quedo muy viejo, no se usa mas, aunque se puede encontrar en proyectos legacy.

// Array de Strings
String[] miArray = {"manzana", "banana", "cereza"};

// Convertir el array a una lista
List<String> miLista = Arrays.asList(miArray);

// miLista ahora contiene los mismos elementos que miArray
System.out.println(miLista); // Salida: [manzana, banana, cereza]

// Modificar un elemento en la lista
miLista.set(1, "arándano");

// El array original también se ha modificado
System.out.println(Arrays.toString(miArray)); // Salida: [manzana, arándano, cereza]

🔹 JavaScript

Implementación: forEach() es un método de los arrays que toma una función callback.

  • Ventaja: Muy expresivo y funcional.
  • Desventaja: No se puede usar break o continue, lo que limita el control del flujo.

🔹 Python

Implementación: El for actúa como un foreach , usando internamente el protocolo de iteradores ( __iter__() y __next__()).

  • Ventaja: Muy flexible y elegante.
  • Desventaja: Ligeramente más lento que un bucle con índices en listas grandes si se requiere acceso posicional.

🔹 C++ (desde C++11)

Implementación: El bucle for (auto x : container) usa internamente begin() y end() del contenedor.

  • Ventaja: Limpio y moderno.
  • Desventaja: Puede generar copias innecesarias si no se usa referencia ( auto&).

🔹 PHP

Implementaciónforeach es una construcción del lenguaje que itera sobre arrays y objetos.

  • Ventaja: Muy simple de usar.
  • Desventaja: Puede duplicar internamente el array si se modifica durante la iteración.

Comparativas de rendimientos del bucle for each segun los lenguajes de programación

Según una prueba de rendimiento publicada por Andrea314, los resultados varían según el lenguaje y el tipo de colección:

 

LenguajeFor Clasico
For Each
Observaciones
C#C#
Más rápido en arrays

Más lento en arrays, similar en listas

incurre en overhead por enumeradores

JavaSimilar rendimiento

Similar rendimiento

Diferencias mínimas, depende del JIT

JavaScriptMás rápido

Más legible pero más lento

forEach tiene overhead por función callback

PythonCon índices más rápido

Estilo foreach más legible

Diferencia pequeña

C++Con índices más rápido

Range-based for más limpio

Cuidado con copias innecesarias

PHPMenos usado

Más rápido y preferido

foreach está optimizado para arrays

Conclusiones

Como programadores no necesitamos preocuparnos la gran cosa al utilizar estos métodos, a menos que necesitemos algo en especifico. Las diferencias de rendimiento entre un for y un for each son mínimas en la practica y solo serian apreciables en equipos limitados o grandes volúmenes de datos. Utiliza preferentemente cualquier implementación de for each y solo estudia alternativas si necesitas optimizar tu código.

He escrito este artículo al darme cuenta de que hay muchas cosas que no se y que doy por sentado. Esta bien repasar la historia de los lenguajes de programación y sus particularidades para tener un mayor panorama y entender mejor el mundo de la programación.

(Ya si estas apurado porque necesitas trabajar o hacer una tarea o proyecto, repasa todo superficialmente. Lo harás de todas formas. Pero te aconsejo que siempre repases las bases. Te hará la vida mas fácil mas adelante)

Notas sobre el Artículo

He usado la inteligencia artificial de Copilot para algunas aclaraciones, pero en su mayoría ha sido posible obtener estos datos desde la propia documentación públicamente disponible.

Articulo de Mozilla para forEach

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨julio de 2015⁩.

https://www.luisllamas.es/programacion-bucles/

Los bucles son estructuras de control que permiten repetir un conjunto de instrucciones varias veces. Junto con los condicionales, son dos de las herramientas más importantes a la hora de programar.

Por cierto, no conocía el sitio de Luis Llamas hasta escribir este articulo, pero esta muy bonito. Lo he agregado a mi lector de RSS.

https://drupalsapiens.com/es/blog/php/historial-y-cronologia-de-versiones-php

PHP 5

Características más relevantes

[…]Añadidos los Iteradores, interfaces que permiten personalizar los bucles foreach.[…]

Es posible encontrar información de esto en el changelog del propio proyecto PHP también

https://www.php.net/manual/en/control-structures.foreach.php

(PHP 4, PHP 5, PHP 7, PHP 8)

The foreach construct provides an easy way to iterate over arrays and Traversable objects. foreach will issue an error when used with a variable containing a different data type or with an uninitialized variable.

https://www.andrea314.eu/es/prueba-de-rendimiento-para-iteraci%C3%B3n-con-for-y-foreach.html

Tremendo articulo comparando el rendimiento al detalle de los bucles for each!

https://en.wikipedia.org/wiki/Foreach_loop

Como siempre, la wikipedia en inglés tiene más información y más detallada

C++11 range-based for statements have been implemented in GNU Compiler Collection (GCC) (since version 4.6), Clang (since version 3.0) and Visual C++ 2012 (version 11)

He usado un código css para los blockquotes que he implementado en mi plantilla, así que cito de donde lo tomé también. Hice unas cuantas modificaciones para poder utilizarlo aquí en WordPress.

Únete a mi red poniendo la URL de tu blog. Aprender más

 
Interlan
Interlan
@interlan.ec@interlan.ec

Este es mi sitio personal y profesional, donde publico mis actividades, experimentos y servicios que he ido desarrollando durante mi crecimiento profesional.

108 publicaciones
0 seguidores

Descubre más desde Interlan

Suscríbete y recibe las últimas entradas en tu correo electrónico.

,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Interlan