Une boucle a une habitude tenace : elle va jusqu'au bout. Elle parcourt tout ce qu'on lui donne, même quand la réponse cherchée est apparue au troisième élément et que les milliers suivants ne servent plus à rien.
break est le moyen de dire que c'est terminé. Il sert dans deux contextes différents, une boucle et un switch, avec un effet identique : arrêter la structure la plus proche.
Définition
break interrompt immédiatement la boucle qui le contient. Les éléments non encore parcourus sont abandonnés, et le programme reprend à la première ligne écrite après la boucle.
const commandes = [12, 0, 30];
let premiereVide = -1;
for (let i = 0; i < commandes.length; i++) {
if (commandes[i] === 0) {
premiereVide = i;
break; // inutile de continuer, la réponse est trouvée
}
}
console.log(premiereVide); // 1Deux choses changent. Le temps de calcul, d'abord, sur un tableau volumineux. La lisibilité ensuite, et elle compte davantage : la ligne dit à voix haute la condition qui met fin au parcours, au lieu de la laisser deviner dans un drapeau testé dix lignes plus haut.
Dans un switch, il empêche la branche suivante
Un case n'est pas un bloc fermé. Sans break, l'exécution déborde sur le cas suivant, puis sur celui d'après, jusqu'à la fin de la structure.
const jour = "samedi";
switch (jour) {
case "samedi":
console.log("Week-end");
break; // sans cette ligne, la branche par défaut suivrait
default:
console.log("Jour ouvré");
}Un cas terminé par return n'a pas besoin de break, la function étant déjà quittée. C'est la raison pour laquelle un switch qui ne fait que renvoyer des valeurs se lit plus sûrement qu'un switch qui agit.
Sortir de plusieurs boucles à la fois
break ne quitte que la boucle la plus proche. Sur un parcours à deux dimensions, la boucle extérieure continue comme si de rien n'était, ce qui produit un défaut discret : le résultat reste parfois juste, seulement plus lent.
JavaScript permet de nommer une boucle et de viser ce nom, ce qu'on appelle une étiquette.
const grille = [[1, 2], [3, 4]];
let trouve = null;
recherche:
for (const ligne of grille) {
for (const cellule of ligne) {
if (cellule === 3) {
trouve = cellule;
break recherche; // quitte les deux boucles d'un coup
}
}
}
console.log(trouve); // 3L'étiquette fonctionne, mais elle reste rare dans du code moderne. Déplacer les deux boucles dans une fonction et en sortir par return produit le même effet, rend la valeur trouvée au passage, et se lit sans que personne ait à chercher où mène le nom.
Questions fréquentes
Quelle différence avec continue ?
Les deux interrompent quelque chose, mais pas la même chose. break quitte la boucle entièrement, et ce qui restait ne sera jamais parcouru. continue abandonne seulement le tour en cours et repart aussitôt sur l'élément suivant. La question à se poser est simple : les éléments restants ont-ils encore un intérêt ?
Pourquoi break ne fonctionne-t-il pas dans forEach ?
Parce que le corps passé à Array.forEach() est une fonction, pas un bloc de boucle : un break écrit là empêche même le fichier de se charger. Pour interrompre un parcours, il faut une boucle for, ou une méthode qui s'arrête d'elle-même comme Array.find() et Array.some(), qui rendent la main dès qu'un élément correspond.
Faut-il éviter break pour écrire du code propre ?
C'est un vieux débat hérité d'autres langages, et la réponse est non. Sortir tôt évite un parcours inutile et exprime l'intention mieux qu'une condition d'arrêt faite de trois tests collés. Le seul cas qui mérite qu'on s'arrête est celui d'une longue boucle truffée de sorties dispersées : le problème n'est plus le break, c'est la boucle.