J'ai vu beaucoup de questions suggérant d'utiliser:
for (var i = 0; i < myArray.length; i++){ /* ... */ }
au lieu de:
for (var i in myArray){ /* ... */ }
pour les tableaux, en raison d'une itération incohérente ( voir ici ).
Cependant, je n'arrive pas à trouver quoi que ce soit qui semble préférer la boucle orientée objet:
myArray.forEach(function(item, index){ /* ... */ });
Ce qui me semble beaucoup plus intuitif.
Pour mon projet actuel, la compatibilité IE8 est importante, et j'envisage d'utiliser le polyfill de Mozilla , mais je ne suis pas sûr à 100% de la manière dont cela fonctionnera.
- Existe-t-il des différences entre la boucle for standard (le premier exemple ci-dessus) et l'implémentation Array.prototype.forEach par les navigateurs modernes?
- Y a-t-il une différence entre les implémentations de navigateur modernes et l'implémentation de Mozilla liée à ci-dessus (avec une attention particulière à IE8)?
- Les performances ne sont pas autant un problème, mais simplement la cohérence avec laquelle les propriétés sont itérées.
javascript
arrays
for-loop
internet-explorer-8
iterator
Michael Lewis
la source
la source
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).holes
oùundefined
devrait être et d'autres méthodes cassées, commeslice
ethasOwnProperty
écrites à des objets DOM de type arraylike. Mes tests etes5 shim
ont montré de telles méthodes calées conformes à la spécification (non testé la cale de MDN).for
boucle, c'est à ça que ça sertsome
.Array.find()
pour sortir de la boucle après avoir trouvé une première correspondance.Réponses:
La différence la plus importante entre la
for
boucle et laforEach
méthode est que, avec la première, vous pouvezbreak
sortir de la boucle. Vous pouvez simulercontinue
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.
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'utiliserforEach
, 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.)la source
each
ne se comportent pas de la même manière que la spécification ECMA5 deforEach
, elles ont tendance à traiter tous les tableaux comme denses (pour éviter les bogues IE, à condition que vous en soyez conscient). Peut être un "gotcha" autrement. En référence github.com/es-shims/es5-shim/issues/190Array.prototype.some
qui bouclera jusqu'à ce que vous retourniez une valeur de vérité ou jusqu'à ce qu'elle ait complètement bouclé à travers le tableau.Array.prototype.every
est similaire àArray.prototype.some
mais s'arrête si vous renvoyez une valeur erronée.Array.prototype.forEach
avec une version non compatible aurait le potentiel de briser tellement de bibliothèques que l'éviter pour cette raison ne serait d'aucune façon utile.Vous pouvez utiliser votre fonction foreach personnalisée qui fonctionnera beaucoup mieux que Array.
Vous devez l'ajouter une fois à votre code. Cela ajoutera une nouvelle fonction au tableau.
Ensuite, vous pouvez l'utiliser n'importe où, comme le tableau.
La seule différence c'est 3 fois plus rapide. https://jsperf.com/native-arr-foreach-vs-custom-foreach
MISE À JOUR: Dans la nouvelle version de Chrome, les performances de .forEach () ont été améliorées. Cependant, la solution peut offrir des performances supplémentaires dans d'autres navigateurs.
la source
Il est suggéré par de nombreux développeurs (par exemple Kyle Simpson) de l'utiliser
.forEach
pour indiquer que le tableau aura un effet secondaire et.map
pour des fonctions pures.for
les boucles conviennent bien comme une solution à usage général pour un nombre connu de boucles ou tout autre cas qui ne convient pas car il est plus facile de communiquer en raison de son large support dans la majorité des langages de programmation.par exemple
En ce qui concerne la convention, cela semble le meilleur, mais la communauté n'a pas vraiment décidé d'une convention sur les nouvelles
for in
boucles de protocole d'itération . En général, je pense que c'est une bonne idée de suivre les concepts FP que la communauté JS semble être ouverte à adopter.la source