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 | |
| 1958 |
| Primer lenguaje con estructuras funcionales para iterar. |
| 1983 |
| Iteración sobre arrays y rangos. |
| 1985 | Desde C++11:
| Introducido oficialmente en C++11. |
| 1995 | for (Type item : collection) | Añadido en 2004 con Java 5. |
| 1995 |
| Introducido en PHP 4 (2000) |
| 1995 | array.forEach() | Método de array desde ECMAScript 5 (2009). |
| 2000 |
| Parte del lenguaje desde su primera versión |
| 2001 |
| Aunque no usa foreach , su for actúa como tal. |
| 2003 |
| Iteración elegante con bloques. |
| 2009 |
| Iteración con range . |
| 2014 |
| 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 | |
| 1958 | 1958 | 0 años | Desde el inicio con
|
| 1983 | 1983 | 0 años | disponible desde el diseño inicial. |
| 1985 | 2011 | 26 años | introducido en C++11. |
| 1995 | 2004 | 9 años | añadido en Java 5. |
| 1995 | 2000 | 5 años | introducido en PHP 4. |
| 1995 | 2009 | 14 años | como método de array en ECMAScript 5. |
| 2000 | 2000 | 0 años | incluido desde la primera versión. |
| 1991 | 1991 | 0 años | Suactúa como desde el inicio. |
| 1995 | 1995 | 0 años | disponible desde el comienzo. |
| 2009 | 2009 | 0 años | incluido desde el diseño inicial. |
| 2014 | 2014 | 0 años | 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
foren 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
breakocontinue, 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ón: foreach 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:
| Lenguaje | For 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 |
| Java | Similar rendimiento | Similar rendimiento | Diferencias mínimas, depende del JIT |
| JavaScript | Más rápido | Más legible pero más lento | forEach tiene overhead por función callback |
| Python | Con í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 |
| PHP | Menos 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
foreachconstruct provides an easy way to iterate over arrays and Traversable objects.foreachwill 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.















