IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Anomalie boucles for


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner & Intégrateur web
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 29
    Points
    29
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    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

    __________________

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    for (var _i = 0, _len = elems.length; _i < _len; _i++)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner & Intégrateur web
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 29
    Points
    29
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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('-'));

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner & Intégrateur web
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 29
    Points
    29
    Par défaut
    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.

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    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
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    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

    __________________

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Webdesigner & Intégrateur web
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 29
    Points
    29
    Par défaut
    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 .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo