Quid des performances entre un for et un foreach ? ;-)
Version imprimable
Quid des performances entre un for et un foreach ? ;-)
Tu es pass� sur la page de MDC pour voir la doc de la m�thode ?
https://developer.mozilla.org/En/Cor.../Array/ForEach
je pense que �a va r�pondre � ta question� ils disent que �a fait pas parti d'un standard ecmascript puisque celui sur lequel la m�thode figure est encore un draft.
Merci le_chomeur, je vois bien ce que tu veux dire. Une petite remarque concernant
ton exemple:
Tu appelle la fonction associ�e � action avec la notation (i) apr�s l'accolade fermante
mais tu ne d�clare pas de param�tre dans ta fonction. Si bien que la variable i utilis�e
n'est pas le param�tre mais la variable i de la boucle.
Ton code fonctionne tr�s bien aussi ainsi:
Moi je pr�f�re passer explicitement un param�tre ce qui �vite la variableCode:
1
2
3
4
5
6
7 var action = function(){ var t = i ; return function(){ alert(t) }; }(); // sans rien passer
Ainsi i passe dans t et c'est t qui est "closur�", marche aussi avec t nomm� iCode:
1
2
3
4
5
6 var action = function(t){ return function(){ alert(t) }; }(i);
car il s'agirait d'une variable locale qui a priorit� sur le i exterieur.
@DoubleU en effet, la fonction bind pr�sent�e dans mon exemple est issue de prototype elle est d'ailleur utilisable dans le cas de l'exemple de funewik.
bindAsEventListener est similaire mais passe le param�tre 'event' avant les arguments
(si mes souvenir de prototype sont bons :-) et je pense que si on l'utilise dans ce cas
alors 'xhr' vaudrait 'undefined' � v�rifier.
effectivement marcha :D
juste a faire TRES attention de ne pas passer :
qui sera l'�v�nement sinon :) ( juste une pr�cision pour les autres ^^ )Code:
1
2
3
4
5 var action = function(){ return function(t){ alert(t) }; }(i);
"Array.forEach" (qui est le m�me que Array.prototype.forEach) est fait pour manipuler tout ce qui "ressemble" � un array. C'est a dire des index num�rique et un "length". Pas besoin de les convertir. Voir l'exemple que le_chomeur m'a demand�.
Tous les truc du DOM qui ont un ".length" sont ennum�rables avec �a, magie.
https://developer.mozilla.org/en/Cor...y-like_objects
Nous sommes tout a fait d'accord sur le fait que cela fonctionne.
Mais je suis pas d'accord que tu as qualifie de "Bricolage" la technique
qui consiste � it�rer un ArrayLike avec une boucle for par rapport
� l'utilisation de Array.forEach
Moi je pense que c'est plut�t une mauvaise habitude, un exemple:
Six mois plus tard, quelqu'un d'autre relis ce code et doit impl�menter un affichageCode:
1
2
3 function show(toto) { Array.forEach(toto, function(e) { alert(e); }); }
invers�, il serait tent� de modifier la fonction ainsi:
si forEach fonctionne pour les ArrayLike ce n'est pas le cas de Array.reverseCode:
1
2
3
4
5 function show(toto, reverse) { if(reverse) Array.reverse(toto); Array.forEach(toto, function(e) { alert(e); }); }
c'est pourquoi je pense que c'est une mauvaise pratique que de m�langer ces
deux types.
C'est pour faire face � ce genre de risque que je parlais de convertir des
ArrayLike en vrai Array avant d'utilser des m�thodes de Array dessus.
ok, vu comme �a.
Perso je n'ecris presque plus de boucle for. Je suis d'accord avec ta signature :p
+1 marcha ,
de plus j'ajouterais qu'a l'heure actuelle il vaut mieux se baser sur des r�f�rences CROSSBROWSER :ccool:
Array.prototype.forEach :
Opera, WebKit, FF.
Array.forEach :
FF.
en rajoutant ces 5 mis�rables lignes :
Opera, WebKit.Code:
1
2
3
4
5 if (!Array.forEach) { Array.forEach = function (array, callback, context) { Array.prototype.forEach.call(array, callback, context); } }
Pour que IE le supporte c'est grand max 10 lignes. C'est encore plus crossbrowser que les getter / setter pour les objets perso, on a vu pire.
Pour des trucs fun sur les �numm�rations :
http://dean.edwards.name/weblog/2006/07/enum/
( edit ) J'insiste parce que �a me rend fou cet immobilisme. On peut faire �norm�ment de choses du m�me genre que ce que jQuery propose en natif. Il suffit de le savoir, et c'est pas en restant sur une boucle for que on va faire bouger les choses. Si assez de monde l'utilise, IE l'impl�mentera. C'est aussi simple que �a.
En m�me temps, c'est pas le sujet du topic...
Et ca reste du sucre syntaxique, donc bon, c'est ptete pas la peine d'�piloguer pendant 20 posts...
A ce propos , il existe un article tr�s int�ressant qui en gros dit que bindasEventlistener ne sert quasi jamais et qu'il faut lui pr�f�rer bind()
http://proto-scripty.wikidot.com/pro...seventlistener