La différence la plus importante entre la forboucle et la forEachméthode est que, avec la première, vous pouvez breaksortir de la boucle. Vous pouvez simuler continueen 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 forEachc'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 forEachmé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 _.eachcomme 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 forEachpolyfill, il devrait fonctionner sans problème dans les anciens navigateurs, si vous choisissez d'emprunter cette voie.)
breaksortirforEach. 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).