Une boucle for convient quand on sait déjà combien de fois répéter. Beaucoup de situations ne le disent pas : lire des pages jusqu'à la dernière, demander une saisie jusqu'à ce qu'elle soit valable, retirer des éléments jusqu'à ce qu'il n'en reste plus.
C'est le domaine de while. Il ne compte rien, il vérifie une condition avant chaque tour et s'arrête dès qu'elle devient fausse.
Définition
while évalue son expression, exécute le bloc si elle est vraie, puis recommence. Le nombre de tours dépend entièrement de ce que le bloc modifie.
let solde = 1000;
let mois = 0;
while (solde > 0) {
solde -= 250;
mois++;
}
console.log(mois); // 4La condition est vérifiée avant le premier tour. Si elle est fausse d'entrée, le bloc n'est jamais exécuté, ce qui est le comportement voulu la plupart du temps : une liste vide ne doit déclencher aucun traitement.
do...while garantit un premier tour
Il existe une variante où la condition est vérifiée après le bloc. Le corps s'exécute donc au moins une fois, quoi qu'il arrive.
let essai = 0;
do {
essai++;
} while (essai < 3);
console.log(essai); // 3Le cas d'usage est celui où la condition dépend de quelque chose que le premier tour produit, comme une saisie ou une réponse de service distant : impossible de la tester avant de l'avoir obtenue. Partout ailleurs, while se lit mieux, parce que sa condition est visible en tête plutôt qu'en pied.
while (true) et sa seule porte de sortie
Quand la condition d'arrêt ne peut pas s'écrire en tête, on assume une boucle sans fin et on la quitte de l'intérieur avec break. C'est le motif classique d'une lecture par pages, où l'on ignore le nombre de pages avant d'arriver à la dernière.
const pages = [["a", "b"], ["c"], []];
let page = 0;
const tout = [];
while (true) {
const lot = pages[page];
if (!lot || lot.length === 0) break; // seule sortie de la boucle
tout.push(...lot);
page++;
}
console.log(tout); // [ 'a', 'b', 'c' ]Le risque est réel : si aucun chemin d'exécution ne rencontre le break, la boucle tourne indéfiniment. Le réflexe à prendre est de vérifier, avant d'exécuter, que chaque branche mène quelque part, et d'ajouter un compteur de sécurité quand la condition dépend d'un service extérieur.
Questions fréquentes
Quand préférer while à for ?
Quand le nombre de tours n'est pas connu au moment d'écrire la boucle. Une boucle for annonce d'emblée son point de départ, son point d'arrivée et son pas ; si ces trois informations n'existent pas, la forcer dans ce moule produit une boucle où deux des trois expressions sont vides. while exprime alors la même chose plus honnêtement.
Comment éviter une boucle infinie ?
En vérifiant qu'au moins une variable de la condition change à chaque tour, et sur tous les chemins possibles. Le piège le plus fréquent vient d'un continue placé avant l'incrément : le tour repart sans que le compteur ait bougé, et la condition reste vraie pour toujours.
Une boucle while bloque-t-elle la page ?
Oui, tant qu'elle tourne. JavaScript exécute une seule chose à la fois dans un onglet : une boucle longue gèle l'affichage, les clics et les animations jusqu'à sa dernière itération. Pour attendre un événement extérieur, il faut une Promise et await, jamais une boucle d'attente active.