cela revient effectivement en partie à cela!
Version imprimable
cela revient effectivement en partie à cela!
ou est le souci ?
Code:
1
2
3
4 items= [1,2,3,4,5] for (elt in items){ alert(items[elt]); }
:PCode:
1
2
3
4
5
6 Array.prototype.youpi = function(){ alert("youpi j'ai une lib qui m'ajoute des trucs dans le prototype d'Array"); }; var a =[1,2,3]; var b=[]; for(var prop in a){ b.push(prop); } return b.join(", "); //["0", "1", "2", "youpi"]
Réflexe: ne jamais utiliser for..in sur les Array
hasOwnProperty ...
forEach() ;)
ouLes vielles recettes font aussi des bons platsCode:for(var i=0; i<arr.length; i++){ }
est plus rapide ...Code:
1
2
3
4 i=-1 while( arr[++i]){ }
Dans ce cas, autant le faire de façon optimisée :
:mrgreen:Code:for(var i=0, l=arr.length; i<l; i++){ }
J'utilise la même forme que Bovino. Mais les perfs sont quasi identiques
Par curiosité j'ai testé une ou deux formes récursives pour ces boucles sur l'outil jsperf : 50% plus lente
Par contre, j'ai quand même un doute, le test se contente de faire une boucle de 1 à 1000 sans utiliser à proprement parler le tableau, juste en utilisant la valeur de la boucle.
Bref je sais pas si ça montre grand chose....?
pour info, j'ai testé en ajoutant une simple opération de concaténation sur le contenu du tableau:
http://jsperf.com/fastest-array-loops-in-javascript/90
avec chromium (linux) la récursivité serait plus rapide que toutes les autres formes de boucles.
Je présume que chromium utilise V8
Sauf qu'il peut arriver que tu te retrouves avec une erreur du genre "Max Stack Exceed",
La pile de fonctions n'est pas infinie dans certains browsers
oui bien sur
elle n'est jamais infinie à ma connaissance, mais j'ai cru comprendre en écoutant Douglas Crockford que lui au moins milite pour résoudre cette barrière dans le futur. Je suis très au fait de cette limitation car vraisemblablement on pourrait quasi "tout" faire en récursif sans cette limitation.
C'est juste une autre forme de syntaxe qui permet d'exécuter des boucles comme le ferait les syntaxes présentes sur la page
C'est surtout que je n'ai pas bien compris l'intérêt de cette page de benchmarks, où l'on instancie un tableau de 1000 lignes dont le seul et unique usage consiste à récupérer sa longueur pour déterminer le nombre d'itérations.
le tableau en lui-même n'est pas utilisé dans la boucle. On aurait pu faire un var j= 1000; pour avoir le même résultat
Si le tableau existe et est rempli, autant l'utiliser dans la boucle, ça se rapproche un peu plus de la réalité.
Et il se trouve que javascript excelle à la récursivité en principe. Donc j'ai voulu voir comment se comparait la récursivité comparée aux autres syntaxes, tout en mettant en jeu le contenu du tableau.
Et étonnamment sous Chrome, les performances se comparent voir sont supérieures.
Sous Firefox, il y a un truc avec les boucles, certaines ont des performances 400 fois supérieures aux autres, ce qui n'est pas le cas des autres navigateurs que j'ai testé
Bon on a dévié du sujet initial je pense :D
Enfin bref, toujours est-il que parcourir un Array avec un for...in n'a aucun sens. Un array est un tableau pas un objet qui sert de "map".
Sauf si tu veux parcourrir les propriétés de l'array ;)Citation:
toujours est-il que parcourir un Array avec un for...in n'a aucun sens.