Cuándo usar un bucle while en JavaScript
El for brilla cuando sabes el rango de antemano: "hazlo 10 veces", "recorre todos los índices de este array". El bucle while en JavaScript es para el otro caso: seguir iterando hasta que algo cambie. No sabes cuántas vueltas va a dar, solo conoces la condición que te hace parar.
La sintaxis del while es mínima:
JavaScript evalúa la condición entre paréntesis. Si es truthy, se ejecuta el bloque. Luego vuelve a comprobar la condición, y otra vez, y otra, hasta que se vuelve falsy. Si te olvidas del count++, la condición nunca cambia: bienvenido al bucle infinito.
El modelo mental: comprueba, ejecuta, repite
Para que un bucle while tenga sentido, se tienen que cumplir tres cosas:
- Algo de lo que dependa la condición.
- Una forma de que el cuerpo del bucle modifique ese algo.
- Que, tarde o temprano, la condición acabe siendo falsa.
Si falta cualquiera de las tres, tienes un problema. El bug clásico es olvidarse del paso 2:
let count = 0;
while (count < 5) {
console.log(count);
// forgot to increment count — loops forever
}
Eso corre hasta que mates el proceso. En un servidor, el daño es real. Pregúntate siempre: ¿qué dentro del cuerpo va a hacer que la condición se vuelva falsa?
Un caso real: cuando no sabes cuándo parar
Aquí es donde while le gana a for. Estás consumiendo elementos de algún sitio y no tienes ni idea de cuántos hay hasta que los agotas:
shift() quita el primer elemento y lo devuelve. El bucle se ejecuta mientras la cola tenga algo dentro, y termina solo cuando se queda vacía. Podrías hacer esto con un for, pero estarías forzando la forma del problema: el while expresa la intención de forma mucho más clara.
do...while en JavaScript: primero ejecuta, luego pregunta
El bucle do...while en JavaScript invierte el orden: ejecuta el cuerpo y después comprueba la condición. Así se garantiza al menos una iteración:
El cuerpo siempre se ejecuta al menos una vez, aunque la condición sea falsa desde el inicio. Compáralo con un while normal: si la condición es falsa, no se ejecuta ni una sola iteración.
Un caso típico: pedirle algo al usuario, validar la respuesta y volver a preguntarle si no sirve. Como siempre quieres preguntar al menos una vez, do...while encaja perfectamente.
Fíjate en el punto y coma después del ) de cierre: a diferencia de while y for, do...while sí lo necesita.
break: salir de un bucle antes de tiempo
break sale del bucle más cercano de inmediato. Es la forma de cortar cuando la condición natural del bucle no termina de ajustarse a lo que necesitas:
En cuanto se ejecuta break, no corre nada más dentro del bucle: ni el resto del cuerpo, ni una nueva comprobación de la condición. Te saliste, punto.
while (true) con break
Cuando la condición de salida se expresa mejor dentro del cuerpo que en la cabecera, dale la vuelta al planteamiento: haz un bucle infinito y sal con break cuando toque.
Dos formas de salir: por éxito o por un límite de seguridad. Ese límite importa. Un while (true) sin un break garantizado es un bucle infinito esperando a ocurrir.
continue: saltar a la siguiente iteración
continue salta directo a la comprobación de la condición, ignorando el resto del cuerpo de la iteración actual:
Un detalle que pilla a muchos: si lo que hace avanzar el bucle está después del continue, acabas de crear un bucle infinito. En el ejemplo anterior, n++ va antes del continue, así que no hay problema. Pero si lo pones después, n se queda clavado en un número par para siempre.
while vs for en JavaScript: ¿cuál usar?
Una regla práctica bastante mecánica:
- Contar o recorrer un rango conocido →
for. Confor (let i = 0; i < arr.length; i++)tienes la inicialización del contador, la condición y el incremento en la misma línea. - Recorrer una colección →
for...of. Mucho más limpio que andar gestionando un índice a mano. - Repetir hasta que cambie cierto estado →
while. Procesar una cola, hacer polling, consumir un stream, reintentar hasta que algo salga bien. - Ejecutar al menos una vez sí o sí →
do...while.
En teoría son intercambiables: cualquier for se puede reescribir como while y al revés. Pero elegir el que encaja con la forma del problema hace que el código se explique solo.
Bucles infinitos en JavaScript: la única regla
Todo bucle while necesita una respuesta clara a una pregunta: ¿qué hace que esto pare?
O bien la condición de la cabecera termina siendo false en algún momento, o hay un break que se ejecuta seguro. Si no puedes señalar una de las dos cosas, el bucle todavía no está terminado.
// Mal: la condición nunca cambia
let ready = false;
while (!ready) {
console.log("esperando...");
// aquí dentro nada cambia `ready`
}
// Bien: el cuerpo afecta a la condición
let ready = false;
let checks = 0;
while (!ready) {
checks++;
if (checks >= 3) ready = true;
}
En el navegador, un bucle infinito congela la pestaña. En Node, te deja un núcleo de CPU al 100% hasta que mates el proceso. Mejor detectarlos antes de subir el código a producción.
Siguiente paso: for...of y for...in
while es ideal para los casos de "repetir hasta que algo cambie". Pero cuando lo que quieres es recorrer arrays, strings u objetos elemento a elemento, JavaScript tiene dos formas de bucle pensadas justo para eso: for...of y for...in, que veremos a continuación.
Preguntas frecuentes
¿Qué es un bucle while en JavaScript?
Un bucle while ejecuta su bloque una y otra vez mientras la condición sea verdadera (truthy). JavaScript primero evalúa la condición, después corre el bloque y vuelve a evaluar. Si la condición es falsa desde el principio, el cuerpo no llega a ejecutarse ni una sola vez.
¿Cuál es la diferencia entre while y do...while?
while comprueba la condición antes de ejecutar el cuerpo, por lo que puede hacer cero iteraciones. En cambio, do...while ejecuta el cuerpo una vez y luego evalúa la condición, así que siempre corre al menos una vez. Tira de do...while cuando la primera iteración tiene que ocurrir sí o sí, por ejemplo al pedir datos al usuario.
¿Cómo se sale de un bucle while en JavaScript?
Usa break para salir del bucle al instante, o continue para saltar a la siguiente iteración. break es justo lo que te permite trabajar con while (true) de forma segura: haces un bucle infinito y lo cortas con break cuando se cumple la condición que te interesa dentro del cuerpo.