JS 05: Control de Flujo

Toma decisiones y domina las repeticiones.

1. Condicionales: El Cruce de Caminos

El código normalmente se lee línea por línea, pero a veces necesitas tomar decisiones.

Analogía: El Semáforo

Imagina que llegas a un semáforo.

  • IF (Si...): SI está verde, cruzas.
  • ELSE IF (Si no, pero...): SI NO está verde, pero está ámbar, aceleras (o frenas).
  • ELSE (Si no...): SI NO es ninguna de las anteriores (está rojo), te paras.
let semaforo = "rojo";



if (semaforo === "verde") {

    console.log("¡Adelante!");

} else if (semaforo === "ambar") {

    console.log("¡Precaución!");

} else {

    console.log("¡STOP! No puedes pasar.");

}

1b. El Operador Ternario (El "If" rápido)

Existe una forma de escribir un if...else simple en una sola línea. Es muy popular entre los programadores expertos.

// Estructura: condición ? valor_si_true : valor_si_false

let edad = 20;
let tipo = (edad >= 18) ? "Adulto" : "Menor";

console.log(tipo); // "Adulto"

Consejo de Sabio 🧙‍♂️

  • ✅ Úsalo para ASIGNAR: Cuando quieres que una variable valga X o Y según una condición (como en el ejemplo de arriba).
  • ❌ NO lo uses para LÓGICA: Si tienes que meter muchas instrucciones o console.log dentro, usa un if normal. Si el ternario es muy largo y difícil de leer, lo estás usando mal.

2. Switch: El Menú del Restaurante

Cuando tienes muchos else if seguidos, el código se vuelve feo. El switch es más limpio para elegir una opción entre muchas.

let dia = "Lunes";



switch (dia) {

    case "Lunes":

        console.log("¡Ánimo con la semana!");
        break; // 🛑 ¡Importante! Si no pones break, sigue leyendo hacia abajo ("Fall-through").

    case "Viernes":

        console.log("¡Por fin es viernes!");

        break;

    case "Sábado":

    case "Domingo":

        console.log("¡Fin de semana!");

        break;

    default:
        console.log("Un día normal...");
        // ℹ️ Aquí no hace falta break porque se acaba el switch.
}

3. Tipos de Bucles: ¿Cuál usar?

Existen varias formas de repetir código en JavaScript. No hay una "mejor" absoluta, sino una herramienta adecuada para cada trabajo.

A) Bucle For Clásico

El de toda la vida. Es el más versátil porque tienes control total. Úsalo cuando:

// Ejemplo: Contar de 2 en 2 hasta 10
for (let i = 0; i <= 10; i += 2) {
    console.log("Número par: " + i);
}

// Ejemplo: Recorrer array al revés
let letras = ["A", "B", "C"];
for (let i = letras.length - 1; i >= 0; i--) {
    console.log(letras[i]); // Imprime C, B, A
}

B) Bucle For...of

Es la sintaxis más moderna y limpia. Es ideal exclusivamente para recorrer iterables (Arrays, Strings) elemento a elemento.
Úsalo cuando: Quieres leer todos los elementos de una lista y no te importa su posición (índice).

let frutas = ["Manzana", "Pera", "Plátano"];

// Mucho más limpio para leer listas
for (let fruta of frutas) {
    console.log("Me gusta la " + fruta);
}

C) Bucle For...in

Este bucle está diseñado para recorrer las propiedades de un Objeto.
⚠️ Aviso: No se recomienda usar for...in para recorrer Arrays, ya que puede ser más lento y no garantiza el orden numérico.

let coche = { marca: "Ford", modelo: "Mustang", anyo: 1969 };

for (let propiedad in coche) {
    // propiedad valdrá "marca", luego "modelo"...
    console.log(propiedad + ": " + coche[propiedad]);
}

Resumen Rápido

  • ¿Es un Array o String? → Usa for...of (más legible).
  • ¿Es un Objeto? → Usa for...in (para las claves).
  • ¿Necesitas índices o contar? → Usa for clásico.

3b. Bucles While y Do While

Los bucles while y do while son diferentes a los bucles for porque no necesariamente sabes cuántas veces se repetirán. Se ejecutan mientras una condición sea verdadera.

D) Bucle While (Mientras...)

El bucle while primero verifica la condición y luego ejecuta el código. Si la condición es falsa desde el principio, el bucle nunca se ejecuta.

Analogía: La Pila de Platos

Imagina que estás lavando platos. Mientras haya platos sucios en la pila, seguirás lavando. Si la pila está vacía desde el principio, no lavas ningún plato.

// Sintaxis básica
while (condición) {
    // Código a repetir
}

// Ejemplo: Contar mientras el número sea menor que 5
let numero = 1;

while (numero <= 5) {
    console.log("Número: " + numero);
    numero++; // ⚠️ ¡IMPORTANTE! Si no incrementas, es un bucle infinito
}

// Ejemplo práctico: Juego de adivinanzas
let secreto = 7;
let intento = 0;

while (intento !== secreto) {
    intento = Math.floor(Math.random() * 10); // Número aleatorio 0-9
    console.log("Intento: " + intento);
}
console.log("¡Adivinaste!");

E) Bucle Do While (Haz... Mientras)

El bucle do while primero ejecuta el código y luego verifica la condición. Esto garantiza que el código se ejecute al menos una vez, incluso si la condición es falsa.

Analogía: El Menú del Restaurante

En un restaurante, el camarero siempre te pregunta al menos una vez si quieres postre, incluso si ya estás lleno. Después de tu respuesta, volverá a preguntar solo si dijiste "sí".

// Sintaxis básica
do {
    // Código a ejecutar (se ejecuta AL MENOS 1 VEZ)
} while (condición);

// Ejemplo: Validar entrada del usuario
let respuesta;

do {
    respuesta = prompt("¿Continuar? (si/no)");
} while (respuesta !== "si" && respuesta !== "no");

console.log("Respuesta válida: " + respuesta);

// Ejemplo: Contador que se ejecuta una vez aunque la condición sea falsa
let contador = 10;

do {
    console.log("Contador: " + contador); // Se imprime "10" una vez
    contador++;
} while (contador < 10); // La condición es falsa, pero ya se ejecutó una vez

⚠️ ¡Cuidado con los Bucles Infinitos!

Si la condición de un while o do while nunca se vuelve falsa, el bucle seguirá ejecutándose eternamente y tu navegador se congelará.

// ❌ BUCLE INFINITO - ¡NO HAGAS ESTO!
while (true) {
    console.log("Esto nunca termina...");
}

// ✅ CORRECTO - Siempre asegúrate de que la condición cambie
let i = 0;
while (i < 5) {
    console.log(i);
    i++; // La condición eventualmente será falsa
}

3c. ¿Cuándo usar cada bucle? - Guía de Decisión

Elegir el bucle correcto hace que tu código sea más legible y eficiente. Aquí está la guía definitiva:

🎯 Tabla de Decisión Rápida

Situación Bucle a Usar Razón
Sabes EXACTAMENTE cuántas veces repetir for Contador explícito y claro
Recorrer todos los elementos de un Array/String for...of Sintaxis más limpia y legible
Recorrer propiedades de un Objeto for...in Diseñado específicamente para objetos
NO sabes cuántas veces, depende de una condición while Continúa hasta que algo cambie
Debe ejecutarse AL MENOS UNA VEZ do while Garantiza una ejecución mínima
Validar entrada del usuario do while Siempre preguntas al menos una vez
Leer datos hasta encontrar un valor específico while No sabes cuándo aparecerá

Ejemplos Comparativos

Ejemplo 1: Contar hasta 10

// ✅ MEJOR: for (sabes exactamente cuántas veces)
for (let i = 1; i <= 10; i++) {
    console.log(i);
}

// ⚠️ FUNCIONA pero es innecesario complicado
let i = 1;
while (i <= 10) {
    console.log(i);
    i++;
}

Ejemplo 2: Buscar un valor en un array

let numeros = [3, 7, 12, 9, 15, 4];
let buscado = 9;

// ✅ MEJOR: for...of (recorrer elementos)
for (let num of numeros) {
    if (num === buscado) {
        console.log("¡Encontrado!");
        break;
    }
}

// ✅ TAMBIÉN VÁLIDO: while (si prefieres más control)
let indice = 0;
let encontrado = false;

while (indice < numeros.length && !encontrado) {
    if (numeros[indice] === buscado) {
        console.log("¡Encontrado en posición " + indice + "!");
        encontrado = true;
    }
    indice++;
}

Ejemplo 3: Validar contraseña

// ✅ MEJOR: do while (debe preguntar al menos una vez)
let password;

do {
    password = prompt("Introduce tu contraseña (mínimo 8 caracteres):");
} while (password.length < 8);

console.log("Contraseña válida!");

💡 Regla de Oro

  • ¿Sabes cuántas veces?for
  • ¿Es una lista/array?for...of
  • ¿Es un objeto?for...in
  • ¿Condición desconocida?while
  • ¿Al menos una vez?do while

4. Controlando el Bucle: Break y Continue

A veces quieres salirte de la pista antes de terminar las vueltas.

Break (Freno de Emergencia)

Rompe el bucle y sale inmediatamente.

for (let i = 1; i <= 10; i++) {

    if (i === 5) {

        console.log("¡Encontré el 5! Me voy.");

        break; // Deja de contar

    }

    console.log(i);

}

Continue (Saltar Turno)

Se salta la vuelta actual y pasa a la siguiente.

for (let i = 1; i <= 5; i++) {

    if (i === 3) {

        console.log("Me salto el 3");

        continue; // No imprime el 3, pasa al 4

    }

    console.log("Número: " + i);

}
Volver a JS