Interrumpir bucles

Detener o saltar iteraciones de un bucle


Por norma general, un buen hábito de programación cuando creamos bucles es pensar la forma de hacer que esos bucles siempre vayan desde un número inicial a un número final y terminen las repeticiones. De esta forma son predecibles y fáciles de leer. Sin embargo, en algunas ocasiones nos puede interesar hacer interrupciones o saltos de iteraciones para conseguir algo más específico que con un bucle íntegro es más complejo de conseguir.

Saltar una iteración

Imagina un caso donde queremos saltarnos una iteración concreta. Por ejemplo, queremos hacer un bucle que muestre los números del 0 al 10, pero queremos que el número 5 se lo salte y no lo muestre, continuando con el resto.

Para eso podemos hacer uso de continue, que es una sentencia que al llegar a ella dentro de un bucle, el programa salta y abandona esa iteración, volviendo al principio del bucle:

for (let i = 0; i < 11; i++) {
  if (i == 5) {
    continue;
  }

  console.log("Valor de i:", i);
}

Así pues, en este caso se van a realizar las iteraciones desde 0 hasta 4, en la iteración del 5 se entrará en el if y se evaluará como verdadera, ejecutando el continue y saltando a la siguiente iteración. Por lo tanto continuará desde la iteración 6 hasta la 10.

En resumen, la iteración 5 nunca llegará al console.log, por lo que no se mostrará por pantalla.

Alternativas

Este ejemplo es muy sencillo, pero nos sirve para ver como funciona continue de una forma simple. También se podría haber solucionado sin necesidad de utilizar continue de la siguiente forma:

for (let i = 0; i < 11; i++) {
  if (i != 5) {
    console.log("Valor de i:", i);
  }
}

Sin embargo, si el contenido del bucle fuera más complejo quizás sería menos legible. Otra forma alternativa sería la siguiente, donde evitamos el uso de comprobaciones if anidadas dentro del bucle y dividimos en una primera parte del bucle y una segunda parte:

for (let i = 0; i < 5; i++) {
  console.log("Valor de i:", i);
}

for (let i = 6; i < 11; i++) {
  console.log("Valor de i:", i);
}

Cuidado con los bucles infinitos

Como ves, un mismo problema se puede solucionar casi siempre de múltiples formas, cada una con sus ventajas y desventajas. Ten mucho cuidado si haces este ejemplo con continue y con un bucle while, puesto que puedes crear un bucle infinito:

let i = 0;

while (i < 11) {

  if (i == 5) {
    continue;       // ❌ CUIDADO, bucle infinito
  }

  console.log("Iteración número ", i);
  i = i + 1;
}

console.log("Bucle finalizado.")

En este ejemplo, observa que el incremento que tenemos en la última línea dentro del bucle i = i + 1;, a diferencia del bucle for, no ocurre en el bucle while dentro del if, por lo que en la iteración 5, se entrará en el bucle if, el continue hará que saltes al principio del bucle pero no se incrementará el contador porque en ningún caso estamos pasando por el incremento. Por esa razón, nos quedaremos en un eterno bucle infinito, salvo que incluyamos un incremento dentro del if y antes del continue.

La diferencia del continue en el bucle while y en el bucle for, es que en el primero, el incremento se hace de forma manual y se tiene que llegar explícitamente a esa parte para incrementar el valor del contador. En el caso del for, el incremento va incluido en la parte entre paréntesis, por lo que al hacer el continue se incrementa automáticamente.

Interrumpir el bucle

De la misma forma que tenemos un continue que interrumpe la iteración y vuelve al inicio a evaluar la condición, tenemos un break que nos permite interrumpir el bucle y abandonarlo. Esto puede ser bastante útil cuando queremos que se abandone el bucle por una condición especial.

Por ejemplo, cambiemos el continue del ejemplo anterior por el break:

for (let i = 0; i < 11; i++) {
  if (i == 5) {
    break;
  }

  console.log("Valor de i:", i);
}

En este caso, se van a realizar las iteraciones desde el 0 al 4, y cuando lleguemos a la iteración 5, se entrará en el if y como cumple su condición, se hará un break y se abandonará el for, continuando el resto del programa.

let i = 0;

while (i < 11) {
  if (i == 5) {
    break;
  }

  console.log("Iteración número ", i);
  i = i + 1;
}

console.log("Bucle finalizado.")

Observa que en este caso, no hay conflicto con los bucle while, ya que el break no vuelve a evaluar la condición del bucle, sino que directamente abandona el bucle while, por lo que es seguro utilizarlo tanto en for como en while.

No obstante, recuerda que estas interrupciones sólo deben usarse en casos muy específicos. Siempre es preferible que el bucle sea predecible y no tenga demasiadas situaciones excepcionales que interrumpan el flujo, ya que a la larga son difíciles de modificar y mantener.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev