Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 23h51   #1
Nouveau Membre du Club
 
Homme Kevin
Webdesigner & Intégrateur web
Inscription : mai 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme Kevin
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Webdesigner & Intégrateur web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2011
Messages : 23
Points : 27
Points : 27
Par défaut Anomalie boucles for

Bonjour,

Je suis toujours en quête de vraiment optimiser mon code et en faisant des tests, je me suis rendu compte d'un truc que je ne comprend pas.

En effet, pour une boucle for générique qui peut être utilisée pour n éléments, dans le cas particuliers de 1 seul élément, selon comment elle est écrite, elle ne réagit pas pareil.

Si on stocke préalablement la taille du tableau à boucler, la boucle s'execute 2 fois au lieu d'une :

Code :
1
2
3
4
5
6
7
8
9
 
// S'execute 2 fois si 1 élément, log _i = 0 et _i = 1
var elems = $('untag');
var _len = elems.length;
for(_i = 0; _i < _len; _i++) {}
 
// Ou exactement pareil
var elems = $('untag');
for(_i = 0, _len = elems.length; _i < _len; _i++) {}
Par contre si on ne stocke pas, aucun problème dans ce cas :

Code :
1
2
3
4
 
// S'execute une seule fois si 1 élément, log _i = 0
var elems = $('untag');
for(_i = 0; _i < elems.length; _i++) {}
Ce n'est pas un problème important mais ça intrigue fortement ma curiosité quand même, je viens juste vous demander si quelqu'un aurait une explication qui m'aurait échappé.

Note: J'ai pas tester sur IE. Juste FF, Chrome et Safari.

Merci d'avance.

PS: C'est mon premier post sur Developpez, si j'en fais trop ou pas assez dites moi
w3ar3dus1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 02h31   #2
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Salut et bienvenue
Citation:
Envoyé par w3ar3dus1 Voir le message
... En effet, pour une boucle for générique qui peut être utilisée pour n éléments, dans le cas particuliers de 1 seul élément, selon comment elle est écrite, elle ne réagit pas pareil.

Si on stocke préalablement la taille du tableau à boucler, la boucle s'execute 2 fois au lieu d'une
...
Vérifie ton test il doit y avoir une erreur quelque part chez toi, le comportement de la boucle est correct dans les deux cas (avec ou sans la mise en variable de la longueur) : autant de tours dans la boucle que d'éléments (heureusement ). Dans mon cas, j'ai simulé le retour de la fonction $ par un littéral, ne connaissant pas ton contexte, mais tu es sûr de ce que peut renvoyer la fonction $ ? d'où vient-elle ? jQuery ? Prototype ? fonction maison ? autre ? A toi de nous le dire et même surtout de vérifier dans la doc. de la librairie le cas échéant. En tout cas inspecte un peu ce que tu récupères dans les deux cas ("un" ou "deux" éléments) avec Firebug et tu en auras le coeur net ^^

En outre, on pourrait faire remarquer que cette fonction n'a en réalité pas grand chose à f*** dans un test de boucle for Remplace-là par autre chose et tu verras que la boucle se comporte très bien.

Citation:
Envoyé par w3ar3dus1 Voir le message
Bonjour,

Je suis toujours en quête de vraiment optimiser mon code et en faisant des tests, je me suis rendu compte d'un truc que je ne comprend pas.

...

Ce n'est pas un problème important mais ça intrigue fortement ma curiosité quand même, je viens juste vous demander si quelqu'un aurait une explication qui m'aurait échappé.

Note: J'ai pas tester sur IE. Juste FF, Chrome et Safari.

Merci d'avance.

PS: C'est mon premier post sur Developpez, si j'en fais trop ou pas assez dites moi
T'inquiète, touche à rien, t'es très bien (écriture impec, sympa, curieux, balises code autour des extraits...... on croit rêver ^^ )
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 03h16   #3
Membre Expert
 
Avatar de Watilin
 
Homme Matilin Torre
Étudiant
Inscription : juin 2010
Messages : 679
Détails du profil
Informations personnelles :
Nom : Homme Matilin Torre
Âge : 23
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2010
Messages : 679
Points : 1 202
Points : 1 202
Bonsoir !
Ce problème m'intrigue moi aussi. Juste une remarque en passant : dans la première variante de la boucle, _len est locale (déclarée avec var), alors qu'elle est globale dans la seconde. A priori, ça ne devrait pas influer, mais comme je ne vois pas ce qu'il y a dans la boucle…

NB: Ce genre d'initialisation de boucle est correct :
Code JS :
for (var _i = 0, _len = elems.length; _i < _len; _i++)
__________________
Disposition de clavier ergonomique française : Bépo
Watilin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 23h48   #4
Nouveau Membre du Club
 
Homme Kevin
Webdesigner & Intégrateur web
Inscription : mai 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme Kevin
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Webdesigner & Intégrateur web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2011
Messages : 23
Points : 27
Points : 27
Oh la la, je suis vraiment désolé pour ce post inutile, dans mon code original j'ai mis _Len au lieu de _len dans la condition. Faut que je change mes p***** de lunettes, ça devient urgent .

@RomainVALERI: Merci beaucoup pour le compliment.

Quoi qu'il en soit, il n'y avait pas de contexte, j'avait totalement isolé le problème.

De plus, comme tu me l'as fait remarquer, j'avais pas précisé que j'utilise jQuery qui, avec $(), renvoie un tableau contenant les éléments sélectionnés. Si je boucle sur ce tableau, c'est pour une question de performance (je suis sur une app avec pas mal de JavaScript), ça m'évite tous simplement d'utiliser $.each() qui est plus gourmande.

exemple fictif :

Code :
1
2
3
4
5
6
7
8
9
10
 
// Alerte une chaine sous la forme : name0-name1-…-nameN
// avec l'attribut name de chaque HTML Element récupéré via $('input')
// à un tableau nomsTableau
var elems = $('input');
var nomsTableau = [];
for(_i = 0, _len = elems.length; _i < _len; _i++) {
  nomsTableau.push(elems[_i].name);
}
alert(nomsTableau.join('-'));
w3ar3dus1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 23h53   #5
Nouveau Membre du Club
 
Homme Kevin
Webdesigner & Intégrateur web
Inscription : mai 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme Kevin
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Webdesigner & Intégrateur web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2011
Messages : 23
Points : 27
Points : 27
Hum, je sais pas trop mais dans le cas présent, je doit mettre délestage non? Il n'y a pas d'intérêt de garder ce post je pense.
w3ar3dus1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 00h33   #6
Membre Expert
 
Avatar de Watilin
 
Homme Matilin Torre
Étudiant
Inscription : juin 2010
Messages : 679
Détails du profil
Informations personnelles :
Nom : Homme Matilin Torre
Âge : 23
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2010
Messages : 679
Points : 1 202
Points : 1 202
Si si, il nous rappelle à tous le formidable potentiel de nuisance de la faute de frappe

Sérieusement, c'est toi qui vois. Enfin je suis pas modo mais je pense pas qu'on soit à ce point après la moindre économie d'espace disque sur ce forum
__________________
Disposition de clavier ergonomique française : Bépo
Watilin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 02h00   #7
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 572
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 572
Points : 4 074
Points : 4 074
Citation:
Envoyé par w3ar3dus1 Voir le message
Oh la la, je suis vraiment désolé pour ce post inutile, dans mon code original j'ai mis _Len au lieu de _len dans la condition. ...
Je me disais bien qu'il devait y avoir quelque chose comme ça...
Citation:
Envoyé par w3ar3dus1 Voir le message
Hum, je sais pas trop mais dans le cas présent, je doit mettre délestage non? Il n'y a pas d'intérêt de garder ce post je pense.
Oh... on a vu pire
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 09h55   #8
Nouveau Membre du Club
 
Homme Kevin
Webdesigner & Intégrateur web
Inscription : mai 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme Kevin
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Webdesigner & Intégrateur web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2011
Messages : 23
Points : 27
Points : 27
Ok, je met résolu alors, comme ça, ça éviteras au contributeurs de passer par là, mais ça rappelleras quand même aux autres que de toute façon, ils ne sont pas à l'abris de cette nuisance particulièrement énervante je trouve. Même avec de l'expérience, ça peut toujours arriver.

@RomainVALERI : Merci tu panse la plait de mon ego .
w3ar3dus1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h46.


 
 
 
 
Partenaires

Hébergement Web