Nous avons souvent besoin dâeffectuer des actions similaires plusieurs fois de suite.
Par exemple, lorsque nous devons extraire des marchandises dâune liste les unes Ă la suite des autres. Ou exĂ©cutez simplement le mĂȘme code pour chaque numĂ©ro de 1 Ă 10.
Les boucles permettent de rĂ©pĂ©ter plusieurs fois la mĂȘme partie du code.
Une petite annonce pour les lecteurs avertis.
Cet article ne couvre que les boucles de base : while, do..while et for(..;..;..).
Si vous ĂȘtes venu Ă cet article Ă la recherche dâautres types de boucles, voici les pointeurs :
- Voir forâŠin pour boucler sur les propriĂ©tĂ©s de lâobjet.
- Voir forâŠof et iterables pour boucler sur des tableaux et des objets itĂ©rables.
Sinon, lisez la suite.
La boucle âwhileâ
La boucle while a la syntaxe suivante :
while (condition) {
// code
// appelé "loop body" ("corps de boucle")
}
Tant que la condition est vraie, le code du corps de la boucle est exécuté.
Par exemple, la boucle ci-dessous affiche i tant que i < 3 :
let i = 0;
while (i < 3) { // affiche 0, puis 1, puis 2
alert( i );
i++;
}
Une unique exĂ©cution du corps de la boucle est appelĂ©e une itĂ©ration. La boucle dans lâexemple ci-dessus fait trois itĂ©rations.
Sâil nây avait pas dâi++ dans lâexemple ci-dessus, la boucle se rĂ©pĂšterait (en thĂ©orie) pour toujours. En pratique, le navigateur fournit des moyens dâarrĂȘter ces boucles, et pour JavaScript cĂŽtĂ© serveur, nous pouvons tuer le processus.
Toute expression ou variable peut ĂȘtre une condition de boucle, pas seulement une comparaison. Ils sont Ă©valuĂ©s et convertis en un boolĂ©en par while.
Par exemple, le moyen le plus court dâĂ©crire while (i != 0) pourrait ĂȘtre while (i) :
let i = 3;
while (i) { // quand i devient 0, la condition devient fausse et la boucle s'arrĂȘte
alert( i );
i--;
}
Si le corps de la boucle a une seule dĂ©claration, nous pouvons omettre les accolades {âŠ} :
let i = 3;
while (i) alert(i--);
La boucle âdoâŠwhileâ
La vĂ©rification de la condition peut ĂȘtre dĂ©placĂ©e sous le corps de la boucle en utilisant la syntaxe do..while :
do {
// corps de la boucle
} while (condition);
La boucle exĂ©cute dâabord le corps, puis vĂ©rifie la condition et, tant que câest vrai, lâexĂ©cute encore et encore.
Par exemple :
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
Cette forme de syntaxe est rarement utilisĂ©e, sauf lorsque vous souhaitez que le corps de la boucle sâexĂ©cute au moins une fois, quelle que soit la condition. Habituellement, lâautre forme est prĂ©fĂ©rĂ©e : while(âŠ) {âŠ}.
La boucle âforâ
La boucle for est plus complexe, mais câest aussi la boucle la plus utilisĂ©e.
Cela ressemble Ă ceci :
for (début; condition; étape) {
// ... corps de la boucle ...
}
Apprenons la signification de ces parties par lâexemple. La boucle ci-dessous exĂ©cute alert(i) pour i en partant de 0 jusquâĂ 3 (mais non compris) :
for (let i = 0; i < 3; i++) { // affiche 0, puis 1, puis 2
alert(i);
}
Examinons la déclaration for partie par partie :
| partie | ||
|---|---|---|
| début | let i = 0 |
Exécute une fois en entrant dans la boucle. |
| condition | i < 3 |
VĂ©rifiĂ© avant chaque itĂ©ration de la boucle, en cas dâĂ©chec, la boucle sâarrĂȘte. |
| corps | alert(i) |
Exécute encore et encore tant que la condition est vraie |
| étape | i++ |
Exécute aprÚs le corps à chaque itération |
Lâalgorithme de boucle gĂ©nĂ©ral fonctionne comme ceci :
Exécuter le début
â (si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape)
â (si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape)
â (si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape)
â ...
Câest-Ă -dire que begin est exĂ©cutĂ© une fois, puis itĂ©rĂ© : aprĂšs chaque test de condition, body et step sont exĂ©cutĂ©s.
Si vous dĂ©butez dans les boucles, il pourrait ĂȘtre utile de revenir Ă lâexemple et de reproduire comment elle sâexĂ©cute pas Ă pas sur une feuille de papier.
Voici ce qui se passe exactement dans notre cas :
// for (let i = 0; i < 3; i++) alert(i)
// exécute début
let i = 0
// si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape
if (i < 3) { alert(i); i++ }
// si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape
if (i < 3) { alert(i); i++ }
// si condition â exĂ©cuter le corps et exĂ©cuter l'Ă©tape
if (i < 3) { alert(i); i++ }
// ... fini, parce que maintenant i == 3
Ici, la variable âcounterâ i est dĂ©clarĂ©e directement dans la boucle. Cela sâappelle une dĂ©claration de variable âen ligneâ. De telles variables ne sont visibles que dans la boucle.
for (let i = 0; i < 3; i++) {
alert(i); // 0, 1, 2
}
alert(i); // erreur, pas de variable
Au lieu de définir une variable, nous pouvons en utiliser une existante :
let i = 0;
for (i = 0; i < 3; i++) { // utiliser une variable existante
alert(i); // 0, 1, 2
}
alert(i); // 3, visible, car déclaré en dehors de la boucle
Sauter des parties
Toute partie de for peut ĂȘtre ignorĂ©e.
Par exemple, nous pouvons omettre le dĂ©but si nous nâavons rien Ă faire au dĂ©but de la boucle.
Comme ici :
let i = 0; // nous avons i déjà déclaré et assigné
for (; i < 3; i++) { // pas besoin de "début"
alert( i ); // 0, 1, 2
}
Nous pouvons également supprimer la partie étape :
let i = 0;
for (; i < 3;) {
alert( i++ );
}
La boucle est devenue identique Ă while (i < 3).
Nous pouvons tout supprimer, créant ainsi une boucle infinie :
for (;;) {
// répÚte sans limites
}
Veuillez noter que les deux les points-virgules ; de for doivent ĂȘtre prĂ©sents, sinon ce serait une erreur de syntaxe.
Briser la boucle
Normalement, la boucle sort quand la condition devient fausse.
Mais nous pouvons forcer la sortie à tout moment. Il y a une directive spéciale appelée break pour cela.
Par exemple, la boucle ci-dessous demande Ă lâutilisateur une sĂ©rie de chiffres, mais âse casseâ quand aucun numĂ©ro nâest entrĂ© :
let sum = 0;
while (true) {
let value = +prompt("Entrez un nombre", '');
if (!value) break; // (*)
sum += value;
}
alert( 'Sum: ' + sum );
La directive break est activĂ©e sur la ligne (*) si lâutilisateur entre une ligne vide ou annule lâentrĂ©e. Il arrĂȘte la boucle immĂ©diatement, en passant le contrĂŽle Ă la premiĂšre ligne aprĂšs la boucle. Ă savoir, alert.
La combinaison âboucle infinie + break au besoinâ est idĂ©ale pour les situations oĂč la condition doit ĂȘtre vĂ©rifiĂ©e non pas au dĂ©but / Ă la fin de la boucle, mais au milieu, voire Ă plusieurs endroits du corps.
Continuer jusqu'à la prochaine itération
La directive continue est une âversion plus lĂ©gĂšreâ de break. Cela nâarrĂȘte pas toute la boucle. Au lieu de cela, elle arrĂȘte lâitĂ©ration en cours et force la boucle Ă en dĂ©marrer une nouvelle (si la condition le permet).
Nous pouvons lâutiliser si nous avons terminĂ© lâitĂ©ration en cours et aimerions passer Ă la suivante.
La boucle ci-dessous utilise continue pour ne produire que des valeurs impaires :
for (let i = 0; i < 10; i++) {
// si vrai, saute le reste du corps
if (i % 2 == 0) continue;
alert(i); // 1, ensuite 3, 5, 7, 9
}
Pour les valeurs paires de i, la directive continue arrĂȘte lâexĂ©cution du corps en passant le contrĂŽle Ă la prochaine itĂ©ration de for (avec le nombre suivant). Donc, lâalert nâest appelĂ©e que pour les valeurs impaires.
continue aide Ă rĂ©duire le niveau dâimbricationUne boucle affichant des valeurs impaires pourrait ressembler Ă ceci :
for (let i = 0; i < 10; i++) {
if (i % 2) {
alert( i );
}
}
Dâun point de vue technique, câest identique Ă lâexemple du dessus. Certes, nous pouvons simplement envelopper le code dans un bloc if au lieu de continue.
Mais comme effet secondaire, nous avons obtenu un niveau dâimbrication supplĂ©mentaire (lâappel de lâalert Ă lâintĂ©rieur des accolades). Si le code Ă lâintĂ©rieur du if est plus long que quelques lignes, la lisibilitĂ© globale peut en ĂȘtre rĂ©duite.
break/continue Ă droite de â?âVeuillez noter que les constructions de syntaxe qui ne sont pas des expressions ne peuvent pas ĂȘtre utilisĂ©es avec lâopĂ©rateur ternaire ?. Tout particuliĂšrement les directives telles que break/continue ne sont pas autorisĂ©es.
Par exemple, si nous prenons ce code :
if (i > 5) {
alert(i);
} else {
continue;
}
⊠Et le réécrivons Ă lâaide dâun point dâinterrogation :
(i > 5) ? alert(i) : continue; // continue n'est pas autorisé ici
⊠Ensuite cesse de fonctionner : il y a une erreur de syntaxe.
Câest une autre raison pour ne pas utiliser lâopĂ©rateur point dâinterrogation ? au lieu de if.
Des labels pour break/continue
Parfois, nous devons sortir de plusieurs boucles imbriquĂ©es en mĂȘme temps.
Par exemple, dans le code ci-dessous, nous bouclons sur i et j pour demander les coordonnées (i, j) de (0,0) à (2,2) :
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`Value at coords (${i},${j})`, '');
// Et si nous voulons sortir d'ici Ă Done (ci-dessous) ?
}
}
alert('Done!');
Nous avons besoin dâun moyen dâarrĂȘter le processus si lâutilisateur annule la saisie.
Le break ordinaire aprĂšs input ne ferait que briser la boucle intĂ©rieure. Ce nâest pas suffisant â les labels viennent Ă la rescousse.
Une label est un identifiant avec deux points avant une boucle :
labelName: for (...) {
...
}
Lâinstruction break <labelName> dans la boucle interrompt tout le bloc de code relatif au label.
Comme ici :
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
let input = prompt(`Value at coords (${i},${j})`, '');
// si une chaßne est vide ou annulée, alors rompre les deux boucles
if (!input) break outer; // (*)
// faire quelque chose avec la valeur âŠ
}
}
alert('Done!');
Dans le code ci-dessus, break outer regarde vers le haut le label outer et sort de cette boucle.
Donc, le contrĂŽle va directement de (*) Ă alert('Done!').
Nous pouvons également déplacer le label sur une ligne séparée :
outer:
for (let i = 0; i < 3; i++) { ... }
La directive continue peut Ă©galement ĂȘtre utilisĂ©e avec un label. Dans ce cas, lâexĂ©cution passe Ă lâitĂ©ration suivante de la boucle labellisĂ©e.
Les labels ne nous permettent pas de sauter dans un endroit arbitraire du code.
Par exemple, il est impossible de faire ceci :
break label; // saute au label ci-dessous (ne fonctionne pas)
label: for (...)
Une directive break doit ĂȘtre Ă lâintĂ©rieur dâun bloc de code. Techniquement, tout bloc de code Ă©tiquetĂ© fera lâaffaire, par exemple :
label: {
// ...
break label; // works
// ...
}
⊠Bien que 99,9% du temps les break utilisĂ©s sont Ă lâintĂ©rieur de boucles, comme nous lâavons vu dans les exemples ci-dessus.
Un continue nâest possible que depuis lâintĂ©rieur dâune boucle.
Résumé
Nous avons couvert 3 types de boucles :
whileâ La condition est vĂ©rifiĂ©e avant chaque itĂ©ration.do..whileâ La condition est vĂ©rifiĂ©e aprĂšs chaque itĂ©ration.for (;;)â La condition est vĂ©rifiĂ©e avant chaque itĂ©ration, des paramĂštres supplĂ©mentaires sont disponibles.
Pour crĂ©er une boucle âinfinieâ, on utilise gĂ©nĂ©ralement la construction while(true). Une telle boucle, comme toute autre, peut ĂȘtre stoppĂ©e avec la directive break.
Si nous ne voulons rien faire avec lâitĂ©ration actuelle et que nous souhaitons avancer jusquâĂ la suivante, la directive continue nous permet de faire cela.
break/continue accepte les labels prĂ©cĂ©dents la boucle. Un label est le seul moyen de break/continue pour Ă©chapper Ă lâimbrication et accĂ©der en dehors de la boucle.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)