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 buclewhile
y en el buclefor
, 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 delfor
, el incremento va incluido en la parte entre paréntesis, por lo que al hacer elcontinue
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.