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.
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.
19 votes
@A.T. tant que vous n'êtes pas un de ces gars qui utilisent
map
purement pour l'itération et jette le nouveau tableau qu'il génère. Je ne sais pas combien de personnes j'ai dû corriger ce choix de fonction particulier sur ce seul site.1 votes
@canon est d'accord, la sélection des boucles est importante et il faut garder à l'esprit les résultats et les résidus de ces méthodes lors du choix. Je pense que pour des raisons de lisibilité, il faut éviter les "boucles for".
0 votes
Le lien @Bergi est en panne - pouvez-vous expliquer brièvement ce qui se passe ici ?
1 votes
@choz nouveau lien à la même discussion