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 :

Boucle for assez bizarre


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Boucle for assez bizarre
    Bonjour à tous,
    Lors de l'analyse d'un script trouvé sur le web, je suis tombé sur une boucle for vraiment bizarre et j'aimerais avoir votre avis la-dessus.
    Je l'ai reproduite exprès pour vous faire un exemple :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <span class="a">Span 1</span>
    <span class="b">Span 2</span>
    <span class="a">Span 3</span>
     
    <script>
    function maFonction(obj){
       obj.innerHTML = 'Remplacé';
    }
     
    for(
       var obj, i=0, spans = Array.prototype.slice.call(document.getElementsByTagName('span'), 0); 
       i<spans.length; 
       obj = spans[i++], obj.className !== 'b' || maFonction(obj)
    );
    </script>

    Je ne sais pas si c'est moi mais je trouve cela vraiment crade et très difficile à comprendre. Ce qui me perturbe c'est que le script entier est très bien écrit et je tombe sur cet immondice Qui me rend perplexe.
    Qu'en pensez-vous ?

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Le point virgule a la fin sert a rien

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2015
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    En fait, je voulais savoir ce que vous pensiez de cette boucle, je ne cherche pas une alternative, je sais très bien ce qu'elle fait et comment la simplifier

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Pour moi c'est une complication inutile qui fait mal son travail !

    En partant de ceci :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <div>
        <span class="c a b">hello</span> mais
        <span class="b">bonjour</span> mais
        <span class="d">Bonsoir</span> mais
        <span class="b a">adieu</span>
    </div>

    Le code JS :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const elemsSpan = document.querySelectorAll('span');
     
    for (const elemSpan of elemsSpan){
        if (elemSpan.classList.contains('b')) {
            elemSpan.textContent = 'Remplacé';
        }
    }

    Le code Js doit agir sur tous les cas où la classe b est présente, et on doit obtenir :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <div>
        <span class="c a b">Remplacé</span> mais
        <span class="b">Remplacé</span> mais
        <span class="d">Bonsoir</span> mais
        <span class="b a">Remplacé</span>
    </div>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Bonjour,
    ce qui me pique les yeux c'est cette pseudo optimisation pour faire quoi ... !?! ... c.ier le développeur qui devra reprendre éventuellement le code.

    • La boucle for est défini, plus ou moins, comme étant de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Initialisation; Condition; Expression) {
        Instruction
    }
    même si elle est conforme tout mettre dans l'expression final m'apparaît comme étant contre productif, lisibilité, maintenance.

    • Concernant l'utilisation de Array.prototype.slice.call( elle ne sert à rien, car on peut tout à fait boucle sur une « HTMLCollection ».

    • Pourquoi créer une fonction, il aurait du aller au bout de la « logique » en écrivant quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(
       var obj, i=0, spans = Array.prototype.slice.call(document.getElementsByTagName('span'), 0); 
       i<spans.length; 
    //   obj = spans[i++], obj.className !== 'b' || maFonction(obj)
       obj = spans[i++], obj.className !== 'b' || (obj.innerHTML = 'Remplacé')
    );
    • Même si l'on peut comprendre la non utilisation d'une boucle for .. of, comme indiqué par daniehagnoul, peut être que le script date un peu, je me demande pourquoi ne pas avoir utilisé en lieu et place de getElementsByTagName plutôt un querySelectorAll, disponible depuis quand même pas mal de temps et qui permet de passer un sélecteur CSS qui pourrait même déjà filtrer tes éléments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const oElems = document.querySelectorAll("span.b");
    for (const elem of oElems) {
      elem.textContent = "Remplacé";
    }
    En gros ce n'est pas ce que je montrerais dans les écoles de développement


    EDIT : j'ai oublié de signaler
    Citation Envoyé par bonjourajax
    Le point virgule a la fin sert a rien
    Dans cette construction il est indispensable.

Discussions similaires

  1. [Batch] Bizarre "goto" dans boucle "for" impossible
    Par hermes6236 dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 06/11/2013, 22h06
  2. Une boucle for assez spéciale
    Par mulfycrowh dans le forum Visual C++
    Réponses: 2
    Dernier message: 14/10/2013, 18h06
  3. [Débutant] boucle FOR bizarre
    Par kanwulf62 dans le forum MATLAB
    Réponses: 4
    Dernier message: 31/05/2013, 10h36
  4. comportement boucle for bizarre
    Par maccormick dans le forum Général Java
    Réponses: 9
    Dernier message: 22/09/2010, 14h07
  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