152 votes

Efficacité du Javascript : "for" ou "forEach" ?

Quelle est la norme actuelle en 2017 en Javascript avec les boucles for() par rapport à un .forEach.

Je suis actuellement en train de travailler sur le "Web Dev Bootcamp" de Colt Steeles sur Udemy et il favorise forEach en for dans ses enseignements. J'ai cependant cherché diverses choses lors des exercices dans le cadre du cours et je trouve de plus en plus de recommandations d'utiliser un for -plutôt que forEach . La plupart des gens semblent affirmer que la boucle for est plus efficace.

Est-ce quelque chose qui a changé depuis que le cours a été écrit (vers 2015) ou y a-t-il vraiment des avantages et des inconvénients pour chacun, que l'on apprendra avec plus d'expérience.

Tout conseil serait grandement apprécié.

19 votes

Pourquoi se lier à l'idée subjective de quelqu'un d'une norme de 2017 ? Adoptez une norme intemporelle, comme l'écriture d'un code propre et maintenable, en sachant que les ingénieurs travaillent dur pour rendre les constructions les plus couramment utilisées très efficaces, puis en optimisant les performances lorsque vous avez un problème de performance spécifique.

4 votes

Un natif for est difficile à battre en termes de vitesse pure. forEach() invoque un callback pour chaque itération, ce qui entraîne évidemment une certaine surcharge.

1 votes

En tant que développeur, j'utilise rarement for ou foreach, la plupart du travail est effectué par les méthodes map, filter ou reduce.

304voto

vol7ron Points 11270

Pour

for Les boucles sont beaucoup plus efficaces. Il s'agit d'une construction de boucle spécifiquement conçue pour itérer pendant qu'une condition est vrai tout en offrant un mécanisme de pas (généralement pour augmenter l'itérateur). Exemple :

for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}

Cela ne veut pas dire que pour -Les boucles seront toujours plus efficaces, mais les moteurs JS et les navigateurs les ont optimisées pour qu'elles le soient. Au fil des ans, il y a eu des compromis quant à la construction de boucle la plus efficace (for, while, reduce, reverse-while, 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. Au fur et à mesure que les navigateurs s'optimisent pour répondre aux exigences de performance, théoriquement [].forEach pourrait être mis en œuvre de telle sorte qu'il soit plus rapide ou comparable à une for .

Avantages :

  • efficace
  • fin anticipée de la boucle (honneurs break y continue )
  • contrôle de la condition ( i<n peut être n'importe quoi et n'est pas lié à la taille d'un tableau)
  • la portée de la variable ( var i feuilles i disponible après la fin de la boucle)

forEach

.forEach sont des méthodes qui itèrent principalement sur des tableaux (également sur d'autres énumérables, tels que Map y Set objets). Ils sont plus récent et fournir un code qui est subjectivement plus facile à lire. Exemple :

[].forEach((val, index)=>{
   ...
});

Avantages :

  • n'implique pas de configuration de variable (itère sur chaque élément du tableau)
  • les fonctions/fonctions fléchées étendent la variable au bloc
    Dans l'exemple ci-dessus, val serait un paramètre de la fonction nouvellement créée. Ainsi, toute variable appelée val avant la boucle, conserveraient leurs valeurs après la fin de celle-ci.
  • subjectivement plus facile à maintenir car il peut être plus facile d'identifier ce que fait le code - il itère sur un énumérable ; alors qu'une boucle for peut être utilisée pour un grand nombre de schémas de bouclage.

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 degré d'optimisation nécessaire, 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 s'avérer trop lente (un développeur expérimenté peut le savoir), alors que dans d'autres cas, ce n'est pas un problème, auquel cas la conformité de la bibliothèque avec les navigateurs et la facilité d'exécution d'autres fonctions (par exemple, AJAX, gestion des événements) vaudraient le temps de développement (et de maintenance) gagné.

Un autre exemple est que si les performances et l'optimisation étaient tout, il n'y aurait pas d'autre code que le code machine ou le code assembleur. Ce n'est évidemment pas le cas, car il existe de nombreux langages de haut niveau et de bas niveau différents, chacun ayant ses propres compromis. Ces compromis comprennent, sans s'y limiter, la spécialisation, la facilité et la rapidité de développement, la facilité et la rapidité de maintenance, le code optimisé, le code sans erreur, etc.

Approche

Si vous n'avez pas une bonne idée de ce qui nécessitera un code optimisé, il est généralement recommandé d'écrire d'abord un code facile à maintenir. À partir de là, vous pouvez tester et identifier ce qui nécessite plus d'attention quand c'est nécessaire.

Cela dit, certaines optimisations évidentes devraient faire partie de la pratique générale et ne nécessitent aucune réflexion. Par exemple, considérez la boucle suivante :

for (var i=0; i < arr.length; ++i ){}

Pour chaque itération de la boucle, JavaScript récupère l'adresse de l'utilisateur. arr.length une clé de lecture permettant de calculer le coût des opérations sur chaque cycle. Il n'y a aucune raison pour que ce ne soit pas le cas :

for (var i=0, n=arr.length; i < n; ++i){}

Cela fait la même chose, mais récupère seulement arr.length une fois, mettant ainsi la variable en cache et optimisant votre code.

51 votes

Réponse excellente, complète, non présomptueuse, non liée à un seul moment, une seule mise en œuvre ou un seul test de micro-benchmark.

1 votes

Parfait, c'est exactement ce que je cherchais et cela donne beaucoup plus de profondeur que la vidéo ne pouvait le faire. J'apprécie vraiment cela, étant nouveau, il y a tellement de choses à apprendre et ce sont les choses qu'il est facile de sauter en favorisant l'un plutôt que l'autre sans raison, ce qui pourrait vous gêner à l'avenir. Merci beaucoup !

4 votes

Les boucles for présentent souvent un avantage en termes de débogage : il est facile d'y pénétrer, de les interrompre et de les inspecter. Avec forEach(), le niveau supplémentaire de callback peut compliquer un peu les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X