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 :

variable et .indexOf


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut variable et .indexOf
    Bonjour à tous,

    Je débute..

    J’aimerai développer ce code de façon à pouvoir inspecter différentes chaines de caractères (que je nomme i0=[..,..,..], i1, i2.. pour localiser un mot entré par l'utilisateur. (récupéré par la variable a)

    Pourquoi si var b=i1; b.indexOf(a) ne fonctionne t il pas alors que i1.indexOf(a) va bien!!? Je n'arrive pas à trouver la réponse..

    Merci pour votre aide ..

  2. #2
    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 : 74
    Localisation : Belgique

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

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


    Exemple :

    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    window.addEventListener('load', ev => {
        // le DOM est construit et la page web est visible
     
        // début code du test
     
        const 
            i0 = ['un', 'deux', 'trois'],
            i1 = ['quatre', 'cinq', 'six'],
            i2 = ['sept', 'huit', 'neuf'];
     
        let a = 'cinq';
     
        // https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/indexOf
        // -1 : n'existe pas
        // 0 à n : index de l'élément cherché
     
        console.log(`i0.indexOf(a) = ${ i0.indexOf(a) }`); // -1
        console.log(`i1.indexOf(a) = ${ i1.indexOf(a) }`); // 1
        console.log(`i2.indexOf(a) = ${ i2.indexOf(a) }`); // -1
     
        // fin code du test
     
    }, {
        capture: false,
        passive: true,
        once: false
    });

    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.)

  3. #3
    Expert confirmé
    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 : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Citation Envoyé par Charal72 Voir le message
    Pourquoi si var b=i1; b.indexOf(a) ne fonctionne t il pas alors que i1.indexOf(a) va bien!!? Je n'arrive pas à trouver la réponse..
    Si effectivement b = i1, les choses devraient se passer comme tu le décris. Si le problème n’est pas là où on regarde, il faut regarder ailleurs… Peut-être que a est modifié entre les deux tests.
    Ou alors, c’est un problème de portée. Comment et à quel endroit déclares-tu b, i1 et a ?
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Merci pour votre intérêt..et désolé de ne pas avoir répondu plus vite! En fait des chaines de caractères j'en ai plus de 50! l1....l50) d'ou l’intérêt,( je pense..), de parcourir une boucle type for (i=...) {b=l + i;...
    et c'est là que le b.indexOf(a) ne fonctionne pas!

  5. #5
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Voici le code réduit afin de comprendre
    e ne donne pas la bonne valeur si je rentre puma, par ex..
    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
    <input id="case0" type="text" class="cinq" value="" />
    <input id="case2" type="text" class="cinq" value="" />
    <input type="button" value="Nouvelle partie"onClick="myFunction()"/>
     
    <script>
    var i0 = ["lama","puma","elephant","vache","renard"];
    var j=0;
    function myFunction() {
    var a = document.getElementById("case0").value;
    var b="i"+j;
    var e = b.indexOf(a);
    document.getElementById("case2").value= e;
    }
    </script>

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Le problème c'est var b="i"+j;, car tout ce que fait cette ligne est d'affecter à la variable b la chaîne de caractère "i0" (par exemple). Mais ça reste une chaîne de caractère, et le i0 dans cette chaîne ne sera pas vu comme la variable i0 (et heureusement sinon ce serait un sacré bazar).

    Pour que ça fonctionne, il faudrait à la limite remplacer cette ligne par: var b=eval("i"+j);. De cette manière la chaîne de caractère serait interprétée comme du code Javascript et donc i0 vu comme la variable du même nom et remplacée par sa valeur.

    Mais, l'utilisation de eval est le petit signal qui doit te dire que tu t'y prends mal, et qu'il y a sûrement une manière bien plus simple et élégante d'arriver à tes fins (l'utilisation d'un tableau à la place de noms de variable numérotés?). N'ayant pas tous les tenants et aboutissants, je ne peux pas t'en dire plus.

    En parler sarthois, "renard" se dit "r’nâ".

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    on peut utiliser la notation par crochet pour atteindre ta variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var i0 = ["lama", "puma", "elephant", "vache", "renard"];
    var b = "i" + 0;
    alert(window[b]);
    Ceci étant, cela n'est valable, dans le cas présent, que si ta variable est déclarée avec le mot clé var, cela ne fonctionnera pas avec les mots clé let ou const.

  8. #8
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Le problème c'est var b="i"+j;, car tout ce que fait cette ligne est d'affecter à la variable b la chaîne de caractère "i0" (par exemple). Mais ça reste une chaîne de caractère, et le i0 dans cette chaîne ne sera pas vu comme la variable i0 (et heureusement sinon ce serait un sacré bazar).

    Pour que ça fonctionne, il faudrait à la limite remplacer cette ligne par: var b=eval("i"+j);. De cette manière la chaîne de caractère serait interprétée comme du code Javascript et donc i0 vu comme la variable du même nom et remplacée par sa valeur.

    Mais, l'utilisation de eval est le petit signal qui doit te dire que tu t'y prends mal, et qu'il y a sûrement une manière bien plus simple et élégante d'arriver à tes fins (l'utilisation d'un tableau à la place de noms de variable numérotés?). N'ayant pas tous les tenants et aboutissants, je ne peux pas t'en dire plus.

    En parler sarthois, "renard" se dit "r’nâ".
    Merci pour ta réponse.
    Voici le code, qui fonctionne ! grâce à toi ! Maintenant si une solution plus propre existe, je ne demande qu'à apprendre
    En fait j'ai une quarantaine de cases (case0 ... case 40), et autant de chaines de caracteres (l0..l40)
    Encore merci
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <input id="case0" type="text" class="cinq" value="" />
    <input id="case1" type="text" class="cinq" value="" />
    <input id="case2" type="text" class="cinq" value="" />
    <input type="button" value="Vérifier"onClick="myFunction()"/>
     
    <script>
    var l0 = ["peintre jeune","jeune peintre"];
    var l1 = ["tableau du vieux peintre","peintre vieux","vieux peintre","sous la main"];
    var memo = [];
    function myFunction() {    
        for(var i=0; i<3; i++) {
            var a = document.getElementById("case" + i).value;
            var mem = memo.indexOf(a);
                 for(var n=0; n<2; n++) {
                   var b = eval("l"+n);
                   if(mem == -1) {
                        if(b.indexOf(a) !== -1 && a!="") {
                        document.getElementById("case" + i).style.backgroundColor="#4CE0D2";
                            for(var k=0; k<b.length; k++) {
                                memo.push(b[k]);
                                n = 2;}
    }
    }
    }
    }
    }

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    la 1ère amélioration est de travailler avec un array * :
    * Ca m'étonne que tous les émiments spécialistes de DVP ne te l'aient pas proposé avent moi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const l = [
      ["peintre jeune","jeune peintre"],
      ["tableau du vieux peintre","peintre vieux","vieux peintre","sous la main"],
      // ...
    ];
    const l_lg = l.length;
    Il faut alors remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                 for(var n=0; n<2; n++) {
                   var b = eval("l"+n);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                 for(var n=0; n<l_lg; n++) {
                   var b = l[n];
    Et il y a sûrement d'autres optimisations à faire...
    Cela dit... Je n'ai pas compris à quoi ça servait...

  10. #10
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <html>
        <head>
            <meta charset="utf-8"/>
            <title></title>
            <style></style>
        </head>
    <body>
        <form>
            <fieldset id="cases">
                <input type="text" class="cinq" value="" />
                <input type="text" class="cinq" value="" />
                <input type="text" class="cinq" value="" />
            </fieldset>
            <input id="check" type="button" value="Nouvelle partie" />
        </form>
    </body>
    <script>
        // tableau de tableaux (chaque tableau a donc un index suivant son ordre)
        const wordLists = [
            [ "peintre jeune", "jeune peintre" ], // index 0
            [ "tableau du vieux peintre", "peintre vieux", "vieux peintre", "sous la main" ], // index 1
            [ "lama", "puma", "elephant", "vache", "renard" ], // index 2, etc.
        ];
     
        // tableau de tous les éléments input contenus dans l'élément avec l'id #cases
        const cases = document.querySelectorAll('#cases > input');
     
     
        // pour séparer le html et le javascript, on utilise un gestionnaire d'évenements (ici pour détecter le click sur le bouton)
        document.getElementById('check').addEventListener('click', e => { // corps de la fonction exécutée lors du click
            for (const c of cases) {
                if ( c.value === "" )
                    continue;
     
                for (let i=0, maxi=wordLists.length; i < maxi; i++) {
                    for (const word of wordLists[i]) {
                        if ( word.indexOf(c.value) !== -1 ) {
                            c.value = i;
                            c.style.backgroundColor = '#4CE0D2';
                            break;
                        } 
                    }
                }
            }
        }, false);
    </script>
    </html>


    Citation Envoyé par charal72
    Maintenant si une solution plus propre existe, je ne demande qu'à apprendre
    Citation Envoyé par jreaux62
    Cela dit... Je n'ai pas compris à quoi ça servait...
    Et c'est bien là le problème, car sans savoir ce que ce code cherche à réaliser et avec pour seul indice un code avec des noms de variables qui n'ont pas de signification (a, b, l, mem...), c'est pas facile d'avoir une vision d'ensemble qui permettrait de prendre de meilleurs décisions.

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'avoue que j'ai encore du mal à bien appréhender "const" et "let"...

    let
    L'instruction let permet de déclarer une variable dont la portée est celle du bloc courant, éventuellement en initialisant sa valeur.
    L'exemple est "perturbant" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let x = 1;
    if (x === 1) {
      let x = 2;
      console.log(x); // expected output: 2
    }
    console.log(x); // expected output: 1
    un simple "if" est un "bloc courant" ?

    On comprend un peu mieux dans la description :
    let permet de déclarer des variables dont la portée est limitée à celle du bloc dans lequel elles sont déclarées.

    Le mot-clé var, quant à lui, permet de définir une variable globale ou locale à une fonction (sans distinction des blocs utilisés dans la fonction).
    const
    La déclaration const permet de créer une constante nommée accessible uniquement en lecture.
    Cela ne signifie pas que la valeur contenue est immuable, uniquement que l'identifiant ne peut pas être réaffecté.
    Autrement dit la valeur d'une constante ne peut pas être modifiée par des réaffectations ultérieures.
    Une constante ne peut pas être déclarée à nouveau.
    portée... ?? globale ? (là, je doute...)
    Dernière modification par Invité ; 24/04/2019 à 14h51.

  12. #12
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    let et const ont la même portée dans le sens où elles rendent disponibles la variable (ou la constante) dans le bloc courant. Ensuite la variable (ou la constante) sont également disponibles dans les blocs enfants car en l'absence de définition locale, javascript cherche dans les blocs parents. On peut donc faire ça:
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const chaine='toto';
    (function() { console.log(chaine); })(); // toto
    //                        ^--- Javascript cherche dans le bloc parent si "chaine" est définie, car il n'y a pas de définition locale
    mais aussi:
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const chaine='toto';
    (function() { const chaine='titi'; console.log(chaine); })(); // titi
    //            ^--- j'ai le droit car j'ai changé de bloc
    (function() { console.log(chaine); })(); // toto
    // la constante du bloc parent n'a pas changé

    Bien que "chaine" soit disponible dans le bloc enfant (en tant que constante du bloc parent), rien ne m'empêche de définir une constante de même nom dans un bloc enfant (qui du coup sera prioritaire au sein de ce bloc).

    La grosse différence avec var c'est que les définitions des blocs enfants n'impactent pas les parents:
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var a=0;
    if (1) { var a=6; }
    console.log(a); // 6
     
    let b=0;
    if (1) { let b=6; }
    console.log(b); // 0
     
    if (1) { var x=12; }
    console.log(x); // 12
     
    if (1) { let y=12; }
    console.log(y); // ReferenceError: y is not defined

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Il existe une autre différence et non des moindres, dans un contexte global, avec let on déclare une variable globale avec var on déclare également une variable global mais qui est en fait une propriété de l'objet global window.

    Ce que l'on peut faire avec var
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    console.log(varVariable);            // méthode directe
    // >> globalVar
    console.log(window.varVariable);     // méthode point
    // >> globalVar
    console.log(window["varVariable"]);  // méthode crochet
    // >> globalVar
    Ce que l'on peut également faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // autre type d'appel
    var autreVar = "var-Variable";
    console.log(autreVar);
    // >> var-Variable
    console.log(window[autreVar]);
    // >> globalVar
    Ce qui différencie let de var, dans l'espace global
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let letVariable = "globalLet";
    console.log(letVariable);
    // >> globalLet
    console.log(window.letVariable);
    // >> undefined
    console.log(window["letVariable"]);
    // >> undefined

  14. #14
    Expert confirmé
    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 : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    On peut voir les blocs d’une autre façon, en partant du principe qu’ils sont une forme de statement (en français on pourrait dire « instruction »). Par exemple si on prend la structure if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (expression) statement
    Le statement peut être une instruction seule, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (true) console.log("bonjour");
    Ou bien un ensemble de zéro, une ou plusieurs instructions regroupées entre accolades {} et séparées par des point-virgules ; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (expression) {
      console.log("bonjour");
      const reponse = 42;
    }
    Ce n’est pas if, ni for(*), ni while, etc. qui définissent un bloc, c’est simplement la présence des accolades. D’ailleurs, on peut les utiliser sans rien et c’est un moyen facile de créer une nouvelle portée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const x = 1;
     
    {
      const x = 2;
      console.log(x); // 2
    }
     
    console.log(x); // 1
    (*) Edit : pour for il y a une exception, voir mon message suivant.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Ce n’est pas if, ni for, ni while, etc. qui définissent un bloc, c’est simplement la présence des accolades.
    C'est piégeux comme disent les québécois, car on pourrait penser qu'écrire if (1) let a=1; soit possible et que le bloc soit sous-entendu (comme un sucre syntaxique), or ce n'est pas du tout le cas (SyntaxError: lexical declarations can't appear in single-statement context), car c'est bien les accolades qui définissent le bloc.

  16. #16
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Citation Envoyé par CosmoKnacki Voir le message
    C'est piégeux comme disent les québécois, car on pourrait penser qu'écrire if (1) let a=1; soit possible et que le bloc soit sous-entendu (comme un sucre syntaxique), or ce n'est pas du tout le cas (SyntaxError: lexical declarations can't appear in single-statement context), car c'est bien les accolades qui définissent le bloc.
    Je vois cette erreur comme un choix arbitraire qui a été fait (la déclaration de cette variable n'ayant pas de sens dans ce bloc implicite), mais ne signifiant pas pour autant qu'il ne pourrait pas y avoir de bloc implicite en l'absence d'accolades.

    Cet exemple fonctionnel sans accolades montre l'existence de blocs implicites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var ar_=[];
    for(let i=0;i<2;i++) ar_[i]=function(){console.log(i);};
    ar_[0](); //0
    ar_[1](); //1
    De même qu'avec if, on aurait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(let i=0;i<2;i++) let j=0; //erreur
    Il y a une erreur, oui, mais ne voulant pas forcément dire qu'il n'y a pas potentiellement de bloc, comme le montre l'exemple précédent.

    Bon après, c'est aussi un peu abstrait comme perception, le résultat est le même.


    A noter au passage cette différence entre les deux boucles suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var ar_=[];
     
    for(let i=0;i<2;i++) {ar_[i]=function(){console.log(i);};}
    ar_[0](); //0
    ar_[1](); //1
     
    for(let i=0;i<2;) {ar_[i]=function(){console.log(i);};i++;}
    ar_[0](); //1
    ar_[1](); //2
    On comprend le fonctionnement, mais cela montre qu'il y a vraiment une convention d'écriture, avec derrière un remaniement assez important du code.

    Dans le genre également un peu déroutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(const i of [0,1,2]) console.log(i); //0 1 2
    for(const i in [1,2,3]) console.log(i); //0 1 2
    for(let i=0;i<3;i++) console.log(i); //0 1 2
    for(const i=0;i<2;i++) console.log(i); //0 puis erreur
    Les deux premiers cas montrent une utilisation de constante qui peut surprendre car en lisant naïvement le code on croirait voir une constante i qui change de valeur.
    Bien sûr, on comprend, mais du coup pour ma part, je ne suis pas vraiment fan de let et const, certes pratiques, mais qui amènent à des codes peu élégants (sans dire que les miens le sont ), le côté pratique s'accompagnant de subtilités dont tout le monde n'aura pas forcément conscience.
    Je n'irai toutefois pas jusqu'à en déconseiller l'usage, évidemment.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je trouve surtout que c'est un bon moyen pour semer la confusion, et s'arracher les cheveux plus souvent qu'à son tour...

    Celui qui a inventé "let" et "const" devait être chauve, et il a voulu se venger...



    Et pour citer Gilles Le Gendre :
    C'est certainement « Trop intelligent, trop subtil »...

  18. #18
    Expert confirmé
    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 : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    J’avais oublié ce détail avec for. J’éditerai mon précédent message pour réduire la confusion.

    La structure for a une syntaxe complexe et permet une petite particularité : sa clause d’initialisation permet de déclarer une variable. Historiquement, d’abord seulement avec var. Puis, quand const et let sont apparus, la sémantique de cette clause d’initialisation a été légèrement modifiée.

    var étant aveugle aux blocs, déclarer la variable dans l’initialisation du for ou en-dehors ne changeait rien. Mais avec let et const, il a été décidé que la variable déclarée existerait seulement dans le corps de la boucle, même si ce corps n’est constitué que d’une seule instruction, sans accolades. Avec la subtilité, comme tu le fais remarquer Loralina, que cette déclaration se fait pour chaque itération, ce qui peut donner l’impression d’une constante qui change de valeur.

    Donc oui, quelque part, la structure for est un peu une exception car elle crée un bloc implicite, mais seulement pour la ou les variables déclarées dans la clause d’initialisation.
    Voir la syntaxe de for.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  19. #19
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Et c'est bien là le problème, car sans savoir ce que ce code cherche à réaliser et avec pour seul indice un code avec des noms de variables qui n'ont pas de signification (a, b, l, mem...), c'est pas facile d'avoir une vision d'ensemble qui permettrait de prendre de meilleurs décisions.
    Voici donc une description plus précise
    Je montre un tableau une minute, Nom : baily.jpg
Affichages : 656
Taille : 251,9 Ko
    puis je demande de remplir une trentaine de case avec les éléments du tableau dont il se souvient. Je leur demande d'expliciter le maximum leur réponse..ex: le petit coffret métallique sur la table
    Puis je compare chacune de leur réponse avec différentes chaines de caractères contenant chacune la description d'un élément ["coffret",métallique","table","petit"]. Si au moins 2 éléments d'une même chaîne appartiennent à la réponse, je valide. Sinon, je refuse.
    Le code ci après fonctionne parfaitement tant que la réponse est validée. Une fois qu'une réponse est refusée, les suivantes le sont aussi systématiquement !!
    Pourriez vous m'aider?

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <style>
        .cinq {float:left; width:30%;margin-left:25px;padding:10px;}
        .cinq input {border:none; background-color:transparent;width:70%;text-transform:uppercase;}
    </style>
    <div>
    <p class="txt" style="font-weight:bold; text-align:center;padding:15px;text-transform:uppercase;">Inscrivez ci dessous les éléments dont vous vous rappelez concernant le tableau de Bailly.</br>Soyez le plus précis possible !</p>
    <input id="case0" type="text" class="cinq" value="" /><input id="case1" type="text" class="cinq" value="" /><input id="case2" type="text" class="cinq" value="" />
    <input id="case3" type="text" class="cinq" value="" /><input id="case4" type="text" class="cinq" value="" /><input id="case5" type="text" class="cinq" value="" />
    <input id="case6" type="text" class="cinq" value="" /><input id="case7" type="text" class="cinq" value="" /><input id="case8" type="text" class="cinq" value="" />
    <input id="case9" type="text" class="cinq" value="" /><input id="case10" type="text" class="cinq" value="" /><input id="case11" type="text" class="cinq" value="" />
    <input id="case12" type="text" class="cinq" value="" /><input id="case13" type="text" class="cinq" value="" /><input id="case14" type="text" class="cinq" value="" />
    <input id="case15" type="text" class="cinq" value="" /><input id="case16" type="text" class="cinq" value="" /><input id="case17" type="text" class="cinq" value="" />
    <input id="case18" type="text" class="cinq" value="" /><input id="case19" type="text" class="cinq" value="" /><input id="case20" type="text" class="cinq" value="" />
    <input id="case21" type="text" class="cinq" value="" /><input id="case22" type="text" class="cinq" value="" /><input id="case23" type="text" class="cinq" value="" />
    <input id="case24" type="text" class="cinq" value="" /><input id="case25" type="text" class="cinq" value="" /><input id="case26" type="text" class="cinq" value="" />
    <input id="case27" type="text" class="cinq" value="" /><input id="case28" type="text" class="cinq" value="" /><input id="case29" type="text" class="cinq" value="" />
    <input type="button" value="Vérifier"onClick="myFunction()"/>
    </div>
     
    <script>
    var ok=0;
    var l0 = ["peintre","jeune"];
    var l1 = ["tableau","peintre","vieux","main"];
    var l2 = ["tableau","femme"];
    var l3 = ["tableau","homme","barbe","barbu"];
    var l4 = ["tableau","joueur","mandoline","guitare"];
    var l5 = ["buste","enfant","sculpture","antique"];
    var l6 = ["statue","homme","esclave","sculpture"];
    var l7 = ["palette","peinture","peintures","couleurs","esclave"];
    var l8 = ["trois","bulles","volent","flottent","savon"];
    var l9 = ["crane","table","crane"];
    var l10 = ["canne","baguette","personnage","peintre"];
    var l11 = ["flute","table","flûte","flute","flûte"];
    var l12 = ["couteau","table","coupe","papier","lettre","coupe-papier","couteau"];
    var l13 = ["collier","perle","table"];
    var l14 = ["petit","coffret","couvercle","ouvert","boite","métallique","coffret"];
    var l15 = ["deux","2","livres","livre","table"];
    var l16 = ["trois","3","roses","vase","table"];
    var l17 = ["table","bois","table"];
    var l18 = ["rideau","tenture","livres","livre","table","rideau"];
    var l19 = ["verre","moitié","rempli","vin","blanc","flute","champagne"];
    var l20 = ["pièces","monnaie","pièce"];
    var l21 = ["flacon","renversé","table","brûle parfum","brûle-parfum"];
    var l22 = ["vase","transparent","renversé","table"];
    var l23 = ["bougeoir","bougie","éteinte"];
    var l24 = ["parchemin","roulé","enroulé"];
    var l25 = ["vase","livre","vase"];
    var l26 = ["sablier","sablier"];
    var l27 = ["nappe","tissu","froissé","table","bord"];
    var l28 = ["papier","texte","écrit","plié","bord","écriture"];
    var l29 = ["papier","tombe","table","vole","petit","blanc"];
    var memo = [];
    var mem = [];
    function myFunction() {
    for (var i=0;i<30;i++){
    var a = document.getElementById("case"+i).value;
    mem.push(a);
    for (var j=0;j<30;j++){
    ok=0;
    var b = eval("l"+j);
    for (var v=0;v<b.length;v++){
    var z = b[v];
    if (a!="") {
    if (mem[0].indexOf(z) !== -1) {
    ok++;
    if (ok==2) {
    document.getElementById("case"+i).style.backgroundColor="#4CE0D2";ok=0;v=b.length;j=30;mem.pop(a);
    for (var w=0;w<b.length;w++){
    var u = b[w];b.pop(u);}}
    }
    else {
    document.getElementById("case"+i).style.backgroundColor="#FF6666";}
    }
    else{
    document.getElementById("case"+i).style.backgroundColor="#FF6666";}
    }
    }
    }
    }
    </script>

    D'avance, merci pour votre réflexion

  20. #20
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 128
    Par défaut
    Salut

    Je ne savais pas qu'il était possible de nommer des variable avec seulement des chiffres, chez moi je n'y parviens pas.

    [NOSUJET]Il serait plus lisible de nous mettre un code intenté [/NOSUJET]
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. utiliser indexOf et les variables
    Par phpaide dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 24/05/2006, 15h59
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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