Ciclos: for, while y do-while

Lectura
30 min~7 min lectura
CONCEPTO CLAVE: Los ciclos (o bucles) son estructuras de control que permiten ejecutar un bloque de código múltiples veces. En JavaScript, tenemos tres ciclos principales: for, while y do-while. Cada uno tiene sus propias características y casos de uso ideales.

¿Por qué necesitamos los ciclos?

Imagina que necesitas mostrar los números del 1 al 100 en la consola. Sin ciclos, tendrías que escribir console.log(1), console.log(2), y así sucesivamente hasta 100. Los ciclos nos permiten automatizar esta tarea repetitiva con solo unas pocas líneas de código.

📌 Los ciclos son fundamentales en programación porque nos permiten:
  • Repetir acciones sin código duplicado
  • Recorrer arrays y objetos
  • Automatizar tareas repetitivas
  • Procesar datos de manera eficiente

El ciclo for

El ciclo for es el más utilizado cuando conoces de antemano cuántas veces necesitas repetir algo. Su sintaxis tiene tres partes: inicialización, condición y actualización.

for (inicialización; condición; actualización) {
  // código a ejecutar en cada iteración
}

Veamos un ejemplo práctico donde mostramos los números del 1 al 5:

for (let i = 1; i <= 5; i++) {
  console.log("Número: " + i);
}

// Resultado:
// Número: 1
// Número: 2
// Número: 3
// Número: 4
// Número: 5
💡 Consejo: La variable i es una convención muy común que significa "índice". Puedes nombrarla como quieras, pero i, j, k son los nombres tradicionales para contadores de bucles.

Desglose del ciclo for

  1. inicialización: let i = 1 - Se ejecuta una sola vez al inicio, aquí declaramos e inicializamos el contador.
  2. condición: i <= 5 - Se evalúa antes de cada iteración. Si es verdadera, el bucle continúa.
  3. actualización: i++ - Se ejecuta al final de cada iteración, incrementando el contador.
  4. código: El bloque entre llaves se ejecuta mientras la condición sea verdadera.

Recorrer un array con for

Una de las aplicaciones más comunes del ciclo for es recorrer los elementos de un array:

const frutas = ["manzana", "plátano", "naranja", "uva"];

for (let i = 0; i < frutas.length; i++) {
  console.log("Fruta " + (i + 1) + ": " + frutas[i]);
}

// Resultado:
// Fruta 1: manzana
// Fruta 2: plátano
// Fruta 3: naranja
// Fruta 4: uva
⚠️ Advertencia: Un error común es usar i <= frutas.length en lugar de i < frutas.length. Esto causaría un error "undefined" porque estarías intentando acceder a un índice que no existe (recuerda que los arrays تبدأ من 0).

El ciclo while

El ciclo while se usa cuando no sabes exactamente cuántas veces necesitas repetir algo, pero tienes una condición que debe cumplirse para continuar.

while (condición) {
  // código a ejecutar
  // IMPORTANTE: algo debe cambiar para que la condición se vuelva falsa
}

Veamos un ejemplo donde simulamos un juego donde el jugador debe adivinar un número:

const numeroSecreto = 7;
let intento = 0;
let adivinado = false;

while (!adivinado) {
  intento++;
  const miIntento = Math.floor(Math.random() * 10) + 1;
  
  if (miIntento === numeroSecreto) {
    console.log("¡Adivinaste en el intento " + intento + "!");
    adivinado = true;
  } else {
    console.log("Intento " + intento + ": No era " + miIntento);
  }
}

// Posible resultado:
// Intento 1: No era 3
// Intento 2: No era 8
// Intento 3: No era 5
// ¡Adivinaste en el intento 4!
📌 La principal diferencia con for es que en while tú controlas completamente cuándo cambia la variable de condición. Esto lo hace ideal para situaciones donde no sabes de antemano cuándo terminar.
⚠️ PELIGRO: Si la condición nunca se vuelve falsa, crearás un bucle infinito que congelará tu navegador. Siempre asegúrate de que algo dentro del while cambie la condición a falsa eventualmente.
// ❌ ESTO CREARÁ UN BUCLE INFINITO - NO EJECUTAR
while (true) {
  console.log("Esto nunca se detiene");
}

// ✅ FORMA CORRECTA
let contador = 0;
while (contador < 5) {
  console.log(contador);
  contador++; // Esto eventualmente hará que contador < 5 sea falso
}

El ciclo do-while

El do-while es similar al while, pero con una diferencia crucial: el código dentro del bloque se ejecuta al menos una vez antes de verificar la condición.

do {
  // código a ejecutar
  // se ejecuta AL MENOS una vez
} while (condición);

// Nota el punto y coma al final, es obligatorio

Veamos un ejemplo práctico: un menú que siempre se muestra al menos una vez:

let opcion;

do {
  console.log("===== MENÚ PRINCIPAL =====");
  console.log("1. Ver perfil");
  console.log("2. Editar información");
  console.log("3. Salir");
  console.log("=========================");
  
  opcion = 3; // Simulando que el usuario选择了 3
  
  switch(opcion) {
    case 1:
      console.log("Mostrando perfil...");
      break;
    case 2:
      console.log("Editando información...");
      break;
    case 3:
      console.log("¡Hasta luego!");
      break;
    default:
      console.log("Opción no válida");
  }
  
} while (opcion !== 3);

console.log("Menú cerrado correctamente");

// Aunque opcion es 3 desde el inicio, el menú se muestra una vez
💡 Consejo: Usa do-while cuando necesites que el usuario vea algo al menos una vez antes de decidir si continuar. Es perfecto para menús, formularios y validación de datos.

Comparando los tres ciclos

Ahora que conoces los tres tipos de ciclos, es importante saber cuándo usar cada uno:

Ciclo¿Cuándo usarlo?¿Se ejecuta al menos una vez?
forCuando conoces el número exacto de iteracionesNo
whileCuando la condición puede no cumplirse nuncaNo
do-whileCuando necesitas ejecutar el código al menos una vez

Ejemplo comparativo

// Misma tarea: mostrar números del 1 al 3

// Con for
for (let i = 1; i <= 3; i++) {
  console.log("for: " + i);
}

// Con while
let j = 1;
while (j <= 3) {
  console.log("while: " + j);
  j++;
}

// Con do-while
let k = 1;
do {
  console.log("do-while: " + k);
  k++;
} while (k <= 3);

// Los tres producen el mismo resultado

Ejemplo práctico: Calculadora de factorial

Vamos a crear un programa que calcule el factorial de un número usando un ciclo for. El factorial de 5 es: 5 × 4 × 3 × 2 × 1 = 120.

function calcularFactorial(numero) {
  if (numero < 0) {
    return "El factorial no existe para números negativos";
  }
  
  if (numero === 0 || numero === 1) {
    return 1;
  }
  
  let factorial = 1;
  
  for (let i = 2; i <= numero; i++) {
    factorial = factorial * i;
  }
  
  return factorial;
}

console.log("Factorial de 5: " + calcularFactorial(5)); // 120
console.log("Factorial de 0: " + calcularFactorial(0)); // 1
console.log("Factorial de 7: " + calcularFactorial(7)); // 5040

Controlando los ciclos: break y continue

JavaScript nos ofrece dos palabras clave para controlar el flujo de los ciclos:

  • break: Sale del ciclo inmediatamente
  • continue: Salta a la siguiente iteración
// Ejemplo de break: buscar un elemento
const numeros = [10, 25, 30, 45, 50, 65, 80];
const objetivo = 45;

for (let i = 0; i < numeros.length; i++) {
  console.log("Buscando en posición " + i + "...");
  
  if (numeros[i] === objetivo) {
    console.log("¡Encontrado! " + objetivo + " está en la posición " + i);
    break; // Salimos del ciclo, no necesitamos seguir buscando
  }
}

console.log("--- Ahora con continue ---\n");

// Ejemplo de continue: mostrar solo números impares
for (let i = 1; i <= 10; i++) {
  if (i % 2 === 0) {
    continue; // Saltamos los números pares
  }
  console.log("Número impar: " + i);
}

// Resultado:
// Buscando en posición 0...
// Buscando en posición 1...
// Buscando en posición 2...
// Buscando en posición 3...
// ¡Encontrado! 45 está en la posición 3

// Número impar: 1
// Número impar: 3
// Número impar: 5
// Número impar: 7
// Número impar: 9
"La diferencia entre un programador principiante y uno avanzado a menudo se ve en cómo manejan los casos límite: un programador avanzado siempre piensa en qué pasa si el array está vacío, si el número es negativo, o si el usuario introduce datos inesperados."
Ver más: Bucles anidados

A veces necesitas tener un ciclo dentro de otro ciclo. Esto se llama bucles anidados y es común cuando trabajas con matrices o tablas.

// Generar una tabla de multiplicar 1-3
for (let i = 1; i <= 3; i++) {
  console.log("\nTabla del " + i + ":");
  
  for (let j = 1; j <= 5; j++) {
    console.log(i + " x " + j + " = " + (i * j));
  }
}

// Resultado:
// Tabla del 1:
// 1 x 1 = 1
// 1 x 2 = 2
// 1 x 3 = 3
// 1 x 4 = 4
// 1 x 5 = 5

// Tabla del 2:
// 2 x 1 = 2
// ... y así sucesivamente
💡 Ten cuidado con los bucles anidados: cada nivel aumenta significativamente el número de operaciones. Dos bucles anidados con 1000 iteraciones cada uno ejecutarán 1,000,000 de iteraciones en total.

Resumen

Los ciclos son herramientas esenciales que te permiten automatizar tareas repetitivas. Aquí tienes las claves finales:

  1. Usa for cuando sepas exactamente cuántas veces necesitas repetir algo
  2. Usa while cuando no sepas cuántas veces se repetirá, pero tengas una condición clara
  3. Usa do-while cuando necesites ejecutar el código al menos una vez
  4. Siempre asegúrate de que tus ciclos tengan una forma de terminar
  5. Utiliza break y continue para controlarlos mejor
📌 En JavaScript moderno, también existen métodos de array como forEach(), map(), filter() que ofrecen alternativas más elegantes para recorrer arrays. Los aprenderás en lecciones posteriores, pero es importante dominar estos ciclos tradicionales primero.
🧠 Quiz

¿Cuál de los siguientes ciclos ejecutará el código AL MENOS una vez, incluso si la condición es falsa desde el inicio?

  • A) for
  • B) while
  • C) do-while
  • D) Ninguno de los anteriores
✅ Respuesta correcta: C) do-while. La característica distintiva del ciclo do-while es que evalúa la condición después de ejecutar el bloque de código, garantizando al menos una ejecución.
🧠 Quiz

¿Qué palabra clave se usa para salir inmediatamente de un ciclo?

  • A) exit
  • B) stop
  • C) break
  • D) return
✅ Respuesta correcta: C) break. La palabra clave break termina el ciclo inmediatamente y continúa con la siguiente instrucción después del ciclo.
🧠 Quiz

Si tienes un array con 5 elementos y usas un ciclo for con let i = 0; i <= 5; i++, ¿qué pasará?

  • A) Funcionará correctamente
  • B) Generará un error de sintaxis
  • C) Intentará acceder a un índice inexistente
  • D) Solo iterará 4 veces
✅ Respuesta correcta: C) Intentará acceder a un índice inexistente. Con 5 elementos (índices 0-4), intentar acceder a índice 5 devolverá undefined. La condición correcta debería ser i < 5 o i <= 4.