Quelle est la norme actuelle en 2017 en Javascript avec des boucles for () vs un .forEach.
Je travaille actuellement mon chemin à travers Colt Steeles « Web Dev Bootcamp » sur Udemy et il privilégie forEach
plus for
dans ses enseignements. J'ai cependant recherché diverses choses pendant les exercices dans le cadre du travail de cours et je trouve de plus en plus de recommandations pour utiliser un for
-loop plutôt que forEach
. La plupart des gens semblent dire que la boucle for est plus efficace.
Est-ce quelque chose qui a changé depuis la rédaction du cours (vers 2015) ou sont-ils vraiment leurs avantages et inconvénients pour chacun, que l'on apprendra avec plus d'expérience.
Tout avis serait grandement apprécié.
javascript
loops
for-loop
foreach
tonyrobbins
la source
la source
for
est difficile à battre pour la vitesse pure.forEach()
invoque un rappel pour chaque itération; donc, cela entraîne évidemment des frais généraux.map
uniquement pour l'itération et rejettent le nouveau tableau qu'il génère. Je ne sais pas combien de personnes j'ai dû corriger sur ce choix de fonction particulier sur ce site uniquement.Réponses:
pour
for
les boucles sont beaucoup plus efficaces. Il s'agit d'une construction en boucle spécialement conçue pour itérer alors qu'une condition est vraie , tout en offrant un mécanisme de progression (généralement pour augmenter l'itérateur). Exemple:Cela ne veut pas dire que for -loops sera toujours plus efficace, mais simplement que les moteurs et navigateurs JS les ont optimisés pour l'être. Au fil des ans, il y a eu des compromis sur la construction de boucle la plus efficace (pour, pendant, réduire, inverser, etc.) - différents navigateurs et moteurs JS ont leurs propres implémentations qui offrent différentes méthodologies pour produire les mêmes résultats. À mesure que les navigateurs s'optimisent davantage pour répondre aux exigences de performances, ils
[].forEach
pourraient théoriquement être implémentés de manière à être plus rapide ou comparable à un fichierfor
.Avantages:
break
etcontinue
)i<n
peut être n'importe quoi et non lié à la taille d'un tableau)var i
laissei
disponible après la fin de la boucle)pour chaque
.forEach
sont des méthodes qui itèrent principalement sur des tableaux (également sur d'autres énumérables, tels que des objetsMap
etSet
). Ils sont plus récents et fournissent un code subjectivement plus facile à lire. Exemple:Avantages:
Dans l'exemple ci-dessus,
val
serait un paramètre de la fonction nouvellement créée. Ainsi, toutes les variables appeléesval
avant la boucle conserveraient leurs valeurs après sa fin.Performance
La performance est un sujet délicat, qui nécessite généralement une certaine expérience en matière de prévoyance ou d'approche. Afin de déterminer à l'avance (pendant le développement) le niveau d'optimisation requis, un programmeur doit avoir une bonne idée de l'expérience passée avec le cas problématique, ainsi qu'une bonne compréhension des solutions potentielles.
L'utilisation de jQuery dans certains cas peut parfois être trop lente (un développeur expérimenté peut le savoir), alors que d'autres fois peuvent être un non-problème, auquel cas la conformité entre les navigateurs de la bibliothèque et la facilité d'exécution d'autres fonctions (par exemple, AJAX, gestion des événements) vaudrait le temps de développement (et de maintenance) économisé.
Un autre exemple est que si les performances et l'optimisation étaient tout, il n'y aurait pas d'autre code que la machine ou l'assemblage. De toute évidence, ce n'est pas le cas car il existe de nombreux langages de haut niveau et de bas niveau, chacun avec ses propres compromis. Ces compromis incluent, mais ne sont pas limités à la spécialisation, la facilité et la vitesse de développement, la facilité et la vitesse de maintenance, le code optimisé, le code sans erreur, etc.
Approche
Si vous ne savez pas si quelque chose nécessitera un code optimisé, il est généralement préférable d'écrire d'abord du code maintenable. À partir de là, vous pouvez tester et identifier ce qui nécessite plus d'attention lorsque cela est nécessaire.
Cela dit, certaines optimisations évidentes devraient faire partie de la pratique générale et ne nécessiter aucune réflexion. Par exemple, considérez la boucle suivante:
Pour chaque itération de la boucle, JavaScript récupère les
arr.length
opérations de coût de recherche de clé à chaque cycle. Il n'y a aucune raison pour que cela ne soit pas:Cela fait la même chose, mais ne récupère
arr.length
qu'une seule fois, en mettant la variable en cache et en optimisant votre code.la source
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Je crois qu'avec lalet
déclaration de déclaration d'une variable locale de portée de bloc, le deuxième avantage deforEach
n'est plus un avantage sur lafor
boucle, sauf dans un environnement sans prise en charge delet
.