Promenade dans la forêt des boucles en JavaScript : For…of, For…in, ForEach et .map

Promenade dans la forêt des boucles en JavaScript : For…of, For…in, ForEach et .map

Salut, ami codeur ! Aujourd'hui, on va se balader dans la forêt des boucles en JavaScript, un endroit où même les plus chevronnés des développeurs peuvent parfois perdre leur chemin. Pas de panique ! Je suis là pour te guider à travers les sentiers tortueux de for…of, for…in, forEach() et .map(). Prêt pour l'aventure ? C'est parti !

Le chemin traditionnel :for…in

Imagine que tu as devant toi un vieux coffre rempli de souvenirs divers (ton objet en JavaScript). Tu veux voir chaque objet un par un, sans te soucier de l'ordre. Le for…in est parfait pour ça. Mais attention ! Ce sentier n'est pas le plus rapide et il pourrait te faire tomber sur des héritages inattendus (les propriétés héritées dans l'objet prototype), donc on l'utilise quand on veut explorer des propriétés d'objets, et pas trop pour les tableaux.

for (let clef in souvenirs) {
  console.log(`Voici un souvenir : ${souvenirs[clef]}`);
}

Mais attention aux scénarios d'erreur courants ! Utiliser for…in pour itérer sur les tableaux peut conduire à des résultats inattendus, comme l'itération sur des méthodes et des propriétés non désirées. Ce sentier réserve parfois des surprises avec les objets, alors vérifie bien ton équipement (hasOwnProperty est ton ami) avant de partir à l'aventure !

Le sentier des valeurs :for…of

Ensuite, on a le for…of, le petit chemin pittoresque qui te fait passer directement par les valeurs de ton tableau. C'est comme ramasser des champignons dans une forêt : tu vas directement à l'essentiel, sans te soucier de savoir à quel arbre ils appartiennent. Parfait pour les tableaux ou les chaînes de caractères quand l'ordre et la valeur sont importants.

for (let valeur of monTableau) {
  console.log(`J'ai ramassé : ${valeur}`);
}

Pour ce qui est de la performance et efficacité, for…of est optimisé pour itérer sur des structures de données qui sont itérables par nature. Cela signifie qu'il est souvent plus rapide que for…in et un bon choix pour de grands ensembles de données.

La danse collective :forEach()

Imagine maintenant que tu es en cercle avec tes amis, et chacun partage son meilleur tour de magie (fonction de rappel). C'est ça le forEach(). Il est social et amical avec les tableaux, mais il ne sait pas s'arrêter avant la fin de la danse, et il n'aime pas qu'on lui dise de sauter quelqu'un (pas de break ou continue ici).

mesAmis.forEach(ami => {
  console.log(`${ami} fait un tour de magie !`);
});

En termes de compatibilité navigateur, forEach() est bien supporté dans toutes les balades modernes, mais si tu rencontres de vieux chemins (IE6-8), tu devras emmener des polyfills pour assurer un passage sans accroc.

L'artiste du tableau :.map()

Finalement, le .map() est l'artiste qui prend un tableau brut et le transforme en une œuvre d'art (nouveau tableau). Chaque élément passe par son pinceau et ressort transformé. Utilise-le quand tu veux modifier chaque élément d'un tableau et garder un souvenir de chaque transformation.

let oeuvres = tableauxBruts.map(tableau => tableau + ' transformé');
console.log(oeuvres);

N'oublie pas, map() travaille avec des tableaux, mais si tu as besoin d'une plus grande gamme d'outils, les méthodes .filter()et.reduce() sont là pour compléter ta trousse de transformation de données. Elles te permettent de filtrer et de combiner les données en plus de les transformer.

Attention aux chemins asynchrones !

Lorsque tu souhaites faire une promenade asynchrone dans ta forêt de données, tu te rendras compte que forEach() n'attendra pas patiemment que tes promesses soient tenues. Pour ces situations, un for…of accompagné de l'attente async/await est l'équipement idéal pour des itérations asynchrones ordonnées.

async function processArray(array) {
  for (const item of array) {
    await doSomethingAsync(item);
  }
  console.log('Done!');
}

async function doSomethingAsync(item) {
  // Opération asynchrone, comme une requête réseau
}

Mais prends garde, cette approche n'est pas adaptée pour des opérations simultanées, car elle traitera chaque promesse séquentiellement.

Le tableau de comparaison : lequel choisir ?

Voici un tableau rapide pour t'aider à choisir entre nos boucles selon la situation :

MéthodeUsage pour les tableauxUsage pour les objetsPermet l'asynchroneSupport IE8
for...in⚠️ (peut-être imprévisible)
for...of❌ (pas directement)✅ (avec async/await)
forEach()⚠️ (besoin de polyfill)
.map()⚠️ (besoin de polyfill)

Et si tu rencontres des objets itérables autres que les tableaux, comme des NodeList ou des objets créés par des générateurs, alors for…of est ton choix polyvalent pour itérer avec aisance.

Dans le cas où tu dois prendre des chemins anciens et moins battus, pense aux polyfills ou à la transcompilation avec Babel pour assurer que ton code fonctionne partout.

Voilà, ami codeur ! On est revenu à notre point de départ. J'espère que cette balade t'a éclairé sur le moment idéal pour utiliser chaque méthode. N'oublie pas que chaque sentier a son charme, mais choisis bien ton chemin en fonction de ce que tu cherches à explorer ou construire !

Did you find this article valuable?

Support Sofiane BOUMEDINE by becoming a sponsor. Any amount is appreciated!