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 :

Méthode de substitution en cas de non-existence (substr)


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2022
    Messages : 19
    Par défaut Méthode de substitution en cas de non-existence (substr)
    Bonjour à tous,

    Je cherche à sécuriser une vieille portion de code javascript dans laquelle est répétée de nombreuses fois la méthode substr(), dépréciée et qui pourrait donc (?) éventuellement disparaitre un jour de certains navigateurs (ce que je trouve absurde dans l'idée mais passons...).

    L'idée est donc de rajouter une condition recréant la méthode si elle n'existe pas, dans le genre de celle-ci (qui censée faire le job juste pour les indices négatifs) :

    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
    if (!typeof(substr) == 'function')   // mais est ce une fonction ?!
    {
     String.prototype.substr = (function (substr) {
        return function (début, longueur) {
          // Appel de la méthode originale
          return substr.call(
            this,
            // Si on a un début négatif, calculer combien il vaut à partir du début de la chaîne
            // Ajuster le paramètre pour une valeur négative
            début < 0 ? this.length + début : début,
            longueur,
          );
        };
      })(String.prototype.substr);
    }
    Quelqu'un saurait comment faire la fonction complète proprement ? (parce que je n'y connais pour ainsi dire rien dans ces subtilités) ?

    Le bout de code vient de là : https://developer.mozilla.org.cach3..../String/substr


    Un grand merci d'avance... je suis très étonné de ne pas avoir trouvé de réponse à cette question sur le net. Cela dit la question est peut être "erronée"...

  2. #2
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Salut, tout simplement avec slice()...
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function substrperso(str, start, length) {
      return str.slice(start, start + length);
    }
     
    const mystr="javascript, c'est fantastique";
    alert( substrperso( mystr,18,11) );

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2022
    Messages : 19
    Par défaut
    Bonjour, le problème, c'est que je cherche à recréer une méthode qui prendrait vraiment le relai pour imiter substr si celle ci n'existait plus... donc avec la même syntaxe, ex : test.substr(2,2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (!typeof(substr) == 'function')   // mais substr est une méthode, pas une fonction
    {
      function substr(str, start, length) {
        return str.slice(start, start + length);
      }
    }
     
    // Ca ne conviendrait a priori pas pour faire fonctionner :
     
    var test = 'Hello world';
     
    var res1 = test.substr(2,2);
    var res2 = test.substr(-3);
    Merci encore...

  4. #4
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Ok et ça :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     String.prototype.substrperso = function(start, length){
          return this.slice(start, start + length);
    };
     
    const mystr="javascript, c'est fantastique";
    alert( mystr.substrperso(18,11) );

  5. #5
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387

  6. #6
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Pour coller plus précisément à substr() :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String.prototype.substrperso = function(start, length = this.length - start){
          if (start < 0) start = Math.max(this.length + start, 0);
          return this.slice(start, start + length);
    };
     
    const mystr="javascript, c'est fantastique";
    alert( mystr.substrperso(2,2) );
    alert(mystr.substr(2,2));
    alert( mystr.substrperso(-3) );
    alert(mystr.substr(-3));

  7. #7
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2022
    Messages : 19
    Par défaut
    Bonsoir,
    Citation Envoyé par unanonyme Voir le message
    ...
    Je viens de voir les 3 pages... le code a l'air franchement compliqué (mais sans doute tout à fait pro)... l'un fait un include, c'est un peu dommage... bref, cela doit-il être si complexe et difficile à comprendre pour une si petite méthode ?

  8. #8
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2022
    Messages : 19
    Par défaut
    Citation Envoyé par Archimède Voir le message
    ...
    Donc sauf erreur, le code final serait celui là ? edit : j'ai rajouté le "!" à if (!typeof(substr) == 'function')

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (!typeof(substr) == 'function')
    {
     String.prototype.substr = function(start, length = this.length - start){
          if (start < 0) start = Math.max(this.length + start, 0);
          return this.slice(start, start + length);
     };
    }
    ... et pour le tester, je peux peut être "annihiler" la méthode avant cela avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String.prototype.substr = function(start, length = this.length - start){
     
          return "zero";
    };
     
    const mystr="javascript, c'est fantastique";
    alert(mystr.substr(2,2));
    Bon, j'ai testé... ça semble marcher. Ca vous semble correct ?

  9. #9
    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,
    dépréciée et qui pourrait donc (?) éventuellement disparaitre un jour de certains navigateurs
    si cela peut te rassurer il y a peu de chance que cela soit « retiré » pour de simple soucis de compatibilité antérieure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!typeof(substr) == 'function')
    ce n'est pas la meilleur façon de procéder, la fonction substr pouvant exister ailleurs dans le code sans faire partie pour autant des prototypes des String.

    Si tu souhaites vérifier qu'une méthode existe, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ("function" !== typeof new String().coupe) {
      // on redéfini la fonction, par exemple
      String.prototype.coupe = String.prototype.substring;
    }
    str = new String("chaine de caractères")
    console.log(str.coupe(0, 6).toUpperCase());
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!String.prototype.hasOwnProperty("substr")) {
      // ...
    }
    par exemple.

  10. #10
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Citation Envoyé par user41 Voir le message
    Bonsoir,

    Je viens de voir les 3 pages... le code a l'air franchement compliqué (mais sans doute tout à fait pro)... l'un fait un include, c'est un peu dommage... bref, cela doit-il être si complexe et difficile à comprendre pour une si petite méthode ?
    Bonjour,

    Considérez ces liens pour ce qu'ils vous apportent, du travail mâché gratuitement.

    La spécification, comme le code, requiert un effort pour être assimilée,
    mais cela est récompensé par une implémentation moins défectueuse.

    Si je prends votre dernier bout de code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     String.prototype.substr = function(start, length = this.length - start){
          if (start < 0) start = Math.max(this.length + start, 0);
          return this.slice(start, start + length);
     };
    Le résultat, pour un hypothétique, mais pas moins invraisemblable puisque possible, appel, tel que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.prototype.substr.call({}, 1);
    Je n'obtiens pas le même résultat qu'avec la fonction originale.

    Ce genre de petit détail ayant déjà été réfléchi dans les liens que j'ai fait suivre ici,
    le problème serait résolu automatiquement.

    Je vous suggère de prendre le temps de lire tout cela sérieusement pour un moment,
    puis de simplement dormir dessus, vous y reviendrez plus tard, vous y verrez plus clair,
    en gardant en tête qu'il n'y a jamais d'urgence à introduire un bug dans une correction
    pour un cas hypothétique, car je rejoins NoSmoking, cette méthode n'est pas prête de
    disparaître.
    L'intention est louable mais peu réaliste.

    Tout cela étant dit, je suggère de ne pas cacher votre modification derrière une assertion telle que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!typeof(substr) == 'function')
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!String.prototype.hasOwnProperty("substr"))
    C'est le plus sûr moyen d'introduire un bug silencieux dans la base de code.
    Bug qui ne sera découvert que bien plus tard,
    et dont on aura du mal à comprendre la survenance le moment venu.

    Si vous vous lancé dans cette modif, autant y aller franchement dès maintenant,
    selon moi.

    Alors oui, ça demande plus d'efforts, c'est moins efficace productivement parlant, ça coûte plus cher,
    ça ne permet pas de s'auto-congratuler d'efforts consentis à pisser de la merde mal testée,
    ça évite juste de procrastiner..

    Bonne journée.

  11. #11
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Février 2022
    Messages : 19
    Par défaut
    C'est noté, un grand merci à tous pour vos efforts, je pense que cette discussion sera utile !

    Je ne suis pas sûr qu'il faille considérer ce sujet comme résolu... !?

    Cordialement.

Discussions similaires

  1. Stopper un Shell en cas de non réponse
    Par stigma dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2006, 10h03
  2. Réponses: 1
    Dernier message: 10/02/2006, 19h07
  3. Réponses: 6
    Dernier message: 10/02/2006, 13h46
  4. Réponses: 2
    Dernier message: 05/01/2006, 14h17
  5. Réponses: 9
    Dernier message: 17/03/2005, 09h20

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