La différence la plus importante entre la for
boucle et la forEach
méthode est que, avec la première, vous pouvez break
sortir de la boucle. Vous pouvez simuler continue
en retournant simplement de la fonction passée à forEach
, mais il n'y a aucun moyen d'arrêter complètement la boucle.
En dehors de cela, les deux accomplissent effectivement la même fonctionnalité. Une autre différence mineure concerne la portée de l'index (et toutes les variables contenant) dans la boucle for, en raison du levage des variables.
// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }
// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });
Cependant, je trouve que forEach
c'est beaucoup plus expressif - cela représente votre intention de parcourir chaque élément d'un tableau, et cela vous fournit une référence à l'élément, pas seulement à l'index. Dans l'ensemble, cela dépend principalement de vos goûts personnels, mais si vous pouvez l'utiliser forEach
, je vous recommanderais de l'utiliser.
Il existe quelques différences plus substantielles entre les deux versions, notamment en ce qui concerne les performances. En fait, la boucle for simple fonctionne considérablement mieux que la forEach
méthode, comme le démontre ce test jsperf .
C'est à vous de décider si une telle performance est nécessaire ou non, et dans la plupart des cas, je préférerais l'expressivité à la vitesse. Cette différence de vitesse est probablement due aux différences sémantiques mineures entre la boucle de base et la méthode lors du fonctionnement sur des tableaux clairsemés, comme indiqué dans cette réponse .
Si vous n'avez pas besoin du comportement de forEach
et / ou que vous avez besoin de sortir de la boucle tôt, vous pouvez utiliser Lo-Dash _.each
comme alternative, qui fonctionnera également avec plusieurs navigateurs. Si vous utilisez jQuery, il fournit également un similaire $.each
, notez simplement les différences dans les arguments passés à la fonction de rappel dans chaque variante.
(Quant au forEach
polyfill, il devrait fonctionner sans problème dans les anciens navigateurs, si vous choisissez d'emprunter cette voie.)
break
sortirforEach
. Mais un gros avantage est de créer une nouvelle portée avec la fonction. Avec le polyfill, vous ne devriez pas avoir de problèmes (du moins je n'en ai rencontré aucun).