Boucles et tableaux en JavaScript

Apprends à répéter des opérations et à manipuler des listes de données en JavaScript. Écris des boucles for, while et do...while qui s’exécutent le bon nombre de fois, stocke des valeurs dans des tableaux, puis ajoute, supprime, recherche et modifie leurs éléments. Traite des listes avec for...of et des méthodes de tableau comme map, filter, find et reduce, trie des nombres et du texte dans l’ordre attendu par les lecteurs, puis copie et combine des tableaux avec la syntaxe de décomposition sans modifier les originaux par accident.

DébutantUnité 2 sur 9 de la formation Formation : JavaScript : DOM, événements et code asynchrone

Ce que tu vas apprendre

  1. Écris des boucles for, while et do...while qui s’exécutent le bon nombre de fois, suis leur exécution pas à pas et contrôle-les avec break et continue.
    • Compte et répète des instructions avec une boucle for
      Écris une boucle for à partir de ses trois parties, suis son compteur de la première à la dernière itération et calcule un total cumulé.
    • Répète des instructions tant qu’une condition est vérifiée
      Utilise des boucles while et do...while lorsque le nombre de répétitions n’est pas connu à l’avance et assure-toi que chaque boucle peut se terminer.
    • Interromps des boucles, passe à l’itération suivante et imbrique des boucles
      Quitte une boucle avant sa fin avec break, passe à l’itération suivante avec continue et place une boucle dans une autre pour parcourir des grilles et des paires.
  2. Crée des tableaux, lis et modifie leurs éléments par indice, ajoute et supprime des éléments, effectue des recherches dans les tableaux et convertis-les en texte et inversement.
    • Crée un tableau et lis ses éléments
      Écris des littéraux de tableau, lis les éléments par leur indice commençant à zéro et utilise length et at() pour accéder au dernier élément.
    • Ajoute, supprime et remplace des éléments
      Modifie des tableaux en place par affectation à un indice et avec push, pop, shift, unshift et splice, copie des parties avec slice et distingue les méthodes qui modifient un tableau de celles qui en renvoient un nouveau.
    • Effectue des recherches dans un tableau et convertis un tableau en texte et inversement
      Vérifie si un tableau contient une valeur, trouve la position d’une valeur, compare correctement des tableaux et convertis des chaînes en tableaux et inversement avec split et join.
  3. Parcours chaque élément d’un tableau avec les boucles for et for...of et utilise des schémas de boucles courants pour calculer des totaux, compter, rechercher et construire des résultats.
    • Parcours un tableau avec for et for...of
      Choisis entre une boucle for par indices et for...of, obtiens l’indice lorsque tu en as besoin et évite for...in ainsi que la modification de la longueur d’un tableau pendant son parcours.
    • Utilise des schémas de boucles pour calculer des totaux, compter, rechercher et construire des résultats
      Applique les schémas de l’accumulateur, du compteur, du maximum, de la recherche et de la construction d’un nouveau tableau à de vraies listes de données, et suis-les pas à pas.
  4. Passe de courtes fonctions fléchées à des méthodes de tableau et utilise forEach, map, filter, find, some, every et reduce pour transformer, sélectionner, rechercher et synthétiser des données.
    • Passe une fonction à une méthode de tableau
      Écris de courtes fonctions fléchées, identifie ce qu’une fonction de rappel reçoit et doit renvoyer, et utilise forEach pour exécuter du code pour chaque élément.
    • Transforme et sélectionne des éléments avec map et filter
      Utilise map pour transformer chaque élément en une nouvelle valeur et filter pour garder les éléments qui satisfont un test, puis enchaîne les deux méthodes.
    • Recherche des éléments et teste des conditions
      Utilise find, findIndex, findLast, findLastIndex, some et every pour trouver un élément ou vérifier une condition sur une liste.
    • Combine tous les éléments en une seule valeur avec reduce
      Utilise reduce avec un accumulateur et une valeur initiale pour calculer des totaux, des dénombrements et des valeurs extrêmes, et suis chaque étape.
  5. Trie des nombres et du texte dans le bon ordre, notamment selon l’ordre alphabétique de la langue du lecteur, puis copie et combine des tableaux avec la syntaxe de décomposition sans modifier les originaux par accident.
    • Trie des tableaux de nombres et de chaînes de caractères et inverse leur ordre
      Utilise sort avec une fonction de comparaison, retiens que sort modifie le tableau et utilise toSorted et toReversed pour obtenir des copies triées ou inversées.
    • Trie et présente du texte en tenant compte de la langue des lecteurs
      Compare des chaînes avec localeCompare et Intl.Collator pour obtenir un ordre alphabétique naturel, conserve les dates sous une forme qui permet de les trier et transforme des tableaux en texte lisible avec join, Intl.ListFormat et la mise en forme des nombres.
    • Copie et combine des tableaux avec la syntaxe de décomposition
      Comprends que des variables de tableau peuvent faire référence à un tableau partagé et utilise la syntaxe de décomposition pour copier, fusionner et insérer des tableaux, ainsi que pour passer leurs éléments à une fonction comme valeurs distinctes.

Boucles et tableaux en JavaScript : cours

5 chapitres

1

Répète du code avec des boucles

Pour répéter du code, il faut un point de départ clair, un test et un moyen de progresser. Les boucles de comptage rendent visible le nombre d’étapes ; les boucles fondées sur une condition laissent les données déterminer le moment de l’arrêt. Suis chaque variable qui change pour voir ce qui s’exécute avant et après une vérification, puis utilise les sorties anticipées et les boucles imbriquées pour traiter les recherches, les valeurs ignorées et les paires. De petits changements à une borne ou à une mise à jour peuvent modifier tout le résultat.

1.1 Contrôle une boucle de comptage

Une boucle répète un bloc de code. Chaque exécution de son corps est une itération. Tu peux modifier le nombre de répétitions en changeant le compteur et la condition de la boucle, sans copier le corps.

Lis les trois parties
for (let i = 1; i <= 5; i++) {
  console.log(i);
}

Les parenthèses contiennent une initialisation, une condition et une mise à jour, séparées par des points-virgules. let i = 1 s’exécute une fois. JavaScript vérifie ensuite i <= 5. Si la condition est vraie, le corps affiche i, la mise à jour i++ ajoute 1 et JavaScript vérifie à nouveau la condition. Une condition fausse met fin à la boucle avant une nouvelle exécution du corps.

Valeur avant la vérificationConditionAction
1trueAfficher 1 ; passer à 2
2, 3, 4true à chaque foisAfficher chaque valeur et mettre à jour
5trueAfficher 5 ; passer à 6
6falseArrêter

Il y a cinq itérations mais six vérifications de la condition. La dernière vérification échoue et n’entraîne pas l’exécution du corps. Une boucle dont la condition est fausse au départ ne comporte aucune itération.

Choisis les bornes et le pas

for (let i = 0; i < 10; i++) parcourt les valeurs de 0 à 9. En commençant à 1 avec i <= 10, elle parcourt les valeurs de 1 à 10. Les deux boucles s’exécutent dix fois. Pour un pas de 1 de a vers b, lorsque b est au moins égal à a, < b donne b - a itérations et <= b donne b - a + 1.

La mise à jour peut utiliser un pas plus grand : for (let i = 0; i <= 20; i += 5) parcourt 0, 5, 10, 15, 20. Pour compter à rebours, il faut une mise à jour décroissante et une condition adaptée : for (let i = 3; i >= 1; i--) parcourt 3, 2, 1. Note les première et dernière valeurs souhaitées avant de choisir < ou <= ; cela permet de repérer une erreur de décalage d’une unité.

Garde un total cumulé
let total = 0;
for (let i = 1; i <= 100; i++) {
  total += i;
}
console.log(total); // 5050

total est un accumulateur : il conserve le résultat d’une itération à la suivante. Après les trois premières itérations, il contient successivement 1, 3, puis 6. Place sa déclaration avant la boucle pour qu’il soit initialisé une seule fois. Le déclarer dans le corps le remettrait à zéro à chaque fois et le rendrait inaccessible après la boucle.

Diagnostique une boucle au comportement étrange

Le compteur de l’en-tête utilise let car i++ le réaffecte. Un compteur déclaré avec const permet la première exécution du corps, mais déclenche une TypeError lors de la mise à jour. Un let i déclaré dans l’en-tête appartient à la boucle ; le lire ensuite déclenche une ReferenceError, sauf si une autre variable nommée i existe à l’extérieur.

Un point-virgule juste après l’en-tête donne à la boucle un corps vide. Dans for (let i = 0; i < 3; i++); { console.log("Hello"); }, le bloc s’exécute une fois après la boucle. Garde l’accolade ouvrante attachée à l’en-tête. Enfin, vérifie le sens de la mise à jour : commencer à 0 avec i < 5 et i-- éloigne du point d’arrêt et la boucle ne se termine jamais.

Points clés

  • L’initialisation s’exécute une fois ; la condition est vérifiée avant chaque itération ; la mise à jour suit le corps.
  • Vérifie les première et dernière valeurs du compteur pour repérer une erreur de décalage d’une unité.
  • Déclare un total cumulé avant la boucle pour conserver les résultats précédents.
  • Utilise let pour un compteur qui change et rapproche-le du point d’arrêt.

1.2 Répète des instructions jusqu’à ce qu’une condition change

Certaines tâches se terminent lorsqu’un résultat atteint une cible, et non après un nombre connu d’étapes. Une boucle while vérifie cette condition d’arrêt avant chaque répétition. Une boucle do...while la vérifie après le corps.

Vérifie d’abord avec while
let balance = 1000;
let years = 0;
while (balance < 1500) {
  balance = balance * 1.05;
  years++;
}
console.log(years); // 9

Le solde augmente de 5 % par an. Les deux variables sont initialisées avant la boucle. Après huit répétitions, le solde est d’environ 1477.46, en dessous de la cible : une répétition supplémentaire est donc nécessaire. Après neuf répétitions, il est d’environ 1551.33 ; la vérification suivante est fausse. Garde toutes les décimales du solde pendant le calcul et n’arrondis que le résultat affiché.

Si une condition while est fausse au départ, le corps ne s’exécute aucune fois. Pour une boucle de comptage simple, place l’initialisation avant while et la mise à jour à la fin du corps. Cela conserve le comportement d’une boucle for lorsqu’il n’y a pas de continue. Avec continue, la mise à jour demande une attention particulière car elle peut être ignorée.

Exécute une fois avant de vérifier
let n = 4096;
let digits = 0;
do {
  n = Math.floor(n / 10);
  digits++;
} while (n > 0);
console.log(digits); // 4

Math.floor arrondit à l’entier inférieur. Ici, chaque division supprime le dernier chiffre : 4096 devient 409, puis 40, 4 et 0. Chaque suppression augmente digits. En partant de 0, le corps s’exécute quand même une fois et compte correctement son unique chiffre. Une boucle while (n > 0) qui vérifie d’abord la condition ignorerait ce cas et compterait zéro chiffre. Cette méthode de comptage des chiffres s’applique aux entiers positifs ou nuls.

BoucleMoment de la vérification de la conditionNombre minimal d’exécutions du corps
whileAvant le corpsZéro
do...whileAprès le corpsUne

Avec let n = 10, le corps d’une boucle do...while qui affiche n s’exécute une fois même si sa condition est n < 5. La même condition vérifiée avant le corps ne produit aucun affichage. Le point-virgule se place après la condition finale dans do...while.

Progresse vers une sortie

Une boucle infinie se répète sans se terminer. Oublier n++ dans let n = 0; while (n < 3) { console.log(n); } laisse la condition vraie indéfiniment. Un code qui s’exécute longtemps peut bloquer un onglet du navigateur. Suis ce qui modifie la condition et arrête un script bloqué avec les commandes du navigateur.

Une condition composée comme attempts < 3 && !found ne permet de continuer que tant que les deux tests sont vrais. Elle s’arrête lorsque trois tentatives ont été utilisées ou qu’un résultat est trouvé. Pour un entier positif ou nul qui décroît vers zéro, while (count > 0) rend un compte à rebours plus clair que while (count). Les nombres négatifs sont eux aussi évalués comme vrais : cette évaluation ne signifie donc pas à elle seule qu’un compteur est positif.

Évite d’utiliser l’égalité comme test d’arrêt pour les nombres décimaux. Dix additions de 0.1 donnent 0.9999999999999999 en JavaScript : while (x !== 1) peut donc dépasser la borne prévue sans jamais s’arrêter. Une comparaison comme x < 1 permet de franchir la borne ; un compteur entier convient mieux lorsqu’il faut exactement dix étapes. Calcule chaque valeur décimale à partir de ce compteur.

Points clés

  • while peut ne s’exécuter aucune fois ; do...while s’exécute toujours au moins une fois.
  • Choisis une condition selon ce qui doit encore se produire, puis modifie les valeurs dont elle dépend dans le corps.
  • Une condition composée peut arrêter le travail lorsqu’une limite est atteinte ou qu’un résultat est trouvé.
  • À cause de l’arrondi en virgule flottante, l’égalité exacte entre nombres décimaux est un mauvais test d’arrêt.
  • Utilise des compteurs entiers lorsque le nombre de répétitions doit être exact.

1.3 Arrête une recherche, ignore des instructions et parcours des paires

Une boucle peut être quittée avant que sa condition ne devienne fausse ou ignorer des instructions pour un seul élément. Les boucles imbriquées permettent de répéter une séquence dans une autre, par exemple pour parcourir des lignes et des colonnes.

Utilise break ou continue

break quitte immédiatement sa boucle. Pour trouver le premier multiple de 7 supérieur à 50 :

for (let n = 51; n <= 100; n++) {
  if (n % 7 === 0) {
    console.log(n); // 56
    break;
  }
}

Après l’affichage de 56, l’exécution reprend après la boucle. Les valeurs de 57 à 100 ne sont jamais vérifiées. while (true) peut utiliser le même schéma lorsque la sortie est plus facile à tester dans le corps ; un break accessible doit permettre de sortir.

continue ignore le reste de l’itération en cours. Dans une boucle for, la mise à jour de l’en-tête s’exécute quand même avant la nouvelle vérification de la condition :

for (let i = 1; i <= 9; i++) {
  if (i % 2 === 0) continue;
  console.log(i);
}

Pour les valeurs paires, l’affichage est ignoré : le résultat est donc 1, 3, 5, 7, 9. Remplacer continue par break mettrait fin à la boucle à 2 et seul 1 serait affiché.

Dans une boucle while, continue revient directement à la condition. Une mise à jour placée plus loin dans le corps est ignorée. Si i vaut 2 et que le corps commence par if (i === 2) continue;, cette valeur peut rester bloquée indéfiniment. Place la mise à jour nécessaire avant ce saut ou exprime le comptage avec for.

Répète une boucle intérieure pour chaque ligne
for (let row = 1; row <= 3; row++) {
  let line = "";
  for (let col = 1; col <= 4; col++) {
    line = line + (row * col) + " ";
  }
  console.log(line.trim());
}

Pour row = 1, la boucle intérieure parcourt les colonnes de 1 à 4 et construit le texte « 1 2 3 4 ». Elle recommence à la colonne 1 pour la ligne 2, ce qui produit « 2 4 6 8 ». La ligne 3 produit « 3 6 9 12 ». Le corps intérieur s’exécute douze fois : quatre colonnes pour chacune des trois lignes. Déclare line dans le corps extérieur pour que chaque ligne commence par une chaîne vide.

Utilise des noms différents pour les compteurs. Un let i intérieur masque un i extérieur, ce qui rend la lecture des deux positions difficile.

Parcours chaque paire distincte une fois

Pour quatre personnes numérotées de 0 à 3, fais commencer le compteur intérieur à i + 1 :

for (let i = 0; i < 4; i++) {
  for (let j = i + 1; j < 4; j++) {
    console.log(i, j);
  }
}

Les paires sont 0–1, 0–2, 0–3, 1–2, 1–3, 2–3 : six parcours. Faire commencer j à 0 produirait seize parcours, y compris des paires associant une personne à elle-même et des doublons inversés.

Un break ordinaire ne quitte que la boucle la plus intérieure. Pour terminer une recherche dans des boucles imbriquées, donne une étiquette à la boucle extérieure, par exemple outer: for (...), puis utilise break outer; lorsqu’une correspondance est trouvée. L’étiquette nomme la boucle à quitter ; elle ne change pas l’ordre dans lequel les paires sont testées.

Points clés

  • break termine une boucle ; continue ignore le reste d’une itération.
  • continue exécute la mise à jour d’une boucle for, mais peut ignorer une mise à jour dans le corps d’une boucle while.
  • La boucle intérieure recommence à chaque itération extérieure.
  • Utilise j = i + 1 pour parcourir chaque paire distincte une fois.
  • Un break ordinaire quitte la boucle la plus intérieure.
  • Un break avec étiquette peut aussi quitter une boucle extérieure.
2

Stocke et modifie des listes de données dans des tableaux

Une liste comporte des valeurs et des positions. Les tableaux conservent ces valeurs ensemble tout en donnant à chacune un indice numérique. La lecture, le remplacement, l’insertion et la suppression d’éléments dépendent de ces positions, et les modifications peuvent déplacer les éléments suivants vers de nouveaux indices. Apprends ce que chaque méthode renvoie et ce qu’elle modifie, puis choisis les recherches et les conversions de texte qui produisent le résultat sous la forme nécessaire à l’étape suivante.

2.1 Lis les valeurs et les positions dans un tableau

Un tableau stocke une liste ordonnée sous un même nom. Ses valeurs sont appelées éléments. Un littéral de tableau utilise des crochets et des virgules : const temps = [18, 21, 19, 24];. Le littéral [] crée un tableau vide.

Compte les positions à partir de zéro
const colors = ["red", "green", "blue"];
console.log(colors[0]); // "red"
console.log(colors[2]); // "blue"
console.log(colors.length); // 3

L’indice d’un élément est sa position comptée à partir de zéro. Le troisième élément a l’indice 2. length compte les emplacements indicés, y compris les emplacements vides. Pour ce tableau sans trou, c’est aussi le nombre d’éléments. Le dernier indice est colors.length - 1 : colors[colors.length - 1] lit donc « blue ».

Lire colors[colors.length] demande l’indice 3, situé juste après la fin, et donne undefined. Un indice manquant ne déclenche pas d’erreur simplement parce qu’il est absent. colors[5] donne aussi undefined.

Lis à partir de la fin

colors.at(-1) lit le dernier élément et colors.at(-2) lit celui qui le précède. Les indices positifs ou nuls fonctionnent comme d’habitude : colors.at(0) lit « red ». Un nombre négatif entre crochets a un autre sens : colors[-1] ne compte pas à partir de la fin et donne undefined pour ce tableau.

ExpressionRésultat
colors[1]"green"
colors.at(-1)"blue"
colors[3]undefined
colors[-1]undefined
Lis une liste dans une liste

Un élément peut lui-même être un tableau :

const grid = [[1, 2, 3], [4, 5, 6]];
console.log(grid[1]); // [4, 5, 6]
console.log(grid[1][0]); // 4

Le premier indice sélectionne une ligne. Le second sélectionne une valeur dans cette ligne. grid.length vaut 2, tandis que grid[0].length vaut 3. Ces longueurs décrivent des tableaux différents. Les lignes d’un tableau imbriqué peuvent avoir des longueurs différentes.

Les tableaux peuvent mélanger les types, comme dans [42, "km", true]. Une liste contenant un seul type de données, par exemple des températures, est plus facile à traiter car chaque élément peut être traité de la même façon.

Reconnais un tableau et évite les surprises liées aux emplacements vides

typeof [1, 2] renvoie « object » : ce n’est donc pas un test propre aux tableaux. Utilise Array.isArray(value) : la méthode renvoie true pour [1, 2] et false pour « 12 ».

new Array(3) crée trois emplacements vides ; il ne stocke pas le seul nombre 3. Utilise [3] pour un élément ou [0, 0, 0] pour trois zéros explicites. La lecture d’un emplacement vide donne undefined, mais c’est un trou, pas une valeur stockée explicitement. Écrire des littéraux de tableau rend le contenu souhaité explicite.

Lis les chaînes sans chercher à les modifier en place

Les chaînes permettent aussi l’accès par indice et prennent en charge length et at(). "hello"[1] vaut « e » et "hello".at(-1) vaut « o ». Les chaînes sont immuables : une affectation à la position d’un caractère ne le remplace pas. En mode strict, notamment dans les modules JavaScript, cette affectation déclenche une TypeError. Construis une nouvelle chaîne lorsque le texte doit changer.

Points clés

  • Les indices commencent à 0 ; le dernier indice est length - 1.
  • at(-1) lit le dernier élément ; arr[-1] ne le fait pas.
  • Lis les tableaux imbriqués un indice à la fois.
  • Utilise Array.isArray pour identifier les tableaux.
  • Les littéraux de tableau distinguent les valeurs stockées des emplacements vides.

2.2 Modifie un tableau ou copie-en une partie

La modification d’un tableau existant s’appelle une mutation. Certaines méthodes modifient le tableau par mutation ; d’autres renvoient un nouveau tableau. La valeur de retour d’une méthode peut aussi être une longueur ou un élément supprimé : vérifie donc à la fois le tableau et le résultat de l’appel.

Remplace des éléments et modifie les extrémités
const scores = [70, 80, 90];
scores[1] = 85;
console.log(scores); // [70, 85, 90]

const fait en sorte que scores continue à désigner le même tableau. Il ne fige pas le contenu de ce tableau. L’affectation scores = [] déclencherait une TypeError, mais l’affectation par indice est autorisée.

MéthodeModificationValeur de retour
push(...items)Ajout à la finNouvelle longueur
pop()Suppression à la finÉlément supprimé
unshift(...items)Ajout au débutNouvelle longueur
shift()Suppression au débutÉlément supprimé

Pour const queue = ["Ana", "Ben"];, queue.push("Cleo") renvoie 3. Le tableau devient ["Ana", "Ben", "Cleo"]. Puis queue.pop() renvoie « Cleo » et laisse les deux premiers noms. Stocker le résultat d’un appel à push stocke sa longueur numérique, et non le tableau modifié. pop et shift renvoient undefined sur un tableau vide. Ajouter ou supprimer au début décale aussi les autres indices, ce qui peut demander plus de travail sur de longs tableaux.

Insère et supprime au milieu

splice(start, deleteCount, ...items) modifie le tableau et renvoie un tableau des éléments supprimés :

const days = ["Mon", "Tue", "Thu", "Fri"];
const removed = days.splice(2, 0, "Wed");
// days: ["Mon", "Tue", "Wed", "Thu", "Fri"]
// removed: []
const nextRemoved = days.splice(1, 2);
// days: ["Mon", "Thu", "Fri"]
// nextRemoved: ["Tue", "Wed"]

Le premier appel commence à l’indice 2, ne supprime aucun élément et insère « Wed » à cet endroit. Le second commence à l’indice 1 et supprime deux éléments. Son second argument est un nombre d’éléments, pas un indice de fin. Les éléments situés après une insertion ou une suppression reçoivent de nouveaux indices.

Copie une plage avec slice

slice(start, end) renvoie un nouveau tableau et exclut l’indice de fin. Pour const t = [10, 20, 30, 40, 50];, t.slice(1, 3) donne [20, 30] et laisse t inchangé. t.slice(-2) copie les deux derniers éléments, [40, 50]. Sans argument, t.slice() copie le tableau entier. La lettre supplémentaire dans splice signale une autre opération : cette méthode modifie l’original ; slice copie une plage.

Évite les trous accidentels dans la liste

Écrire au-delà de la fin crée des emplacements vides. Après const a = [1, 2]; a[4] = 5;, la longueur vaut 5 et les indices 2 et 3 sont des trous. delete a[i] laisse aussi un trou et conserve la longueur. Utilise push pour ajouter à la fin et splice(i, 1) pour supprimer un élément en comblant le trou.

Affecter une valeur plus petite à length supprime des éléments à la fin. a.length = 0 vide le tableau. Les éléments supprimés ne réapparaissent pas si la longueur est ensuite augmentée.

sort et reverse modifient aussi les tableaux par mutation. Les méthodes de copie comprennent slice, concat, map, filter, toSorted, toReversed, toSpliced et with. Lorsqu’une méthode renvoie un nouveau tableau, enregistre ou utilise ce résultat ; l’original conserve son contenu précédent.

Points clés

  • const empêche la réaffectation de la variable mais autorise la mutation du tableau.
  • push et unshift renvoient des longueurs ; pop et shift renvoient les éléments supprimés.
  • splice modifie le tableau en place et renvoie les éléments supprimés.
  • slice copie une plage dont l’indice de fin est exclu.
  • delete laisse un trou ; splice(i, 1) le comble.
  • Affecter une valeur plus petite à length supprime des éléments à la fin.
  • Conserve le résultat d’une méthode de copie lorsque tu as besoin du nouveau tableau.

2.3 Recherche des valeurs et transforme des listes en texte

Une recherche peut demander une réponse par oui ou par non, ou la position d’un élément. La conversion en texte a un autre objectif : elle modifie la forme des données pour qu’une liste puisse être lue, stockée ou traitée.

Demande si une valeur est présente ou où elle se trouve

includes(value) renvoie un booléen. ["tea", "coffee"].includes("tea") vaut true ; remplacer la recherche par « Tea » donne false. La recherche de texte tient compte de la casse et les types comptent : [5].includes("5") vaut false.

indexOf(value) renvoie le premier indice correspondant, ou -1 lorsqu’aucune valeur ne correspond. lastIndexOf effectue la recherche depuis la fin. Avec [3, 7, 3, 9], le premier 3 est à l’indice 0 et le dernier à l’indice 2. La recherche de 5 renvoie -1.

N’écris pas if (arr.indexOf(x)). L’indice 0 est évalué comme faux, tandis que -1 est évalué comme vrai : ce test rejette une correspondance au début et accepte une valeur absente. Utilise arr.indexOf(x) !== -1, ou utilise includes lorsque la position n’est pas nécessaire.

Pour les valeurs ordinaires, les deux méthodes exigent le même type et la même valeur, comme l’égalité stricte. Leur traitement de NaN diffère : [1, NaN].includes(NaN) vaut true, mais [1, NaN].indexOf(NaN) vaut -1. La règle d’égalité utilisée par includes permet de considérer NaN comme égal à lui-même.

Compare volontairement les contenus

Deux tableaux créés séparément sont des tableaux différents, même lorsque leurs éléments correspondent. [1, 2] === [1, 2] vaut false ; == compare aussi l’identité des tableaux. Pour vérifier que les contenus sont identiques et dans le même ordre, compare les longueurs puis les valeurs à chaque indice correspondant. Un simple test d’appartenance ne permettrait d’établir ni le même ordre ni le même nombre de répétitions.

Assemble les éléments en une chaîne
const dateParts = ["2026", "03", "15"];
console.log(dateParts.join("-")); // "2026-03-15"
console.log([1, 2, 3].join()); // "1,2,3"
console.log([1, 2, 3].join("")); // "123"

join place son séparateur entre les éléments, jamais après le dernier. Son séparateur par défaut est une virgule sans espaces. Les éléments null et undefined contribuent par un texte vide. Choisis explicitement le séparateur pour obtenir un résultat lisible.

Utiliser + avec une chaîne convertit aussi un tableau en texte, mais emploie des virgules : "List: " + [1, 2] devient « List: 1,2 ». La structure imbriquée est perdue dans ce texte : String([1, [2, 3]]) donne "1,2,3". Affiche le tableau lui-même pour examiner sa structure.

Découpe le texte en morceaux

"red,green,blue".split(",") renvoie ["red", "green", "blue"]. Le séparateur doit correspondre exactement. Découper « red, green » sur une simple virgule conserve l’espace au début du second morceau ; découper sur une virgule suivie d’un espace supprime la virgule et cet espace.

"4,8,15".split(",") renvoie des chaînes, pas des nombres. Convertis chaque morceau avant d’additionner les valeurs numériques. Sinon, l’opérateur + peut assembler du texte au lieu de calculer un total.

Pour un texte simple composé de lettres, "stressed".split("").reverse().join("") produit « desserts ». Le découpage crée un nouveau tableau, l’inversion modifie ce tableau et l’assemblage reconstruit une chaîne. Un séparateur vide découpe les unités de code UTF-16 ; certains symboles utilisent plusieurs unités : ce n’est donc pas une méthode générale pour inverser tout texte lisible.

Points clés

  • Utilise includes pour vérifier l’appartenance et indexOf ou lastIndexOf pour trouver les positions.
  • Compare un indice de recherche à -1 ; ne l’évalue pas simplement comme vrai ou faux.
  • Des tableaux distincts sont comparés par identité, même lorsque leurs valeurs semblent identiques.
  • join crée du texte ; split crée un tableau de chaînes.
  • Les espaces ne font partie du séparateur que si tu les inclus explicitement.
  • Convertis le texte numérique avant d’effectuer des calculs.
3

Parcours des tableaux avec des boucles

Parcourir une liste est plus facile lorsque la boucle donne accès aux bonnes informations. Le corps a parfois seulement besoin de chaque valeur ; il lui faut parfois un indice, une valeur précédente ou un parcours du tableau à rebours. Construis des schémas réutilisables pour les totaux, les dénombrements, les recherches et les nouvelles listes, et observe comment chaque résultat change après une itération. Ces schémas permettent aussi de comprendre les méthodes de tableau qui suivent.

3.1 Parcours les valeurs d’un tableau sans en sauter

Une boucle peut parcourir les positions d’un tableau ou prendre directement ses valeurs. Choisis la forme qui donne accès aux informations nécessaires au corps. Garde à l’esprit que les indices du tableau changent lorsque tu insères ou supprimes des éléments.

Utilise les indices pour les positions et le sens du parcours
const fruits = ["apple", "pear", "plum"];
for (let i = 0; i < fruits.length; i++) {
  console.log(fruits[i]);
}

Les indices sont 0, 1, 2. Le test est < fruits.length, car l’indice 3 se trouve après la fin. Avec <=, une itération supplémentaire lirait undefined. Les boucles par indices peuvent aussi aller à rebours, en commençant à fruits.length - 1 et en continuant tant que i >= 0, ou parcourir un élément sur deux avec i += 2.

Utilise for...of pour les valeurs
for (const fruit of fruits) {
  console.log(fruit.toUpperCase());
}

Cela affiche « APPLE », « PEAR » et « PLUM ». fruit contient une valeur par itération. const fonctionne car chaque itération crée une nouvelle liaison ; la boucle ne réaffecte pas un compteur partagé. for...of fonctionne aussi sur les chaînes. Une boucle sur « banana » peut compter les voyelles en testant "aeiou".includes(ch) pour chaque ch.

Modifier un nombre local n’écrit pas dans le tableau. Après for (let n of nums) { n = n * 2; }, les éléments numériques de nums sont inchangés. Pour les modifier par mutation, effectue une affectation par nums[i], ou construis un nouveau tableau de nombres doublés.

Obtiens les valeurs et les indices ensemble

entries() fournit des paires contenant un indice et une valeur. Les crochets dans l’en-tête de la boucle extraient chaque paire :

for (const [i, fruit] of fruits.entries()) {
  console.log((i + 1) + ". " + fruit);
}

Le résultat est « 1. apple », « 2. pear », « 3. plum ». Les indices du tableau commencent toujours à zéro ; i + 1 ne change que la numérotation affichée.

BesoinBoucle utile
Chaque valeur dans l’ordrefor...of
Positions, ordre inverse ou éléments voisinsfor par indices
Valeur et indice ensemblefor...of sur entries()

for...in parcourt les noms de propriétés. Pour les tableaux, ses indices sont des chaînes et il peut inclure des propriétés supplémentaires. Utilise les formes de boucle ci-dessus pour traiter les éléments.

Évite de sauter des éléments décalés
const nums = [2, 4, 5, 6];
for (let i = 0; i < nums.length; i++) {
  if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// nums is [4, 5]

À l’indice 0, supprimer 2 déplace 4 à l’indice 0. La mise à jour fait passer i à 1 : 4 est donc sauté. La boucle rencontre ensuite 5 et supprime 6. Le résultat contient encore un nombre pair.

Lors d’une suppression par indice, parcours le tableau à rebours depuis la fin. La suppression d’un élément ne décale alors que des positions déjà parcourues. Une autre approche consiste à construire un nouveau tableau contenant les valeurs à garder. Évite d’ajouter des éléments au même tableau lorsque le test d’arrêt de la boucle dépend de sa longueur ; la borne peut continuer à se déplacer.

Points clés

  • Parcours les indices à partir de 0 tant que i < arr.length.
  • Utilise for...of lorsque seules les valeurs sont nécessaires.
  • entries() fournit des paires indice-valeur.
  • Réaffecter une variable de boucle numérique locale ne remplace pas un élément du tableau.
  • Une suppression pendant un parcours vers l’avant peut faire sauter des éléments décalés ; parcours le tableau à rebours ou construis-en un nouveau.

3.2 Calcule des totaux, effectue des recherches et construis de nouvelles listes

De nombreuses tâches sur les tableaux utilisent les mêmes schémas de boucles simples. Détermine le résultat voulu, choisis sa valeur de départ et mets-le à jour une fois pour chaque élément pertinent. Un suivi montre ce que représente le résultat après chaque étape.

Cumule un total et compte les correspondances
const temps = [18, 21, 19, 24];
let sum = 0;
let warm = 0;
for (const t of temps) {
  sum += t;
  if (t > 20) warm++;
}

sum additionne chaque température ; warm n’ajoute un que pour une température supérieure à 20 °C. Ces variables suivent des quantités différentes. Un suivi rend cette distinction visible :

tsum après l’additionwarm après la vérification
18180
21391
19581
24822

La moyenne est sum / temps.length, soit 20,5 °C. Vérifie la longueur avant de diviser : un tableau vide donne 0 / 0, soit NaN, et non une moyenne qui a un sens.

Suis la plus grande ou la plus petite valeur

Pour un tableau non vide, initialise le maximum avec son premier élément. Remplace-le ensuite uniquement lorsqu’une valeur plus grande est trouvée :

const values = [-3, -7, -1, -5];
let max = values[0];
for (const n of values) {
  if (n > max) max = n;
}
// max is -1

Commencer à zéro conserverait incorrectement zéro pour une liste ne contenant que des valeurs négatives. Commencer à -Infinity fonctionne aussi pour un maximum, mais une entrée vide laisse alors cette valeur de départ. Pour un minimum, inverse la comparaison et choisis le premier élément ou Infinity comme valeur de départ.

Trouve une première correspondance ou teste toute une liste

Une recherche stocke une correspondance et quitte la boucle avec break. Avec let firstWarm;, la boucle peut affecter firstWarm = t au premier t > 20 et s’interrompre. Elle trouve 21 et laisse les éléments suivants sans les vérifier. Si aucun élément ne correspond, la variable reste à undefined.

Pour tester si « tous » satisfont une condition, initialise un indicateur à true et affecte-lui false au premier échec. Pour tester si « au moins un » la satisfait, initialise-le à false et affecte-lui true au premier succès. Si le seuil de réussite est fixé à 50, [72, 85, 49] échoue au test vérifiant que tous ont réussi à cause de 49. Une liste vide laisse l’indicateur à sa valeur de départ.

Construis des valeurs modifiées et compare les éléments voisins
const km = [1.5, 3, 0.25];
const meters = [];
for (const d of km) {
  meters.push(d * 1000);
}
// meters is [1500, 3000, 250]

Le nouveau tableau est vide au départ et reçoit une distance convertie par itération. Place une condition avant push lorsque seules certaines valeurs doivent figurer dans le résultat.

Pour calculer les changements d’un jour à l’autre, commence à l’indice 1, car l’indice 0 n’a pas de jour précédent :

const changes = [];
for (let i = 1; i < temps.length; i++) {
  changes.push(temps[i] - temps[i - 1]);
}
// changes is [3, -2, 5]

Il y a une différence de moins que de mesures. Soustraire dans l’ordre inverse inverserait tous les signes. On retrouve les mêmes formes de résultats dans les méthodes de tableau : map construit des valeurs transformées, filter garde les correspondances, find recherche, some et every testent, et reduce accumule. Une boucle reste utile lorsqu’un seul parcours doit produire plusieurs résultats, comme avec sum et warm.

Points clés

  • Initialise les totaux et les compteurs à zéro, puis mets chacun à jour selon son rôle.
  • Initialise une valeur extrême à partir des données ou d’un infini approprié.
  • Une recherche de première correspondance s’arrête avec break.
  • Les indicateurs « tous » et « au moins un » commencent avec des valeurs booléennes opposées.
  • Construis un nouveau tableau avec push pour préserver l’original.
  • Commence les comparaisons entre éléments voisins à l’indice 1.
  • Suis les variables qui changent pour trouver où un résultat devient incorrect pour la première fois.
4

Traite des tableaux avec des méthodes utilisant des fonctions de rappel

Les méthodes de tableau permettent à une courte fonction de décrire ce qui doit arriver à chaque valeur. La méthode gère le parcours tandis que la fonction de rappel fournit une transformation, un test ou le résultat cumulé suivant. Examine attentivement la valeur renvoyée : elle peut être un tableau, un élément, un indice, un booléen ou un total. Les mêmes règles concernant les fonctions de rappel s’appliquent à toutes ces tâches, y compris pour obtenir un comportement fiable lorsque la liste est vide.

4.1 Passe une fonction de rappel à une méthode de tableau

Une fonction reçoit des entrées, exécute du code et peut renvoyer un résultat. Une fonction de rappel est une fonction transmise à une autre fonction pour que celle-ci l’appelle. Les méthodes de tableau utilisent des fonctions de rappel pour décrire le travail à effectuer sur chaque élément.

Écris une courte fonction fléchée

n => n * 2 reçoit un paramètre nommé n et renvoie sa valeur doublée. La flèche sépare les entrées du corps. Avec un seul paramètre, les parenthèses peuvent être omises. Elles sont nécessaires sans paramètre ou avec plusieurs paramètres : () => 0 et (a, b) => a - b.

const double = n => n * 2;
const doubled = [1, 2, 3].map(double);
// doubled is [2, 4, 6]

double désigne la fonction elle-même. La méthode l’appelle avec chaque nombre. Écrire map(double()) appellerait immédiatement la fonction et transmettrait son résultat à la place de la fonction. Avec un test nommé comme function isEven(n) { return n % 2 === 0; }, utilise filter(isEven) pour laisser la méthode fournir chaque élément.

Renvoie une valeur depuis un corps de bloc

Une expression placée après la flèche est renvoyée automatiquement. Les accolades créent un bloc : un résultat doit donc être renvoyé explicitement avec return :

const double = n => {
  const doubled = n * 2;
  return doubled;
};

Sans return, la fonction renvoie undefined. [1, 2, 3].map(n => { n * 2; }) produit donc [undefined, undefined, undefined]. La multiplication est exécutée, mais sa valeur ne devient jamais le résultat de la fonction de rappel.

Lis les arguments de la fonction de rappel selon leur position

Les méthodes comme map, filter et forEach transmettent d’abord l’élément, ensuite son indice commençant à zéro, puis le tableau entier. Dans (name, i) => ..., tu choisis les noms ; leurs positions déterminent ce qu’ils reçoivent. Omets les paramètres inutilisés en fin de liste. D’autres méthodes ont des signatures différentes : reduce reçoit aussi un accumulateur et une fonction de rappel de tri reçoit deux valeurs à comparer.

Utilise forEach pour effectuer des actions
const letters = ["a", "b"];
const result = letters.forEach((letter, i) => {
  console.log(i + ": " + letter);
});
// Prints "0: a" and "1: b".
// result is undefined.

L’affichage est un effet de bord : une action effectuée pendant l’exécution de la fonction de rappel. forEach ignore les valeurs renvoyées par la fonction de rappel et renvoie lui-même undefined. Utilise map lorsqu’un nouveau tableau de résultats est nécessaire. Renvoyer une valeur depuis une fonction de rappel de forEach ne change pas cette règle.

Un return dans cette fonction de rappel ne termine que l’appel en cours ; la méthode passe à l’élément suivant. On ne peut pas utiliser break dans une fonction de rappel pour quitter forEach. Choisis for...of avec break, ou une méthode de recherche comme find ou some, lorsque le traitement des éléments suivants doit s’arrêter à une correspondance.

Ces méthodes utilisant une fonction de rappel ne modifient pas elles-mêmes le tableau source. La fonction de rappel peut néanmoins le modifier par mutation, par exemple par une affectation à un indice ou avec push. Une fonction de rappel centrée sur sa valeur de retour ou sur l’action prévue aide à comprendre ce que contiendra le tableau source ensuite.

Points clés

  • Passe la fonction de rappel elle-même, sans l’appeler d’abord.
  • Un corps constitué d’une expression renvoie automatiquement sa valeur ; un corps de bloc nécessite return.
  • La position des paramètres d’une fonction de rappel détermine leur sens.
  • forEach effectue des actions et renvoie undefined.

4.2 Transforme chaque valeur ou garde les valeurs correspondantes

Choisis une méthode de tableau selon la forme du résultat. map produit une valeur pour chaque élément présent. filter garde les éléments d’origine qui satisfont un test. Les deux renvoient de nouveaux tableaux.

Transforme avec map
const km = [1.5, 3, 0.25];
const meters = km.map(d => d * 1000);
// meters is [1500, 3000, 250]; km is unchanged.

La valeur renvoyée par la fonction de rappel devient l’élément à la position correspondante. Pour une entrée sans trou, la fonction de rappel est appelée une fois par élément et le résultat a la même longueur. La transformation fonctionne aussi sur les éléments qui sont des chaînes : ["ana", "ben"].map(s => s.toUpperCase()) donne ["ANA", "BEN"].

Le deuxième paramètre de la fonction de rappel donne l’indice. ["Ana", "Ben"].map((name, i) => (i + 1) + ". " + name) construit ["1. Ana", "2. Ben"]. Si la fonction de rappel a un corps de bloc, renvoie explicitement la valeur à stocker.

Sélectionne avec filter
const temps = [18, 21, 19, 24];
const warm = temps.filter(t => t > 20);
// warm is [21, 24]

filter garde un élément lorsque la fonction de rappel renvoie un résultat évalué comme vrai. La méthode garde l’élément lui-même, pas le booléen de la fonction de rappel. Les valeurs retenues conservent leur ordre d’origine. Le résultat peut contenir tous les éléments, certains ou aucun ; temps.filter(t => t > 30) vaut [].

Ne renvoie pas l’élément lui-même lorsque zéro est une donnée valide. [0, 5, 0, 3].filter(n => n) écarte les deux zéros car ils sont évalués comme faux. Une condition comme n !== null supprime les mesures manquantes représentées par null tout en conservant zéro. Énonce la règle réelle pour garder un élément.

Résultat vouluMéthode
Une valeur transformée par élémentmap
Tous les éléments d’origine qui satisfont un testfilter
Certains éléments, puis leur transformationfilter suivi de map

Utiliser map avec une condition qui renvoie undefined pour les éléments rejetés ne les supprime pas. Ces résultats undefined occupent toujours des positions dans le nouveau tableau.

Suis un enchaînement de gauche à droite

[12, 7, 30, 4].filter(n => n >= 10).map(n => n / 2) crée d’abord [12, 30], puis [6, 15]. La deuxième fonction de rappel ne reçoit que les éléments retenus. Filtrer avant de transformer convient lorsque le test porte sur les valeurs d’origine. Changer l’ordre peut modifier les valeurs examinées par le test.

Convertis explicitement le texte numérique
const numbers = "4,8,15".split(",").map(Number);
// numbers is [4, 8, 15]

Number reçoit chaque morceau de texte et produit un nombre. Passer directement parseInt est un piège : son deuxième argument est une base de numération, alors que map fournit l’indice à cette place. ["10", "10", "10"].map(parseInt) donne [10, NaN, 2]. Utilise map(s => parseInt(s, 10)) pour fixer la base, ou map(Number) pour ces chaînes numériques entières.

Ni map ni filter ne remplace la source. temps.map(t => t + 1); seul abandonne le tableau nouvellement calculé. Enregistre-le, renvoie-le depuis une fonction ou utilise-le dans un enchaînement.

Points clés

  • map renvoie les valeurs transformées dans un nouveau tableau de même longueur.
  • filter renvoie les éléments d’origine correspondants dans leur ordre initial.
  • Un test de filtre doit exprimer la règle voulue pour conserver les zéros valides.
  • Les fonctions de rappel enchaînées travaillent sur le résultat de la méthode précédente.
  • Utilise Number ou une fonction enveloppante à un argument au lieu de map(parseInt).
  • Stocke ou utilise le nouveau tableau ; la source reste inchangée.

4.3 Trouve une correspondance et vérifie si une condition concerne au moins un ou tous les éléments

Certaines questions demandent une valeur, d’autres une position ou une réponse par oui ou par non. Les méthodes de recherche peuvent s’arrêter dès que la réponse est connue. Choisir le bon type de retour facilite ensuite l’écriture correcte des conditions.

Choisis une valeur ou un indice
const temps = [18, 21, 19, 24];
console.log(temps.find(t => t > 20)); // 21
console.log(temps.findIndex(t => t > 20)); // 1
console.log(temps.findLast(t => t > 20)); // 24
console.log(temps.findLastIndex(t => t > 20)); // 3

find recherche depuis le début et renvoie le premier élément correspondant. findIndex renvoie son indice. Leurs formes Last recherchent à rebours. Les quatre s’arrêtent lorsqu’elles trouvent la correspondance demandée.

MéthodeRésultat en cas de correspondanceRésultat sans correspondance
find, findLastÉlémentundefined
findIndex, findLastIndexIndice-1
filterTableau de toutes les correspondances[]

temps.find(t => t > 30) renvoie undefined ; temps.findIndex(t => t > 30) renvoie -1. Avant de passer un indice trouvé à splice, vérifie i !== -1. Sinon, splice(-1, 1) supprime le dernier élément alors qu’aucune correspondance n’a été trouvée.

Préserve les correspondances évaluées comme fausses

[3, 0, 5].find(n => n < 1) renvoie 0, une correspondance valide. if (result) la traite à tort comme un échec car zéro est évalué comme faux. Pour les données numériques, result !== undefined distingue zéro d’une absence de correspondance. Si un tableau peut lui-même contenir undefined comme valeur correspondante, utilise findIndex et compare le résultat à -1 ; la valeur seule ne permet pas de distinguer ces cas.

filter convient lorsque toutes les correspondances sont nécessaires. [5, 12, 8, 130].filter(n => n > 10) donne [12, 130] ; find ne renvoie que 12. Obtenir filter(...)[0] calcule le tableau entier des correspondances avant de lire sa première valeur.

Teste si au moins un ou tous satisfont une condition
const scores = [72, 85, 49];
const anyFailed = scores.some(s => s < 50); // true
const allPassed = scores.every(s => s >= 50); // false

some s’arrête au premier succès. every s’arrête au premier échec. Leurs réponses sont des booléens, pas des éléments. Dans ces appels, 49 fait réussir some et échouer every.

Pour un tableau vide, some renvoie false car aucun élément ne satisfait le test. every renvoie true car aucun élément n’échoue. Si un ensemble de résultats complété doit contenir au moins un score, combine les tests : scores.length > 0 && scores.every(s => s >= 50). La condition sur la longueur gère le cas vide ; every vérifie les éléments.

Choisis entre appartenance exacte et test personnalisé

includes("ana") recherche exactement cette valeur. Une recherche sans distinction de casse nécessite une fonction de rappel : names.some(n => n.toLowerCase() === "ana"). Elle peut accepter à la fois « Ana » et « ANA ». Utilise includes pour une valeur connue et une recherche avec fonction de rappel lorsque chaque élément doit être testé selon une règle.

Points clés

  • Choisis une valeur, un indice, un tableau ou un booléen selon le résultat nécessaire.
  • findLast et findLastIndex effectuent la recherche depuis la fin.
  • Compare un indice à -1 avant de l’utiliser pour modifier un tableau.
  • Un élément évalué comme faux, tel que 0, peut être une véritable correspondance.
  • some s’arrête à un succès ; every s’arrête à un échec.
  • Pour les tableaux vides, some donne false et every donne true.

4.4 Transmets un résultat d’une étape à l’autre avec reduce

reduce transmet un accumulateur d’un élément au suivant. Sa fonction de rappel renvoie l’accumulateur pour l’étape suivante. Après le dernier élément, la méthode renvoie cette valeur finale.

Suis le calcul d’un total
const temps = [18, 21, 19, 24];
const total = temps.reduce((sum, t) => sum + t, 0);
// total is 82

0 est l’accumulateur initial. La fonction de rappel reçoit d’abord sum, puis la température actuelle t. La somme qu’elle renvoie devient le premier argument de l’appel suivant.

Accumulateur avant l’appelÉlémentAccumulateur renvoyé
01818
182139
391958
582482

C’est le même total cumulé qu’avec une boucle utilisant let sum = 0. Une fonction de rappel reçoit aussi des arguments facultatifs pour l’indice et le tableau après l’accumulateur et l’élément. Les noms des paramètres sont libres, mais leur ordre est fixe.

Fournis une valeur de départ utile

Avec une valeur initiale, la réduction commence au premier élément. Sans valeur initiale, le premier élément présent devient l’accumulateur et les appels de la fonction de rappel commencent à l’élément présent suivant. Sur un tableau vide, omettre la valeur initiale déclenche une TypeError. [].reduce((sum, n) => sum + n, 0) renvoie 0 sans erreur car aucun appel de la fonction de rappel n’est nécessaire.

La valeur de départ détermine aussi le type de résultat. Utilise 0 pour les totaux ou les dénombrements et "" pour le texte. ["a", "b", "c"].reduce((text, s) => text + s.toUpperCase(), "") construit « ABC ». Un total numérique qui commence par une chaîne peut concaténer du texte par accident avec +.

Compte et trouve une valeur extrême
const scores = [72, 85, 49];
const passed = scores.reduce(
  (count, s) => s >= 50 ? count + 1 : count,
  0
);
// passed is 2

Un succès ajoute un ; un échec renvoie le compteur inchangé. Chaque branche fournit le prochain accumulateur. Pour un maximum, renvoie la plus grande valeur : [-3, -7, -1, -5].reduce((max, n) => n > max ? n : max, -Infinity) donne -1. Commencer à zéro serait incorrect pour cette liste entièrement négative. Une entrée vide laisse -Infinity : gère donc ce résultat lorsqu’un maximum réel est nécessaire.

Renvoie une valeur dans chaque branche

Une fonction de rappel avec un corps de bloc nécessite return. (sum, n) => { sum + n; } renvoie undefined : le résultat final de la réduction est donc undefined. Un retour manquant dans certaines branches est aussi dangereux. Dans un comptage sur [72, 49, 85], renvoyer une valeur uniquement en cas de réussite donne d’abord 1, puis undefined pour 49, puis NaN lorsqu’on ajoute un pour 85. Renvoie l’accumulateur inchangé lorsqu’un élément ne contribue pas au résultat.

Combine les opérations sans masquer la tâche

Le total des scores atteignant le seuil de réussite est scores.filter(s => s >= 50).reduce((sum, s) => sum + s, 0), ce qui donne 157. Une moyenne nécessite un nombre d’éléments distinct : temps.reduce((sum, t) => sum + t, 0) / temps.length donne 20,5 °C. Vérifie d’abord la longueur, car une entrée vide donne NaN après division. Si une fonction de rappel commence à accomplir plusieurs tâches sans rapport, une boucle for...of peut montrer plus clairement les résultats qui changent.

Points clés

  • reduce transmet d’abord l’accumulateur, puis l’élément.
  • La fonction de rappel doit renvoyer le prochain accumulateur dans chaque branche.
  • Une valeur initiale explicite rend prévisible le comportement pour une entrée vide.
  • Choisis la valeur de départ selon le résultat : total, dénombrement, texte ou valeur extrême.
  • Une moyenne nécessite à la fois un total et un nombre d’éléments non nul.
5

Trie, copie et combine des tableaux

Ordonner une liste et la copier sont deux choix distincts. Un tri numérique nécessite des règles de comparaison différentes de celles d’une liste de noms, et la langue influe sur l’ordre attendu par les lecteurs. Détermine si la séquence d’origine doit être conservée avant de choisir une méthode de modification ou de copie. Les références et les copies superficielles expliquent quelles modifications ultérieures restent locales et lesquelles sont visibles à travers un autre nom du tableau.

5.1 Trie des nombres et préserve l’original

Le tri détermine un ordre en comparant les éléments. L’inversion renverse simplement l’ordre existant. Pour ces deux opérations, certaines méthodes modifient le tableau et d’autres créent une copie.

Comprends l’ordre par défaut

[10, 9, 1, 100].sort() donne [1, 10, 100, 9]. Sans fonction de comparaison, sort compare les éléments comme des chaînes, caractère par caractère, à l’aide des unités de code UTF-16. « 100 » commence par « 1 », qui vient avant « 9 ». Les éléments stockés restent des nombres ; seule la comparaison utilise leur forme textuelle.

Pour les chaînes, ce comportement par défaut peut aussi surprendre les lecteurs. ["banana", "Cherry", "apple"].sort() donne ["Cherry", "apple", "banana"], car les lettres ASCII majuscules viennent avant les minuscules. Les lettres accentuées peuvent être séparées des lettres avec lesquelles les lecteurs les regroupent. Utilise une comparaison adaptée à la langue pour obtenir l’ordre alphabétique attendu.

Renvoie le bon signe

Une fonction de comparaison reçoit deux éléments, a et b. Une valeur de retour négative place a avant b ; une valeur positive le place après b ; zéro les traite comme égaux pour le tri.

const nums = [10, 9, 1, 100];
nums.sort((a, b) => a - b);
// nums is [1, 9, 10, 100]

Comparer 10 à 9 produit la valeur positive 1 : 9 vient donc avant 10. Pour un ordre numérique décroissant, utilise (a, b) => b - a. Renvoie un nombre dont le signe correspond à l’ordre voulu. (a, b) => a > b ne renvoie que true ou false, qui deviennent 1 ou 0 ; la fonction n’indique jamais que a doit venir avant b. Un tel comparateur produit un ordre non fiable.

Le tri est stable : les éléments considérés comme égaux par la comparaison conservent leur ordre relatif d’origine. ["kiwi", "fig", "pear", "plum"].sort((a, b) => a.length - b.length) donne ["fig", "kiwi", "pear", "plum"]. Les trois mots de quatre lettres conservent leur ordre.

Choisis entre mutation et copie
MéthodeEffet sur la sourceTableau renvoyé
sort(compare)Trie la source en placeMême tableau
toSorted(compare)Laisse la source inchangéeNouveau tableau trié
reverse()Inverse la source en placeMême tableau
toReversed()Laisse la source inchangéeNouveau tableau inversé

const sorted = scores.sort((a, b) => a - b); donne un second nom au même tableau, désormais trié. Cette instruction ne conserve pas l’ordre précédent. Pour obtenir un nouveau tableau trié, utilise scores.toSorted((a, b) => a - b) ou crée une copie par décomposition avant sort.

[3, 1, 2].toReversed() donne [2, 1, 3]. C’est une séquence inversée, pas un ordre numérique décroissant. Pour placer les plus grandes valeurs en premier, utilise un comparateur décroissant ou trie par ordre croissant avant d’inverser.

Vérifie les types avant de trier du texte numérique

Les valeurs issues de split sont des chaînes. ["10", "9", "100"].sort() donne ["10", "100", "9"]. La soustraction dans un comparateur convertit les chaînes numériques pendant la comparaison, mais laisse les éléments sous forme de chaînes. Lorsque les valeurs sont des données numériques, convertis-les d’abord avec map(Number), puis utilise un comparateur numérique. Cela prépare aussi les données à une addition ultérieure sans concaténation accidentelle de texte.

Points clés

  • Le tri par défaut compare du texte, même pour des éléments numériques.
  • Utilise a - b pour trier les nombres par ordre croissant et b - a pour l’ordre décroissant.
  • Un comparateur renvoie un nombre négatif, zéro ou un nombre positif.
  • Les éléments considérés comme égaux par la comparaison conservent leur ordre relatif.
  • sort et reverse modifient le tableau par mutation ; toSorted et toReversed le copient.
  • Inverser l’ordre actuel ne produit pas nécessairement un tri.

5.2 Ordonne et mets en forme les données pour le lecteur

Les lecteurs s’attendent à ce que l’ordre du texte et la mise en forme des nombres suivent les conventions d’une langue. Conserve les valeurs sous des formes faciles à traiter, choisis des paramètres régionaux explicites pour la comparaison de texte et mets le résultat final en forme pour le lecteur.

Compare du texte selon les règles régionales

a.localeCompare(b, locale) renvoie un nombre négatif lorsque a vient avant b, un nombre positif lorsqu’il vient après, et zéro lorsque la comparaison les considère comme égaux. Seul le signe est garanti, et non la valeur exacte -1 ou 1.

const names = ["Zoe", "Émile", "adam"];
const sorted = names.toSorted((a, b) => a.localeCompare(b, "en"));
// sorted is ["adam", "Émile", "Zoe"]

Un paramètre régional est un code de langue comme « en », « de » ou « sv ». L’allemand place « ä » avant « z », tandis que le suédois le place après « z ». Passe la langue prévue pour la page afin de rendre ce choix explicite. Sans paramètre régional, les paramètres par défaut de l’environnement d’exécution déterminent l’ordre.

Les comparaisons simples avec < comparent toujours les codes des caractères. Soustraire des mots produit NaN, qui agit comme une comparaison d’égalité lors du tri ; cela ne crée pas d’ordre alphabétique.

Définis des options de comparaison utiles

Avec { numeric: true }, les suites de chiffres sont comparées numériquement. Trier ["file10", "file2", "file1"] avec (a, b) => a.localeCompare(b, "en", { numeric: true }) donne ["file1", "file2", "file10"]. Un tri comme simple texte place « file10 » avant « file2 ».

En anglais, { sensitivity: "base" } considère comme égales les variantes de casse et d’accent, comme « a », « A » et « á ». Ces règles dépendent de la langue : le suédois traite « a » et « ä » comme des lettres de base différentes. Utilise les paramètres régionaux prévus pour les recherches comme pour les tris.

Pour de nombreuses comparaisons, réutilise un collateur :

const collator = new Intl.Collator("en", { numeric: true });
const sorted = files.toSorted(collator.compare);

collator.compare est déjà une fonction de comparaison. La créer une fois évite de configurer à plusieurs reprises les mêmes options régionales lors d’un tri important.

Trie les dates avant de les mettre en forme

Les chaînes YYYY-MM-DD de largeur fixe placent l’année avant le mois et le jour. Le tri textuel suit alors l’ordre des dates : ["2026-03-15", "2025-11-02", "2026-01-20"].sort() donne ["2025-11-02", "2026-01-20", "2026-03-15"].

Un texte commençant par le jour, comme « 15/03/2026 » et « 20/01/2025 », compare d’abord le jour et peut donc placer l’année la plus récente en premier. Stocke et trie ces dates au format ISO, puis produis le texte d’affichage à la fin.

Construis des listes et des nombres lisibles

join(", ") utilise le même séparateur partout. Intl.ListFormat ajoute le mot de liaison final de la langue :

const list = new Intl.ListFormat("en-US", {
  style: "long", type: "conjunction"
});
list.format(["Ana", "Ben", "Cleo"]);
// "Ana, Ben, and Cleo"

« en-GB » produit « Ana, Ben and Cleo » ; « nl » produit « Ana, Ben en Cleo ». Une disjonction utilise « or » en anglais. Deux noms donnent « Ana and Ben » sans virgule.

(1234.5).toLocaleString("en-US") donne « 1,234.5 », tandis que « de-DE » donne « 1.234,5 ». Ces résultats sont des chaînes. Trie les données numériques avant d’appliquer toLocaleString avec map ; les mettre en forme d’abord remplace les valeurs numériques par du texte dont la ponctuation influe sur le tri textuel.

Points clés

  • Utilise localeCompare ou un Intl.Collator réutilisable pour obtenir un ordre adapté à la langue.
  • Utilise le signe du résultat de la comparaison, et non une valeur exacte de -1 ou 1.
  • numeric: true ordonne naturellement les suites de chiffres à l’intérieur des noms.
  • Les chaînes de date ISO de largeur fixe se trient chronologiquement comme du texte.
  • Intl.ListFormat ajoute un mot de liaison adapté à la langue.
  • Trie d’abord les nombres et mets-les en forme en dernier.

5.3 Copie des tableaux sans partager de modifications accidentelles

Une variable de tableau contient une référence à un tableau. Affecter cette variable à un autre nom partage le tableau. La syntaxe de décomposition permet de créer un nouveau tableau extérieur, de combiner des listes ou de passer des éléments comme arguments distincts à une fonction.

Distingue l’affectation de la copie
const a = [1, 2, 3];
const b = a;
b.push(4);
// a and b both refer to [1, 2, 3, 4].
console.log(a === b); // true

Il y a un tableau avec deux noms. const n’empêche pas d’utiliser l’un ou l’autre nom pour le modifier par mutation. Pour obtenir un nouveau tableau extérieur, il faut une véritable opération de copie :

const c = [...a];
c.push(5);
// c is [1, 2, 3, 4, 5]; a stays [1, 2, 3, 4].
console.log(c === a); // false

Les trois points déploient les éléments de a dans un nouveau littéral de tableau. Les omettre a un effet différent : [a] crée un tableau à un élément, qui est le tableau a entier. [...a] contient les éléments de a séparément.

Combine et insère

[...[1, 2], ...[3, 4]] donne [1, 2, 3, 4], tout comme [1, 2].concat([3, 4]). [...first, 99, ...second] place un élément supplémentaire entre deux listes. [...list, "new"] crée un tableau prolongé, tandis que list.push("new") modifie le tableau existant. La décomposition conserve l’ordre des éléments de chaque entrée.

Reconnais une copie superficielle
const grid = [[1, 2], [3, 4]];
const copy = [...grid];
copy[0].push(9);
// grid[0] and copy[0] are both [1, 2, 9].

Les tableaux extérieurs sont différents, mais leurs éléments représentant les lignes pointent toujours vers les mêmes tableaux intérieurs. C’est une copie superficielle. Remplacer copy[0] par une nouvelle ligne ne modifierait que le tableau extérieur copié ; modifier la ligne existante par mutation change la ligne partagée. structuredClone(grid) crée une copie profonde indépendante de ces tableaux imbriqués.

Décompose des valeurs dans un appel

Math.max(...[3, 9, 4]) fournit trois arguments distincts et renvoie 9. Passer directement le tableau, Math.max([3, 9, 4]), fournit un seul tableau et donne NaN. La décomposition d’un tableau vide donne Math.max(...[]) === -Infinity et Math.min(...[]) === Infinity.

De très grands tableaux peuvent dépasser la limite d’arguments d’un moteur lorsqu’ils sont décomposés dans un appel. Il n’existe pas de nombre d’éléments sûr universel. Utilise une boucle ou reduce pour trouver une valeur extrême dans une grande entrée. La décomposition dans un littéral de tableau ne crée pas de liste d’arguments de fonction.

Décompose des chaînes et mets à jour des copies

[..."hello"] produit cinq chaînes d’une lettre. La décomposition d’une chaîne parcourt les points de code Unicode : [..."a😀"] contient deux éléments, tandis que "a😀".split("") contient trois unités de code UTF-16. Certains symboles visibles combinent plusieurs points de code : la décomposition ne permet donc pas de compter tous les caractères visibles de manière générale. Un nombre n’est pas itérable ; [...5] déclenche une TypeError.

Dans une liste de paramètres, function total(...nums) utilise le reste pour regrouper les arguments dans un tableau. La décomposition dans un appel fait l’inverse : elle fournit des arguments distincts.

Pour les mises à jour par copie, [10, 20, 30].with(1, 25) donne [10, 25, 30] et .toSpliced(1, 1) donne [10, 30]. toSorted et toReversed préservent aussi la source. Ce sont des copies superficielles : la même règle de partage des tableaux intérieurs s’applique donc.

Points clés

  • L’affectation partage un tableau ; la décomposition dans un littéral de tableau crée un nouveau tableau extérieur.
  • Omettre la décomposition imbrique un tableau comme un seul élément.
  • La décomposition peut combiner des tableaux et insérer des éléments supplémentaires sans mutation.
  • Une copie superficielle partage toujours les tableaux intérieurs ; structuredClone copie ces tableaux imbriqués en profondeur.
  • La décomposition dans un appel fournit des arguments distincts et ne convient pas aux entrées de taille non bornée.
  • La décomposition d’une chaîne parcourt ses points de code ; les paramètres du reste regroupent les arguments.
  • with et toSpliced créent des copies modifiées.

Boucles et tableaux en JavaScript : exemples

5 Leçons Interactives

1

Suis une boucle de sa première vérification jusqu’à sa sortie

12 étapes
Suis un compteur et un total cumulé, compare les boucles dont la condition est vérifiée avant ou après le corps, puis contrôle une recherche imbriquée.
  1. 1
    IntroductionSuis ce qui change

    Une boucle répète un corps, mais son résultat dépend de l’ordre des vérifications et des changements. Nous allons suivre un petit total une itération à la fois, puis choisir une boucle fondée sur une condition (while vérifie d’abord, do...while après une exécution) et contrôler une recherche imbriquée avec break et continue pour quitter la boucle ou passer à l’itération suivante.

    Distingue deux questions : quelle valeur atteint le corps et quelle valeur fait échouer la vérification suivante ? La dernière vérification qui échoue fait partie du déroulement de l’exécution, même si elle n’exécute pas le corps.

  2. 2
    ExempleMets en place un total cumulé

    Nous voulons obtenir le total de 2, 4 et 6. Le compteur choisit chaque nombre, tandis qu’un accumulateur distinct conserve leur somme.

    let total = 0;
    for (let n = 2; n <= 6; n += 2) {
      total += n;
    }
    

    L’initialisation affecte 2 à n une seule fois. La première vérification, 2 <= 6, réussit. La première exécution du corps ajoute deux à zéro, ce qui donne à total la valeur 2. La mise à jour donne ensuite à n la valeur 4.

  3. 3
    ExempleSuis les vérifications restantes

    La vérification suivante accepte 4 : le total devient donc 2 + 4, soit 6. La mise à jour porte le compteur à 6, qui satisfait toujours n <= 6. L’ajout de cette dernière valeur porte le total à 12.

    Ensuite, la mise à jour donne à n la valeur 8. À présent, 8 <= 6 est faux et la boucle s’arrête. Le corps s’est exécuté trois fois et la condition a été vérifiée quatre fois. Aucun huit n’a été ajouté au total.

  4. 4
    DéfiModifie une borne

    Si la boucle ci-dessus utilisait n < 6 au lieu de n <= 6, quel serait son total final et pourquoi ?

    ---reveal---

    Le total serait 6 : seuls 2 et 4 atteignent le corps. À n = 6, la condition est déjà fausse, donc six n’est jamais ajouté. La mise à jour atteint quand même six, mais atteindre une valeur dans l’en-tête ne garantit pas qu’une itération utilise cette valeur.

  5. 5
    ExplicationLaisse un résultat déterminer le moment de l’arrêt

    Supposons que la taille d’un lot commence à 5 et double jusqu’à atteindre au moins 30. Une boucle while peut exprimer directement le travail restant.

    let size = 5;
    let rounds = 0;
    while (size < 30) {
      size *= 2;
      rounds++;
    }
    

    Les tailles deviennent 10, 20 et 40. La boucle se termine après trois tours, car quarante est la première taille atteinte pour laquelle il n’est plus nécessaire de doubler.

  6. 6
    Point cléDétermine si une première exécution est nécessaire

    Une boucle while vérifie la condition avant toute action. Si la taille de départ vaut déjà 40, la boucle précédente ne s’exécute aucune fois. Une boucle do...while la doublerait une fois avant de constater qu’une nouvelle exécution est inutile.

    Utilise cette vérification après le corps lorsqu’une exécution fait partie de la tâche. Compter les chiffres en les supprimant un à un doit donner un chiffre pour zéro : une première exécution du corps est donc utile.

  7. 7
    DéfiLis une boucle dont la condition est vérifiée après le corps

    Que valent n et runs après ce code ?

    let n = 1;
    let runs = 0;
    do {
      n *= 3;
      runs++;
    } while (n < 8);
    

    ---reveal---

    n vaut 9 et runs vaut 2. Le premier passage dans le corps produit trois et la vérification réussit. Le second produit neuf et sa vérification échoue. Le test a lieu après chaque multiplication : la valeur finale peut donc dépasser la borne.

  8. 8
    ExempleIgnore une valeur sans terminer la boucle

    Cette boucle n’affiche que les valeurs autorisées du compteur.

    for (let n = 1; n <= 5; n++) {
      if (n === 3) continue;
      console.log(n);
    }
    

    Elle affiche 1, 2, 4, 5. À trois, continue ignore l’affichage, mais la mise à jour de l’en-tête passe quand même à quatre. Avec break à la place, toute la boucle s’arrêterait à trois et aucune valeur ultérieure ne serait affichée.

  9. 9
    DéfiTrouve une mise à jour qui est ignorée

    Pourquoi ce code cesse-t-il de progresser à n = 2 ?

    let n = 0;
    while (n < 4) {
      if (n === 2) continue;
      n++;
    }
    

    ---reveal---

    Continue revient directement à la condition while et ignore n++. À deux, chaque vérification ultérieure est vraie et chaque exécution du corps ignore à nouveau la mise à jour. Incrémente dans cette branche avant de continuer, ou utilise une boucle for dont l’en-tête effectue la mise à jour.

  10. 10
    ExempleSuis une recherche intérieure

    Pour chaque valeur extérieure, une boucle intérieure recommence.

    for (let a = 1; a <= 3; a++) {
      for (let b = 1; b <= 4; b++) {
        if (a * b === 6) break;
        console.log(a, b);
      }
    }
    

    À a = 2, atteindre b = 3 met fin à cette boucle intérieure avant l’affichage de la paire. La boucle extérieure passe quand même à trois. Un break ordinaire ne contrôle que la boucle la plus intérieure.

  11. 11
    DéfiTermine toute la recherche imbriquée

    La recherche imbriquée doit s’arrêter complètement dès son premier produit égal à six. Quelle modification permet de le faire et quelle paire la déclenche ?

    ---reveal---

    Donne à la boucle extérieure l’étiquette outer: et remplace le break par break outer;. La première paire correspondante est a = 2, b = 3 : la première ligne ne contient aucun produit égal à six, puis la deuxième l’atteint à sa troisième colonne. Les deux boucles se terminent à ce point, donc la troisième ligne ne s’exécute jamais.

  12. 12
    RécapitulatifSuis le déroulement de l’exécution

    Suis l’initialisation une fois, puis chaque condition, corps et mise à jour dans l’ordre. Ne compte comme itérations que les entrées dans le corps pour lesquelles la condition est vraie.

    Une boucle while peut ignorer entièrement le corps ; une boucle do...while ne le peut pas. Continue permet une itération suivante mais peut contourner une mise à jour de boucle while. Break termine sa boucle et une étiquette peut étendre cette sortie à une recherche extérieure. Dans chaque cas, identifie la prochaine instruction atteinte par l’exécution.

2

Suis un tableau et le résultat de chaque méthode

11 étapes
Lis des données indicées, suis une insertion et une suppression, puis transforme une liste dans laquelle tu as effectué une recherche en texte à afficher.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuis les deux résultats d’une modification
  2. 2
    ExempleAssocie les valeurs aux indices
  3. 3
    DéfiLis un planning imbriqué
  4. 4
    ExempleAjoute une tâche et conserve la valeur de retour
  5. 5
    ExempleRemplace une tâche avec splice
  6. 6
    DéfiCopie une plage
  7. 7
    ExplicationRecherche explicitement une position
  8. 8
    DéfiDécoupe et assemble du texte
  9. 9
    Point cléDistingue le texte numérique des nombres
  10. 10
    DéfiRecherche avant de supprimer
  11. 11
    RécapitulatifDistingue les positions, les modifications et le texte
3

Transforme une boucle en un résultat utile

10 étapes
Choisis un parcours, calcule un total et un dénombrement, puis construis les changements entre des mesures voisines.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisis ce dont le corps a besoin
  2. 2
    ExplicationLis directement les valeurs
  3. 3
    DéfiParcours une position sur deux
  4. 4
    ExempleCalcule un total et compte les longs trajets
  5. 5
    ExempleUtilise le total obtenu
  6. 6
    DéfiTrouve une valeur extrême sans inventer zéro
  7. 7
    ExempleConstruis les différences entre éléments voisins
  8. 8
    DéfiNe garde que les augmentations
  9. 9
    ConseilSupprime depuis la fin lorsque les indices se décalent
  10. 10
    RécapitulatifChoisis une valeur de départ pour chaque résultat
4

Suis un enchaînement de fonctions de rappel

15 étapes
Renvoie des valeurs depuis des fonctions de rappel, sélectionne et transforme des mesures, recherche-les et suis une réduction.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionLaisse la méthode gérer le parcours
  2. 2
    ExplicationRenvoie une expression ou le résultat d’un bloc
  3. 3
    DéfiChoisis une méthode pour afficher un résultat
  4. 4
    ExempleGarde les mesures sélectionnées
  5. 5
    ExempleTransforme les valeurs sélectionnées
  6. 6
    DéfiConserve les zéros valides
  7. 7
    ExplicationRecherche une valeur ou sa position
  8. 8
    DéfiReconnais une correspondance égale à zéro
  9. 9
    Point cléLes tests « au moins un » et « tous » se décident à des moments différents
  10. 10
    ExempleCommence une réduction explicitement
  11. 11
    ConseilPrévois un prochain accumulateur dans chaque branche
  12. 12
    DéfiSuis un total après filtrage
  13. 13
    DéfiDiagnostique une fonction de rappel de conversion
  14. 14
    DéfiChoisis entre toutes les correspondances et une seule
  15. 15
    RécapitulatifExamine chaque forme de résultat renvoyé
5

Préserve les données tout en les ordonnant et en les mettant en forme

13 étapes
Choisis des règles de comparaison, trie les données numériques avant de les mettre en forme et suis le comportement des copies superficielles.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDistingue le choix de l’ordre de celui de l’identité
  2. 2
    ExempleVérifie l’ordre par défaut
  3. 3
    ExplicationUtilise le signe du comparateur
  4. 4
    DéfiPréserve l’ordre de la source
  5. 5
    ExempleLaisse la langue déterminer l’ordre du texte
  6. 6
    DéfiOrdonne des libellés numérotés
  7. 7
    LienTermine les calculs avant l’affichage
  8. 8
    ExempleDonne un second nom au même tableau
  9. 9
    ExempleCopie la liste extérieure
  10. 10
    DéfiTrouve une ligne intérieure partagée
  11. 11
    ConseilPasse des arguments sans construire un appel trop volumineux
  12. 12
    DéfiCombine ordre, copie et mise en forme
  13. 13
    RécapitulatifSuis ce qui est partagé et ce qui est renvoyé

Boucles et tableaux en JavaScript : QCM

40 Questions Pratiques en 4 séries

Série 1 : Transforme, recherche et réduis des tableaux10 Questions Pratiques

Question 1 sur 10

Que renvoie [4, 7].map(n => { n + 3; }) ?
  1. [7, 10]
  2. undefined
  3. [4, 7]
  4. [undefined, undefined]
Afficher la réponseMasquer la réponse
Réponse : D
Les accolades créent un corps de bloc qui ne comporte aucune instruction de retour. Chaque appel de la fonction de rappel renvoie donc undefined, que map stocke dans son nouveau tableau. [7, 10] nécessiterait un corps constitué d’une expression ou un retour explicite ; map renvoie bien un tableau.

Question 2 sur 10

Quel tableau résulte de cette expression ?

[5, 16, 9, 22].filter(n => n > 10).map(n => n - 2)
  1. [3, 14, 7, 20]
  2. [14, 20]
  3. [16, 22]
  4. [14]
Afficher la réponseMasquer la réponse
Réponse : B
Filter retient d’abord seize et vingt-deux ; map soustrait ensuite deux aux deux valeurs, ce qui produit [14, 20]. Garder les quatre valeurs transformées revient à ignorer l’étape de sélection. Les méthodes renvoient de nouveaux tableaux et la fonction de rappel suivante ne voit que les éléments du résultat filtré.

Question 3 sur 10

Que renvoie [8, 0, 6].find(n => n < 2) et comment faut-il vérifier qu’une valeur a été trouvée pour ce tableau numérique ?
  1. undefined ; tester result === undefined.
  2. 0 ; tester Boolean(result).
  3. 0 ; tester result !== undefined.
  4. 1 ; tester result !== -1.
Afficher la réponseMasquer la réponse
Réponse : C
Zéro est la première valeur inférieure à deux : c’est donc une véritable correspondance même s’il est évalué comme faux. Comparer le résultat à undefined permet de reconnaître le succès pour cette entrée numérique. Boolean(result) renverrait faux, tandis que un est l’indice correspondant et non la valeur renvoyée par find.

Question 4 sur 10

Quelle valeur cette réduction renvoie-t-elle ?

[6, 3, 5].reduce((total, n) => total + n, 4)
  1. 18
  2. 14
  3. 10
  4. 24
Afficher la réponseMasquer la réponse
Réponse : A
L’accumulateur commence à quatre, puis devient dix, treize et dix-huit au fur et à mesure que les éléments sont ajoutés. Quatorze ne totalise que les éléments du tableau et omet la valeur initiale fournie. Fournir cette valeur ne remplace pas le premier élément : les trois éléments sont toujours traités.

Question 5 sur 10

Quelles valeurs sont affichées et qu’est-ce qui est affecté à result ?

const result = [2, 5, 8].forEach(n => {
  if (n === 5) return;
  console.log(n);
});
  1. Affiche 2 ; result vaut undefined.
  2. Affiche 2, 8 ; result vaut [2, 8].
  3. Affiche 2, 8 ; result vaut undefined.
  4. Affiche 2, 5, 8 ; result vaut undefined.
Afficher la réponseMasquer la réponse
Réponse : C
À cinq, return termine cet appel de la fonction de rappel avant son affichage, mais forEach continue jusqu’à huit. La méthode renvoie toujours undefined : aucun tableau de résultats n’est donc recueilli. N’afficher que deux reviendrait à traiter le retour de la fonction de rappel comme une interruption de tout le parcours.

Question 6 sur 10

Les mesures valides incluent zéro ; seul null signifie qu’une mesure est manquante. Quelle expression convertit toutes les mesures valides en mètres ?

const km = [0, null, 1.2, 0.4];
  1. km.filter(n => n).map(n => n * 1000)
  2. km.map(n => n * 1000).filter(n => n !== null)
  3. km.filter(n => n !== null).map(n => n * 100)
  4. km.filter(n => n !== null).map(n => n * 1000)
Afficher la réponseMasquer la réponse
Réponse : D
Supprime null avant la conversion pour qu’il ne puisse pas devenir le nombre zéro, puis multiplie chaque distance retenue par mille. Le zéro valide doit rester, ce qui donne [0, 1200, 400]. Un filtre fondé sur l’évaluation comme vrai ou faux perd cette mesure, tandis que convertir d’abord transforme la valeur manquante en un zéro que le test ultérieur de null ne peut pas supprimer.

Question 7 sur 10

Que renvoie ce code ?

[64, 40, 91].reduce((count, score) => {
  if (score >= 60) return count + 1;
}, 0)
  1. NaN
  2. 2
  3. 1
  4. undefined
Afficher la réponseMasquer la réponse
Réponse : A
Le premier appel renvoie un. Le score insuffisant de quarante suit une branche sans retour, ce qui rend l’accumulateur suivant égal à undefined ; le dernier appel calcule undefined + 1, soit NaN. Un résultat final undefined se produirait si le dernier appel était lui aussi sans retour, mais le dernier score atteint le seuil.

Question 8 sur 10

Un compte rendu doit être vrai uniquement lorsqu’il existe au moins un score et que chaque score est d’au moins 70. Quelle expression gère toutes les tailles d’entrée ?
  1. scores.every(s => s >= 70)
  2. scores.length > 0 && scores.every(s => s >= 70)
  3. scores.length > 0 && scores.some(s => s >= 70)
  4. scores.length > 0 || scores.every(s => s >= 70)
Afficher la réponseMasquer la réponse
Réponse : B
Le test de longueur rejette une entrée vide et every rejette tout score insuffisant dans une liste non vide. Every seul renvoie vrai pour un tableau vide : il ne respecte donc pas l’exigence d’existence. Some accepte un mélange de scores suffisants et insuffisants, tandis que la condition OU accepte toute liste non vide.

Question 9 sur 10

Que produit cette expression ?

["6", "15", "4"].map(Number)
  .filter(n => n % 2 === 0)
  .map((n, i) => n + i)
  1. [6, 5]
  2. [6, 6]
  3. [6, 4]
  4. ["60", "42"]
Afficher la réponseMasquer la réponse
Réponse : A
La conversion donne [6, 15, 4] et le filtrage laisse [6, 4]. Le dernier map reçoit les indices zéro et un dans ce nouveau tableau, ce qui donne [6, 5]. [6, 6] réutilise à tort l’indice d’origine deux de quatre après que le filtrage a modifié les positions.

Question 10 sur 10

On veut trouver la plus grande valeur d’une liste numérique non vide, même lorsque toutes ses valeurs sont négatives. Quelle réduction satisfait cette exigence ?
  1. nums.reduce((best, n) => n > best ? n : best, 0)
  2. nums.reduce((best, n) => n < best ? n : best, Infinity)
  3. nums.reduce((best, n) => n > best ? n : best, -Infinity)
  4. nums.reduce((best, n) => n > best, -Infinity)
Afficher la réponseMasquer la réponse
Réponse : C
Chaque appel de la fonction de rappel conserve la plus grande des deux valeurs candidates, et commencer par une valeur inférieure à tout nombre fini permet à un élément négatif de devenir le maximum. Commencer à zéro peut renvoyer zéro pour des données entièrement négatives. Inverser la comparaison donne un minimum, tandis que renvoyer un booléen fait perdre la valeur numérique candidate après une étape.
Série 2 : Modifie des tableaux et construis des résultats avec des boucles10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Que contient size après ces instructions ?

const tags = ["new", "open"];
const size = tags.push("done");
  1. ["new", "open", "done"]
  2. 3
  3. "done"
  4. 2
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Que valent cut et data ensuite ?

const data = [4, 8, 12, 16];
const cut = data.splice(1, 2, 7);
  1. cut = [8] ; data = [4, 7, 12, 16]
  2. cut = [4, 7, 16] ; data = [8, 12]
  3. cut = [8, 12] ; data = [4, 8, 12, 16]
  4. cut = [8, 12] ; data = [4, 7, 16]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une recherche doit reconnaître une valeur à l’indice zéro et rejeter une valeur absente. Quelle condition doit remplacer if (items.indexOf(target)) ?
  1. if (items.indexOf(target) !== -1)
  2. if (items.indexOf(target) > 0)
  3. if (items.indexOf(target) !== 0)
  4. if (items.indexOf(target) === 1)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Quel en-tête de boucle fournit dans l’ordre chaque chaîne de labels ?
  1. for (const label in labels)
  2. for (const label of labels.length)
  3. for (const label of labels)
  4. for (const label in labels.length)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Quelle est la valeur finale de count ?

let count = 0;
for (const n of [11, 6, 14, 9]) {
  if (n >= 10) count++;
}
  1. 2
  2. 4
  3. 25
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Que reste-t-il dans values après ce code ?

const values = [3, 6, 8, 9];
for (let i = 0; i < values.length; i++) {
  if (values[i] % 3 === 0) values.splice(i, 1);
}
  1. [8]
  2. [6, 8, 9]
  3. [3, 8]
  4. [6, 8]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Quelle valeur obtient-on avec "7;12;5".split(";").join(" / ") ?
  1. [7, 12, 5]
  2. "7 / 12 / 5"
  3. "7;12;5"
  4. "7 / 12 / 5 / "
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Quel tableau est construit ?

const readings = [9, 4, 8, 3];
const rises = [];
for (let i = 1; i < readings.length; i++) {
  const change = readings[i] - readings[i - 1];
  if (change > 0) rises.push(change);
}
  1. [-5, 4, -5]
  2. [8]
  3. [4]
  4. [5, 5]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Quels sont la longueur et le dernier élément de a ensuite ?

const a = [2, 4];
a[5] = 12;
  1. Longueur 3 ; dernier élément 12.
  2. Longueur 5 ; dernier élément 12.
  3. Longueur 6 ; dernier élément undefined.
  4. Longueur 6 ; dernier élément 12.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un maximum doit être un élément d’un tableau numérique non vide, y compris lorsque toutes les valeurs sont négatives. Pourquoi commencer à 0 peut-il produire un résultat incorrect ?
  1. Zéro force chaque comparaison à renvoyer faux pour des données positives.
  2. Zéro peut dépasser tous les éléments et ne jamais être remplacé.
  3. Zéro arrête la boucle après son premier élément négatif.
  4. Zéro est ajouté à chaque élément avant la comparaison.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Trie, copie et combine des résultats en toute sécurité10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Que renvoie [8, 30, 4].toSorted() ?
  1. [4, 8, 30]
  2. [30, 4, 8]
  3. [8, 4, 30]
  4. [8, 30, 4]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Quels tableaux a et c contiennent-ils ensuite ?

const a = [6, 2];
const b = a;
const c = [...a];
b.push(9);
c[0] = 1;
  1. a = [1, 2, 9] ; c = [1, 2, 9]
  2. a = [6, 2] ; c = [1, 2]
  3. a = [6, 2, 9] ; c = [1, 2, 9]
  4. a = [6, 2, 9] ; c = [1, 2]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Comment classer readings du plus grand au plus petit tout en conservant sa séquence d’origine ?
  1. readings.toSorted((a, b) => b - a)
  2. readings.sort((a, b) => b - a)
  3. readings.toReversed()
  4. readings.toSorted((a, b) => a - b)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Quelle expression classe "part12", "part3" et "part1" dans l’ordre numérique naturel des noms sans modifier parts ?
  1. parts.toSorted((a, b) => a.localeCompare(b, "en"))
  2. parts.toSorted((a, b) => a - b)
  3. parts.toSorted((a, b) => a.localeCompare(b, "en", { numeric: true }))
  4. parts.toSorted((a, b) => b.localeCompare(a, "en", { numeric: true }))
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Que valent rows[0] et copy[1] ensuite ?

const rows = [[5], [8]];
const copy = [...rows];
copy[0].push(6);
copy[1] = [2];
  1. rows[0] = [5] ; copy[1] = [2]
  2. rows[0] = [5, 6] ; copy[1] = [8, 2]
  3. rows[0] = [5, 6] ; copy[1] = [2]
  4. rows[0] = [5] ; copy[1] = [8, 2]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un programme met en forme [1200, 25, 4] avec numbers.map(n => n.toLocaleString("de-DE")).toSorted(). Comment doit-il trier et mettre en forme les valeurs pour préserver numbers et les afficher par ordre numérique croissant ?
  1. toSorted numérique, puis mise en forme : ["4", "25", "1.200"].
  2. Mise en forme, puis toSorted par défaut : ["1.200", "25", "4"].
  3. toSorted par défaut, puis mise en forme : ["1.200", "25", "4"].
  4. sort numérique, puis mise en forme : ["4", "25", "1.200"].
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Quel tableau est renvoyé ?

["lion", "ox", "bear", "ant"]
  .toSorted((a, b) => a.length - b.length)
  .toReversed()
  1. ["lion", "bear", "ant", "ox"]
  2. ["bear", "lion", "ox", "ant"]
  3. ["ox", "ant", "lion", "bear"]
  4. ["bear", "lion", "ant", "ox"]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Que contient view ensuite ?

const values = [7, 2, 5];
const i = values.findIndex(n => n < 0);
values.splice(i, 1);
const view = values.toReversed();
  1. [5, 2, 7]
  2. [2, 7]
  3. [7, 2]
  4. [5, 2]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Quelle est la longueur de joined ?

const left = [4, 6];
const right = [8, 10, 12];
const joined = [...left, right];
  1. 5
  2. 2
  3. 4
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Ces chaînes de date au format jour/mois/année ne se trient pas dans l’ordre chronologique : ["08/02/2027", "19/01/2026", "03/12/2026"]. Quelles chaînes stockées donnent un ordre textuel chronologique pour les mêmes dates ?
  1. ["2026-01-19", "2026-12-03", "2027-02-08"]
  2. ["2026-03-12", "2026-19-01", "2027-08-02"]
  3. ["03/12/2026", "08/02/2027", "19/01/2026"]
  4. ["2027-02-08", "2026-12-03", "2026-01-19"]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Suis les boucles et lis les positions dans les tableaux10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Combien de fois le corps de cette boucle s’exécute-t-il ?

for (let i = 2; i < 7; i++) {
  console.log(i);
}
  1. 4 fois
  2. 6 fois
  3. 5 fois
  4. 7 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Que renvoie ["oak", "pine", "elm", "fir"].at(-2) ?
  1. "elm"
  2. "pine"
  3. "fir"
  4. undefined
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Quelle valeur est affichée ?

let n = 8;
do {
  n -= 3;
} while (n > 6);
console.log(n);
  1. 8
  2. 2
  3. 6
  4. 5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Quelle valeur total contient-il ensuite ?

let total = 0;
for (let n = 3; n <= 9; n += 3) {
  total += n;
}
  1. 9
  2. 18
  3. 12
  4. 15
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Quels nombres sont affichés, dans l’ordre ?

for (let n = 2; n <= 7; n++) {
  if (n === 4) continue;
  if (n === 6) break;
  console.log(n);
}
  1. 2, 3
  2. 2, 3, 5, 6
  3. 2, 3, 5, 7
  4. 2, 3, 5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Quelle paire de valeurs obtient-on avec grid.length et grid[1][2] ?

const grid = [[6, 2, 8], [9, 5, 1]];
  1. 3 et 1
  2. 2 et 1
  3. 2 et 5
  4. 6 et 8
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Combien d’itérations s’exécutent avant que cette boucle se termine ?

let size = 3;
let rounds = 0;
while (size < 20) {
  size *= 2;
  rounds++;
}
  1. 3 itérations
  2. 2 itérations
  3. 4 itérations
  4. 6 itérations
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Combien de fois count++ s’exécute-t-il ?

let count = 0;
for (let a = 0; a < 4; a++) {
  for (let b = a + 1; b < 4; b++) {
    if (b === 3) break;
    count++;
  }
}
  1. 2 fois
  2. 4 fois
  3. 3 fois
  4. 6 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Cette conversion doit afficher les mêmes valeurs qu’une boucle de comptage qui ignore 2. Comment la corriger en conservant la forme while ?

let i = 0;
while (i < 4) {
  if (i === 2) continue;
  console.log(i);
  i++;
}
  1. Utiliser if (i === 2) { break; }.
  2. Utiliser if (i === 2) { i++; continue; }.
  3. Placer i++ juste avant console.log(i).
  4. Remplacer la condition par i <= 4.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Que renvoie [9, 2, 9].lastIndexOf(9) ?
  1. 0
  2. 3
  3. 2
  4. 9
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

71 Mots-Clés, chacun avec sa définition

A

Accumulateur
Un accumulateur est une variable ou une valeur de fonction de rappel qui conserve un résultat en cours de construction d’un élément traité au suivant.
Un total de températures conserve la somme précédente avant d’ajouter la mesure courante à chaque étape.
Arrêt anticipé
Un arrêt anticipé termine un parcours dès que son résultat est déterminé, en évitant les vérifications ultérieures qui ne peuvent pas changer la réponse.
Une recherche avec find s’arrête à sa première correspondance, tandis que every s’arrête à son premier test échoué.
Arrondi en virgule flottante
L’arrondi en virgule flottante se produit lorsqu’un nombre ne peut pas être stocké exactement en binaire, ce qui affecte les calculs et les tests d’égalité.
Ajouter 0.1 dix fois produit 0.9999999999999999 : une borne exacte de boucle peut donc être manquée.

B

Boucle do...while
Une boucle do...while exécute son corps avant de tester la condition : sa première itération a donc lieu même si le test échoue ensuite.
Une boucle do...while qui compte les chiffres traite zéro une fois et le compte comme un nombre à un chiffre.
Boucle for...in
Une boucle for...in parcourt les noms des propriétés énumérables ; elle ne convient donc pas comme boucle ordinaire sur les valeurs d’un tableau.
Sur un tableau, elle fournit les noms des indices sous forme de chaînes et peut aussi parcourir des propriétés ajoutées qui ne sont pas des éléments.
Boucle for...of
Une boucle for...of reçoit dans l’ordre chaque valeur fournie par un itérable, sans nécessiter de compteur numérique explicite.
for (const fruit of fruits) lit directement les noms de fruits pour que le corps puisse traiter chaque nom.
Boucle imbriquée
Une boucle imbriquée est une boucle placée dans une autre boucle ; sa séquence intérieure recommence à chaque itération qui l’atteint.
Un parcours de trois lignes et quatre colonnes exécute son corps intérieur douze fois lorsque toutes les positions sont parcourues.
Boucle infinie
Une boucle infinie continue de se répéter sans se terminer car son exécution n’atteint jamais une sortie effective.
Un compteur qui ne change jamais peut laisser while (n < 3) afficher indéfiniment la même valeur.
Boucle while
Une boucle while vérifie sa condition avant chaque itération et se répète tant que cette condition est évaluée comme vraie ; elle peut ne s’exécuter aucune fois.
Un calcul de croissance utilise while (balance < 1500) pour se répéter jusqu’à ce que la cible soit atteinte.

C

Chaîne de date au format ISO
Une chaîne de date au format ISO de largeur fixe sous la forme YYYY-MM-DD place l’année, le mois et le jour dans un ordre qui permet un tri textuel chronologique.
La chaîne « 2025-11-02 » se classe avant « 2026-01-20 » car l’année est comparée en premier.
Chaîne de méthodes
Une chaîne de méthodes utilise la valeur renvoyée par un appel comme objet receveur de l’appel suivant, ce qui permet de lire une séquence de traitement des données de gauche à droite.
Une chaîne filter-map garde d’abord les nombres sélectionnés puis ne transforme que ces nombres retenus.
Collateur
Un collateur regroupe les règles de comparaison des paramètres régionaux dans une instance Intl.Collator réutilisable dotée d’une fonction de comparaison prête à l’emploi.
Un collateur avec numeric: true trie les noms contenant des chiffres dans un ordre numérique naturel.
Compteur
Un compteur enregistre le nombre d’événements ou de correspondances ; il commence généralement à zéro et augmente de un par correspondance.
Un compteur de jours chauds n’augmente que lorsque la température courante satisfait le test choisi.
Condition de boucle
Une condition de boucle est le test qui détermine si une nouvelle itération peut s’exécuter ; une vérification préalable fausse empêche l’exécution du corps.
Avec i < 10, atteindre i = 10 termine la boucle avant une nouvelle exécution du corps.
Copie profonde
Une copie profonde duplique les données imbriquées ainsi que leur conteneur extérieur, afin que les modifications des lignes copiées n’affectent pas les lignes d’origine.
Pour une grille de tableaux de nombres, structuredClone crée des copies indépendantes des lignes intérieures.
Copie superficielle
Une copie superficielle crée un nouveau tableau extérieur tout en conservant les mêmes valeurs d’éléments, y compris les références aux éventuels tableaux imbriqués.
Ajouter un élément à une ligne d’une grille copiée par décomposition modifie la ligne partagée avec la grille d’origine.

E

Effet de bord
Un effet de bord est une action qu’une fonction effectue en plus de fournir sa valeur de retour, comme afficher du texte ou modifier des données partagées.
Une fonction de rappel de forEach peut afficher un nom même si la méthode elle-même renvoie undefined.
Emplacement vide
Un emplacement vide est un trou indicé qui ne contient aucun élément stocké ; il compte dans la longueur du tableau et sa lecture donne undefined.
new Array(3) crée trois emplacements vides, tandis que [3] crée un élément stocké explicitement.
Erreur de décalage d’une unité
Une erreur de décalage d’une unité fait inclure une position de trop ou manquer une position prévue dans le calcul d’une borne ou dans une boucle.
Utiliser i <= arr.length lit un indice au-delà du dernier élément lors du parcours d’un tableau.

É

Élément
Un élément est une valeur stockée à une position d’un tableau ; il peut notamment s’agir d’un nombre, d’une chaîne ou d’un autre tableau.
Dans ["red", "green", "blue"], la chaîne « green » est l’élément stocké à l’indice 1.
Étape de réduction
Une étape de réduction utilise l’accumulateur courant et un élément pour renvoyer l’accumulateur que reçoit l’appel suivant de la fonction de rappel.
Une étape de comptage renvoie soit count + 1, soit le compteur inchangé selon le résultat du test.
Étiquette de boucle
Une étiquette de boucle nomme une boucle afin qu’un break ou un continue avec étiquette puisse diriger l’exécution vers cette boucle englobante.
Écrire break outer; lorsqu’une correspondance est trouvée peut terminer les deux boucles si la boucle extérieure porte l’étiquette outer.

F

Fonction de comparaison
Une fonction de comparaison renvoie un nombre négatif, nul ou positif pour déterminer l’ordre relatif de deux valeurs pendant un tri.
Le comparateur (a, b) => a - b place les plus petites valeurs numériques avant les plus grandes.
Fonction de rappel
Une fonction de rappel est une fonction transmise à une autre fonction, qui l’appelle dans le cadre de son travail, souvent avec chaque élément d’un tableau.
Map appelle sa fonction de rappel avec un élément et utilise la valeur renvoyée dans le nouveau tableau.
Fonction fléchée
Une fonction fléchée utilise la syntaxe de flèche pour définir une fonction, souvent de façon concise avec des paramètres suivis d’une expression dont la valeur est renvoyée.
La fonction de rappel n => n * 2 reçoit un nombre et renvoie une valeur deux fois plus grande.

I

Identité d’un tableau
L’identité d’un tableau distingue un tableau d’un autre, même lorsque les deux contiennent les mêmes valeurs dans le même ordre.
[1, 2] === [1, 2] est faux car les littéraux créent deux tableaux distincts.
Indicateur booléen
Un indicateur booléen est une valeur booléenne qui enregistre si une condition a été remplie, par exemple si une correspondance a été trouvée ou si un échec s’est produit.
Un indicateur vérifiant que tous ont réussi commence à vrai et devient faux lorsqu’un score insuffisant apparaît.
Indice
Un indice indique une position dans un tableau ; les éléments indicés ordinaires sont comptés à partir de zéro jusqu’à une unité de moins que la longueur.
Le troisième élément se lit avec colors[2] car le comptage des indices commence à zéro, avant l’indice un.
Initialisation
L’initialisation prépare l’état de départ d’une boucle ; dans une boucle for, elle s’exécute une fois avant la première vérification de la condition.
Dans for (let i = 1; i <= 5; i++), l’initialisation crée i avec la valeur de départ 1.
Instruction break
Une instruction break quitte immédiatement la boucle qui la contient, ou une boucle désignée par une étiquette, et reprend ensuite l’exécution.
Une recherche de première correspondance utilise break pour ne pas vérifier les valeurs suivantes après avoir stocké une correspondance.
Instruction continue
Une instruction continue ignore le reste du code du corps pour l’itération en cours et poursuit l’exécution selon l’étape suivante de la boucle.
Un test de parité peut utiliser continue pour ignorer l’affichage tandis que le compteur d’une boucle for est quand même mis à jour.
Inversion de l’ordre
Une inversion de l’ordre renverse la séquence actuelle du dernier au premier élément sans comparer les valeurs pour établir un ordre numérique ou alphabétique.
Inverser [3, 1, 2] donne [2, 1, 3], qui n’est pas une séquence triée numériquement.
Itérable
Un itérable fournit une séquence de valeurs que des opérations comme for...of et la décomposition peuvent parcourir dans l’ordre.
Les tableaux et les chaînes sont itérables, mais décomposer le nombre 5 dans un tableau déclenche une TypeError.
Itération
Une itération est une exécution du corps d’une boucle, qui a lieu après une vérification réussie de la condition dans une boucle de comptage.
Afficher les nombres de 1 à 5 avec un affichage par exécution du corps demande cinq itérations.

L

Longueur d’un tableau
La longueur d’un tableau est le nombre d’emplacements indicés jusqu’à sa fin, y compris les trous entre les éléments affectés.
Une affectation à l’indice 4 dans un tableau plus court porte sa longueur à au moins cinq, même si des emplacements précédents sont vides.

M

Méthode entries
La méthode entries fournit des paires indice-valeur pour parcourir un tableau, ce qui permet de lire les deux informations ensemble.
for (const [i, name] of names.entries()) peut afficher des libellés numérotés à l’aide de i + 1.
Méthode every
La méthode every renvoie vrai lorsqu’aucun élément testé n’échoue ; elle s’arrête à un échec et renvoie vrai pour un tableau vide.
Combine un test de longueur positive avec every lorsqu’un résultat indiquant que tous ont réussi doit inclure au moins un score.
Méthode filter
La méthode filter renvoie les éléments d’origine pour lesquels le test de la fonction de rappel est évalué comme vrai, en conservant leur ordre d’origine.
Un test t => t > 20 sélectionne les mesures de températures chaudes sans les remplacer par des valeurs booléennes.
Méthode find
La méthode find renvoie le premier élément qui satisfait un test de fonction de rappel, ou undefined si aucune correspondance n’est trouvée.
Rechercher un nombre inférieur à un dans [3, 0, 5] renvoie zéro, une correspondance valide mais évaluée comme fausse.
Méthode findIndex
La méthode findIndex renvoie la première position pour laquelle le test de la fonction de rappel réussit, ou moins un si aucun élément ne le satisfait.
Une position trouvée peut servir à une suppression après vérification qu’elle n’est pas égale à -1, la valeur indiquant l’absence de correspondance.
Méthode join
La méthode join produit une chaîne en plaçant un séparateur choisi entre les formes textuelles des éléments d’un tableau.
["2026", "03", "15"].join("-") produit la chaîne de date « 2026-03-15 ».
Méthode localeCompare
La méthode localeCompare indique l’ordre relatif de chaînes selon les règles des paramètres régionaux par le signe de son résultat numérique.
Un résultat négatif de a.localeCompare(b, "en") place a avant b dans cette comparaison.
Méthode map
La méthode map stocke les résultats d’une fonction de rappel dans un nouveau tableau de même longueur que le tableau source.
Transformer des distances avec km => km * 1000 construit les mesures correspondantes en mètres.
Méthode reduce
La méthode reduce transmet un accumulateur entre les appels d’une fonction de rappel et renvoie le résultat final accumulé.
Une réduction de somme commençant à zéro ajoute chaque température et renvoie un seul total numérique.
Méthode slice
La méthode slice renvoie une copie superficielle d’une plage d’un tableau sans modifier la source, en excluant l’indice de fin.
values.slice(1, 3) copie les valeurs aux indices un et deux dans un nouveau tableau.
Méthode some
La méthode some renvoie vrai lorsqu’au moins un test de la fonction de rappel réussit et s’arrête dès qu’elle trouve ce succès.
Vérifier si au moins un score est inférieur à cinquante renvoie vrai dès le premier score insuffisant.
Méthode splice
La méthode splice supprime ou insère des éléments d’un tableau en place et renvoie un tableau des éléments supprimés.
L’appel days.splice(2, 0, "Wed") insère un jour à l’indice deux sans supprimer de jour existant.
Méthode split
La méthode split crée un tableau de morceaux de texte en découpant une chaîne à chaque occurrence d’un séparateur indiqué.
Découper "4,8,15" sur une virgule donne trois chaînes qui doivent encore être converties pour une addition numérique.
Méthodes push et pop
Les méthodes push et pop ajoutent et suppriment respectivement des éléments à la fin d’un tableau ; push renvoie la nouvelle longueur, tandis que pop renvoie l’élément supprimé.
Une liste peut recevoir un nom à la fin avec push, puis perdre ce dernier nom avec pop.
Méthodes shift et unshift
Les méthodes shift et unshift suppriment et ajoutent respectivement des éléments au début d’un tableau, en modifiant les indices des éléments qui restent.
Utiliser queue.shift() supprime le premier nom en attente et déplace le suivant à l’indice zéro.
Mise à jour
Une mise à jour modifie l’état de la boucle entre les itérations ; une boucle for effectue la mise à jour de son en-tête après son corps.
La mise à jour i += 5 donne au compteur une valeur supérieure de cinq à la précédente.
Mise en forme des listes
La mise en forme des listes transforme des éléments qui sont des chaînes en texte lisible avec des séparateurs et des mots de liaison choisis selon les paramètres régionaux du lecteur.
Intl.ListFormat peut ajouter « and » avant le dernier nom d’une liste en anglais américain.
Mise en forme des nombres
La mise en forme des nombres convertit un nombre en texte d’affichage selon des conventions comme les séparateurs décimaux et de groupement des paramètres régionaux.
Mettre 1234.5 en forme avec « de-DE » produit « 1.234,5 », une chaîne à afficher après le tri numérique.
Mutation
Une mutation modifie le contenu ou l’ordre d’un tableau existant et rend ce changement visible par toute référence à ce tableau.
L’appel scores.push(95) modifie scores par mutation même si la variable a été déclarée avec const.

O

Ordre croissant
L’ordre croissant place les valeurs de la plus petite à la plus grande selon la comparaison choisie, par exemple un comparateur numérique par soustraction.
Trier numériquement [10, 9, 1] par ordre croissant donne [1, 9, 10].

P

Paramètre
Un paramètre est une entrée nommée dans la définition d’une fonction ; sa position détermine quel argument fourni il reçoit.
Dans une fonction de rappel de map (value, i), le second paramètre reçoit l’indice de l’élément courant.
Paramètre du reste
Un paramètre du reste rassemble dans un tableau les arguments restants fournis à une fonction ; la décomposition dans un appel déploie les valeurs dans le sens inverse.
Dans function total(...nums), nums rassemble les arguments distincts dans un seul tableau.
Paramètres régionaux
Les paramètres régionaux déterminent les conventions linguistiques ou régionales utilisées pour des opérations comme la comparaison de texte et la mise en forme des nombres.
Les paramètres régionaux « sv » placent « ä » après « z », tandis que la comparaison allemande le place avant « z ».
Parcours par indices
Un parcours par indices parcourt un tableau à l’aide de positions numériques et permet de contrôler le sens, la taille du pas et l’accès aux éléments voisins.
Un parcours à rebours commence à arr.length - 1 et diminue l’indice tant qu’il est supérieur ou égal à zéro.
Prédicat
Un prédicat est une fonction utilisée comme test ; son résultat détermine si un élément satisfait une condition ou doit être conservé.
Le prédicat n => n !== null conserve les mesures valides égales à zéro tout en rejetant les mesures null.

R

Recherche d’indice
Une recherche d’indice renvoie une position correspondante ou un marqueur d’absence de correspondance ; indexOf et lastIndexOf utilisent moins un en cas d’échec.
[3, 7, 3].lastIndexOf(3) renvoie 2, qui désigne le dernier élément correspondant.
Référence
Une référence désigne un tableau partagé afin que plusieurs variables puissent accéder au même contenu sans détenir chacune une copie distincte.
Après const b = a, l’appel b.push(4) modifie aussi le tableau lu par a.

S

Syntaxe de décomposition
La syntaxe de décomposition déploie les valeurs d’un itérable dans un littéral de tableau ou comme arguments distincts dans un appel de fonction.
L’expression [...first, ...second] place les valeurs des deux tableaux dans un nouveau tableau extérieur.

T

Tableau
Un tableau est une collection ordonnée de valeurs occupant des positions indicées, stockée et accessible par une seule référence.
Le tableau [18, 21, 19, 24] contient quatre mesures quotidiennes de température sous un seul nom de variable.
Tableau de suivi d’exécution
Un tableau de suivi d’exécution enregistre les valeurs qui changent aux étapes successives de l’exécution afin de suivre et de vérifier le comportement d’une boucle.
Des colonnes pour la mesure courante et la somme cumulée montrent précisément quelle itération produit pour la première fois un total incorrect.
Tableau imbriqué
Un tableau imbriqué est un tableau stocké comme élément dans un autre tableau, ce qui permet de créer des structures comme des lignes de valeurs.
Dans grid[1][0], le premier indice sélectionne une ligne et le second sélectionne une valeur dans cette ligne.
Test d’appartenance
Un test d’appartenance vérifie si une valeur figure dans une collection et renvoie un booléen plutôt qu’une position correspondante.
drinks.includes("tea") indique si cette chaîne exacte en minuscules est présente dans le tableau.
Tri en place
Un tri en place modifie l’ordre dans le tableau existant et renvoie ce même tableau au lieu d’en créer un indépendant.
Après const ordered = scores.sort(...), ordered et scores font référence au même tableau.
Tri stable
Un tri stable préserve l’ordre relatif d’origine des éléments que la fonction de comparaison considère comme égaux.
Des mots de même longueur conservent leur ordre précédent lorsqu’ils sont triés uniquement selon leur longueur.

V

Valeur de retour
Une valeur de retour est le résultat qu’une fonction renvoie à la partie du code qui l’a appelée ; un corps de bloc sans instruction de retour donne undefined.
Une fonction de rappel de map contenant { n * 2; } calcule un produit mais ne le renvoie pas pour qu’il soit stocké.
Valeur initiale
Une valeur initiale fournit à reduce son accumulateur de départ et est renvoyée inchangée lorsque l’entrée ne contient aucun élément à traiter.
Fournir 0 permet à une réduction de somme vide de renvoyer zéro au lieu de déclencher une TypeError.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer