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.
- 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: 5i 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
- inicialización:
let i = 1- Se ejecuta una sola vez al inicio, aquí declaramos e inicializamos el contador. - condición:
i <= 5- Se evalúa antes de cada iteración. Si es verdadera, el bucle continúa. - actualización:
i++- Se ejecuta al final de cada iteración, incrementando el contador. - 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: uvai <= 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!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.// ❌ 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 obligatorioVeamos 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 vezdo-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? |
|---|---|---|
for | Cuando conoces el número exacto de iteraciones | No |
while | Cuando la condición puede no cumplirse nunca | No |
do-while | Cuando necesitas ejecutar el código al menos una vez | Sí |
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 resultadoEjemplo 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)); // 5040Controlando 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í sucesivamenteResumen
Los ciclos son herramientas esenciales que te permiten automatizar tareas repetitivas. Aquí tienes las claves finales:
- Usa
forcuando sepas exactamente cuántas veces necesitas repetir algo - Usa
whilecuando no sepas cuántas veces se repetirá, pero tengas una condición clara - Usa
do-whilecuando necesites ejecutar el código al menos una vez - Siempre asegúrate de que tus ciclos tengan una forma de terminar
- Utiliza
breakycontinuepara controlarlos mejor
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.¿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
¿Qué palabra clave se usa para salir inmediatamente de un ciclo?
- A) exit
- B) stop
- C) break
- D) return
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
i < 5 o i <= 4.