Command Palette

Search for a command to run...

Iteración: for...in y for...of

Los bucles for...in y for...of son formas modernas de iterar sobre objetos e iterables en JavaScript, cada uno diseñado para casos de uso específicos.

Lectura: 12 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • for...in itera sobre las claves (propiedades) de un objeto
  • for...of itera sobre los valores de un iterable (arrays, strings, etc.)
  • Usa for...in para objetos, for...of para arrays y colecciones
  • for...in incluye propiedades heredadas del prototipo
  • for...of solo funciona con iterables, no con objetos simples
  • for...of es más seguro y predecible que for...in para arrays
  • for...of fue introducido en ES6 (2015)

¿Qué son for...in y for...of?

for...in y for...of son dos tipos de bucles introducidos en JavaScript para simplificar la iteración sobre colecciones. Aunque su sintaxis es similar, tienen propósitos completamente diferentes y no son intercambiables.

for...in itera sobre las claves enumerables de un objeto (nombres de propiedades), mientras que for...of itera sobre los valores de objetos iterables como arrays, strings, Maps y Sets. Elegir el correcto según tu caso de uso evita errores sutiles y hace tu código más expresivo.

for...in para objetos

El bucle for...in está diseñado para iterar sobre las propiedades enumerables de un objeto. En cada iteración, la variable recibe el nombre de una propiedad (clave) del objeto, no su valor.

for-in-objetos.js
Loading code...

for...in recorre todas las propiedades enumerables del objeto, incluyendo las heredadas del prototipo. La variable del bucle contiene el nombre de la propiedad (string), no el valor. Para acceder al valor, debes usar la notación de corchetes: objeto[clave]. Es la forma más natural de iterar sobre las propiedades de un objeto plano.

Itera sobre claves, no valores

for...in te da las claves (nombres de propiedades) del objeto. Para obtener el valor, usa objeto[clave]. Esto es diferente a for...of que da valores directamente.

for...of para arrays

El bucle for...of está diseñado para iterar sobre los valores de objetos iterables. A diferencia de for...in, obtienes directamente los valores, no los índices o claves.

for-of-arrays.js
Loading code...

for...of recorre los valores del array en orden, similar a .forEach() pero con la ventaja de poder usar break y continue. No tienes acceso directo al índice, pero puedes usar array.entries() si lo necesitas. Es más limpio y menos propenso a errores que un bucle for tradicional cuando solo necesitas los valores.

Forma moderna de iterar arrays

for...of es la forma más limpia de iterar sobre valores de arrays en JavaScript moderno. A diferencia del for clásico, no necesitas manejar índices manualmente.

Diferencias clave

La diferencia fundamental entre for...in y for...of es qué iteran: for...in itera sobre claves (propiedades), mientras for...of itera sobre valores. Esta diferencia define cuándo usar cada uno.

for-in-vs-for-of.js
Loading code...

Con arrays, for...in te da los índices como strings ("0", "1", "2"), mientras for...of te da los valores directamente. Con objetos, for...in funciona perfectamente dando las claves, pero for...of falla porque los objetos planos no son iterables. Usa for...in para objetos, for...of para arrays y otros iterables.

for...of con strings

Los strings son iterables en JavaScript, por lo que puedes usar for...of para recorrer cada carácter. Esto es más limpio que acceder a caracteres por índice con un bucle tradicional.

for-of-strings.js
Loading code...

for...of trata los strings como secuencias de caracteres, iterando sobre cada uno. Maneja correctamente caracteres Unicode que ocupan múltiples bytes, a diferencia de acceder por índice. Es especialmente útil cuando necesitas procesar cada carácter de un string sin preocuparte por índices o longitudes.

Problemas con for...in

Aunque for...in es útil para objetos, tiene comportamientos inesperados con arrays y puede incluir propiedades heredadas del prototipo. Es importante conocer estas limitaciones para evitar bugs sutiles.

for-in-problemas.js
Loading code...

for...in no garantiza orden de iteración, puede incluir propiedades heredadas del prototipo, y con arrays te da índices como strings en lugar de valores. Para arrays, siempre prefiere for...of o métodos como .forEach(). Si usas for...in con objetos que podrían tener prototipos modificados, usa hasOwnProperty() para filtrar propiedades heredadas.

No uses for...in con arrays

Aunque técnicamente funciona, for...in con arrays puede causar bugs: itera sobre propiedades agregadas, no garantiza orden, y da índices como strings. Usa for...of en su lugar.

for...in vs for...of

Entender cuándo usar for...in versus for...of es fundamental para escribir código JavaScript claro y correcto. Cada uno está optimizado para diferentes tipos de datos y casos de uso.

for-in-vs-for-of-comparacion.js
Loading code...

Usa for...in cuando necesites iterar sobre las propiedades de un objeto plano. Usa for...of cuando necesites iterar sobre valores de arrays, strings, Maps, Sets u otros iterables. La regla simple: for...in para objetos, for...of para colecciones. Esto hace tu código más predecible y menos propenso a errores.

Casos prácticos

Veamos ejemplos reales de cómo usar for...in y for...of efectivamente en situaciones comunes de desarrollo, desde procesamiento de objetos hasta iteración sobre estructuras de datos modernas.

casos-practicos.js
Loading code...

Los casos prácticos muestran aplicaciones reales: copiar propiedades de objetos, contar propiedades, validar objetos, procesar arrays con lógica compleja, y trabajar con estructuras modernas como Map y Set. Cada ejemplo demuestra cuándo cada bucle es la herramienta correcta, aprovechando sus fortalezas específicas para escribir código más expresivo y mantenible.

Resumen

Resumen: for...in y for...of

Conceptos principales:

  • for...in itera sobre claves (propiedades) de objetos
  • for...of itera sobre valores de iterables (arrays, etc.)
  • for...in incluye propiedades heredadas del prototipo
  • for...of solo funciona con objetos iterables
  • for...of introducido en ES6 (2015)

Mejores prácticas:

  • Usa for...in exclusivamente para objetos planos
  • Usa for...of para arrays, strings, Maps y Sets
  • Nunca uses for...in con arrays (bugs potenciales)
  • Usa hasOwnProperty() con for...in si hay prototipos
  • Prefiere for...of sobre for tradicional cuando aplique