Skip to content

Lección 23: break y continue

Dentro de los bucles, a veces necesitamos interrumpir el flujo normal. Para eso existen break y continue. También veremos las etiquetas (labels) para controlar bucles anidados.

break termina el bucle por completo. La ejecución continúa en la línea siguiente al bucle.

for (let i = 0; i < 10; i++) {
if (i === 5) {
break; // sale del bucle cuando i es 5
}
console.log(i);
}
// Salida: 0 1 2 3 4

Usos comunes:

  • Buscar un elemento y detenerse al encontrarlo.
  • Validar datos hasta encontrar un error.
  • Salir de un bucle infinito controlado.

continue — Saltar a la siguiente iteración

Section titled “continue — Saltar a la siguiente iteración”

continue salta el resto del código en la iteración actual y pasa a la siguiente.

for (let i = 0; i < 10; i++) {
if (i % 2 === 0) {
continue; // salta los números pares
}
console.log(i);
}
// Salida: 1 3 5 7 9

Usos comunes:

  • Omitir valores no deseados.
  • Procesar solo elementos que cumplen cierta condición.

Cuando tienes bucles dentro de bucles, break solo afecta al bucle más interno. Con etiquetas puedes controlar qué bucle quieres interrumpir.

externo: for (let i = 0; i < 3; i++) {
interno: for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break externo; // sale del bucle externo
}
console.log(`i=${i}, j=${j}`);
}
}
// Salida: i=0,j=0 i=0,j=1 i=0,j=2 i=1,j=0
// break: buscar un producto en inventario
let inventario = [
{ id: 1, nombre: 'Laptop', disponible: false },
{ id: 2, nombre: 'Mouse', disponible: true },
{ id: 3, nombre: 'Monitor', disponible: false },
{ id: 4, nombre: 'Teclado', disponible: true }
];
console.log('Buscando primer producto disponible:');
for (let i = 0; i < inventario.length; i++) {
if (inventario[i].disponible) {
console.log(`Encontrado: ${inventario[i].nombre}`);
break; // deja de buscar
}
}
// continue: procesar solo productos disponibles
console.log('\nProductos disponibles:');
for (let prod of inventario) {
if (!prod.disponible) {
continue; // salta los no disponibles
}
console.log(`${prod.nombre}`);
}
// Labels: buscar en matriz
let matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let objetivo = 5;
let encontrado = false;
busqueda: for (let i = 0; i < matriz.length; i++) {
for (let j = 0; j < matriz[i].length; j++) {
if (matriz[i][j] === objetivo) {
console.log(`Encontrado ${objetivo} en [${i}][${j}]`);
encontrado = true;
break busqueda; // sale de ambos bucles
}
}
}
  1. Crea un archivo break-continue.js.
  2. Usa un for del 1 al 20 y con continue salta los múltiplos de 3. Imprime solo los demás.
  3. Usa un for para recorrer un array de números y con break detente al encontrar un número negativo.
  4. Crea un bucle anidado (tabla de 5x5) y usa una etiqueta para salir cuando el producto de los índices sea 12.
  5. Simula un juego donde lanzas un dado hasta que saques un 6, usando break.
// Saltar múltiplos de 3
console.log('Números no múltiplos de 3:');
for (let i = 1; i <= 20; i++) {
if (i % 3 === 0) continue;
console.log(i);
}
// Detenerse en número negativo
let datos = [5, 8, 12, -3, 20, 7];
console.log('\nProcesando hasta encontrar negativo:');
for (let num of datos) {
if (num < 0) {
console.log('¡Negativo encontrado!');
break;
}
console.log(num);
}
// Etiqueta en bucle anidado
externo: for (let i = 1; i <= 5; i++) {
for (let j = 1; j <= 5; j++) {
if (i * j === 12) {
console.log(`\nEncontrado: ${i} x ${j} = 12`);
break externo;
}
console.log(`${i}x${j}=${i * j}`);
}
}
// Juego de dado
console.log('\nLanzando dado hasta sacar 6:');
while (true) {
let dado = Math.floor(Math.random() * 6) + 1;
console.log('🎲', dado);
if (dado === 6) {
console.log('¡Ganaste!');
break;
}
}

Las etiquetas (labels) son raramente usadas en JavaScript moderno. Muchos desarrolladores las evitan porque pueden hacer el código menos legible. En la mayoría de los casos, puedes refactorizar el código para evitar bucles anidados con etiquetas. Úsalas con moderación.

Un patrón común con break y while(true):

// Bucle hasta que se cumpla una condición compleja
while (true) {
let respuesta = prompt('¿Cuál es la capital de México?');
if (respuesta.toLowerCase() === 'ciudad de méxico') {
console.log('¡Correcto!');
break;
}
console.log('Intenta de nuevo...');
}

Esto es más limpio que tener la condición en el while cuando la lógica de salida está en medio del bucle.