Quelle est la différence entre substr et substring?

844

Quelle est la différence entre

alert("abc".substr(0,2));

et

alert("abc".substring(0,2));

Ils semblent tous les deux afficher «ab».

Moteur de différence
la source
13
@Derek 朕 會 功夫 Remarque, substring surpasse tous les autres sur Chrome ces derniers temps.
Steven Lu
4
Ajout au commentaire @Derek ... Contrairement à la sliceméthode, substringne gère pas l'ajustement des paramètres négatifs.
Dzeimsas Zvirblis
1
Je pense que la question la plus importante est "pourquoi JavaScript a-t-il à la fois une substrméthode et une substringméthode"? C'est vraiment la méthode préférée de surcharge?
Sinjai
7
À ce jour, MDN a un gros avertissement rouge sur substr()ce que vous pourriez appeler "pseudo-obsolète" en haut de la page des documents ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Quelqu'un a-t-il plus d'informations à ce sujet, par exemple, y a-t-il un navigateur qui prévoit de déprécier substr()à tout moment dans le futur? Ou, comme l'a suggéré Steven Lu, pourrait-il y avoir des inconvénients en termes de performances à l' substr()avenir?
jamess

Réponses:

930

La différence réside dans le deuxième argument. Le deuxième argument de substringest l'indice auquel s'arrêter (mais ne pas inclure), mais le deuxième argument de substrest la longueur maximale à renvoyer.

Liens?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring

Delan Azabani
la source
61
Cela ressemble à une source d'erreur courante. Bon de savoir la différence. Vous trouverez
schnaader
3
@Pawel aussi quand vous le voulez jusqu'à la fin de la chaîne (pas de deuxième argument)
André Chalella
C'est tellement ridicule que je manque presque le temps de développer des applets Java. ('Presque', car nous devions alors nous inquiéter pour IE.)
Michael Scheper
2
Vous devez également mentionner la différence sur le premier argument, qui peut être négative pour substr (auquel cas elle commence à la fin), mais pas pour substring. Voir la réponse de JefferMC, mais il a tellement moins de votes que beaucoup de gens pourraient manquer cette partie importante.
youen
2
Comme il s'agit de la réponse de loin la plus votée, elle devrait probablement être modifiée pour inclure celle qui String.prototype.substr()est déconseillée ... (Elle est définie à l' annexe B de la norme ECMA-262, dont l' introduction indique: "... Les programmeurs ne existence de ces caractéristiques et comportements lors de l'écriture de nouveau code ECMAScript.… ")
TS
309

substring( MDN ) prend les paramètres en tant que (from, to).
substr( MDN ) prend les paramètres en tant que (from, length).

Mise à jour : MDN prend en compte l' substrhéritage.

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

Vous vous souvenez des substringprises d'indices, tout comme une autre méthode d'extraction de chaînes, slice .

En partant de 0, vous pouvez utiliser l'une ou l'autre méthode.

Colin Hebert
la source
140
.substring()prend des indices. Vous vous en souvenez parce que c'est le seul avec un «i» dans le nom. .slice()prend aussi des indices.
colllin
10
@colllin, ce commentaire sur le i et les indices devrait sûrement être déplacé dans la réponse!
MyDaftQuestions
35

Comme l'indique la réponse de yatima2975, il existe une différence supplémentaire:

substr()accepte une position de départ négative comme décalage par rapport à la fin de la chaîne. substring()ne fait pas.

De MDN :

Si start est négatif, substr () l'utilise comme index de caractère à partir de la fin de la chaîne.

Donc, pour résumer les différences fonctionnelles:

substring(begin-offset, end-offset-exclusive)où l'offset de début est 0ou supérieur

substr(begin-offset, length) où le début-décalage peut également être négatif

JefferMC
la source
25

Un autre problème que j'ai récemment rencontré est que dans IE 8, "abcd".substr(-1)renvoie par erreur "abcd", tandis que Firefox 3.6 retourne "d"comme il se doit.slicefonctionne correctement sur les deux.

Plus d'informations sur ce sujet peuvent être trouvées ici .

yatima2975
la source
17

La principale différence est que

substr () vous permet de spécifier la longueur maximale à renvoyer

substring () vous permet de spécifier les indices et le deuxième argument n'est PAS inclusif

Il existe quelques subtilités supplémentaires entre substr () et substring () telles que la gestion des arguments égaux et des arguments négatifs. Notez également que substring () et slice () sont similaires mais pas toujours identiques.

  //*** length vs indices:
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  //*** watch out for substring swap:
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".substr(3,2);     // "in"
    "string".slice(3,2);      // ""     (just returns "")

  //*** negative second argument:
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".substr(2,-4);    // ""
    "string".slice(2,-4);     // ""

  //*** negative first argument:
    "string".substring(-3);   // "string"        
    "string".substr(-3);      // "ing"  (read from end of string)
    "string".slice(-3);       // "ing"        
Nate Lipp
la source
Vous avez manqué le "deuxième argument négatif" utile pour slice:"string".slice(2,-2); // "ri"
Paul
8

La différence est le deuxième paramètre. Leurs deuxièmes paramètres, bien que les deux nombres, attendent deux choses différentes:

Lorsque vous utilisez une sous-chaîne, le deuxième paramètre est le premier index à ne pas inclure:

var s = "string";
s.substring(1, 3); // would return 'tr'

var s = "another example";
s.substring(3, 7); // would return 'ther'

Lors de l'utilisation de substr, le deuxième paramètre est le nombre de caractères à inclure dans la sous-chaîne:

var s = "string";
s.substr(1, 3); // would return 'tri'

var s = "another example";
s.substr(3, 7); // would return 'ther ex'
CurnalCurz
la source
5

La grande différence est qu'il substr()s'agit d' une méthode obsolète qui peut toujours être utilisée, mais qui doit être utilisée avec prudence car elle devrait être supprimée entièrement à l'avenir. Vous devez travailler pour supprimer leur utilisation de votre code. Et la substring()méthode a réussi et a précisé la première.

5ervant
la source
2
Pouvez-vous indiquer une source fiable qui indique la dépréciation de substr()? Je l'ai lu de plusieurs personnes, mais je ne trouve aucune information sur le Web qui soutienne la déclaration. De plus, Mozilla ne l'inclut pas dans la liste des fonctionnalités obsolètes / obsolètes: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM
@DanielM Pour autant que je me souvienne, il était obsolète lorsque je poste cette réponse, peut-être que l'article a changé et qu'il n'est plus obsolète (mais pas sûr) .. Mais toujours enregistré sur certains articles comme dans sstut.com/javascript/substring- method.php comme obsolète.
5ervant
3
@DanielM String.prototype.substr()est défini dans l' annexe B de la norme ECMA-262, dont l' introduction stipule: "… Les programmeurs ne doivent pas utiliser ou supposer l'existence de ces fonctionnalités et comportements lors de l'écriture de nouveau code ECMAScript.…"
TS
@TS substr()est vraiment noté comme obsolète sur certains documents.
5ervant
2
Cela devrait être la réponse acceptée dès aujourd'hui. L'utilisation de fonctions héritées lorsqu'il existe une alternative n'est pas une option pour un bon code. Veuillez noter cette réponse pour la rendre plus visible lorsque Google mène à cette page.
vbezhenar
4

Méthodes Slice vs Substr vs Substring vs []

Chacune de ces méthodes javascript présente des avantages en termes de performances. Veuillez utiliser ces fonctions en conséquence.

Ali007
la source
9
Cette réponse serait meilleure si elle incluait ici un texte récapitulatif concernant les résultats des avantages liés à la performance, s'il vous plaît.
2540625
3

substring (): Il a 2 paramètres "start" et "end".

  • Le paramètre start est requis et spécifie la position où commencer l'extraction.
  • Le paramètre end est facultatif et spécifie la position où l'extraction doit se terminer.

Si le paramètre de fin n'est pas spécifié, tous les caractères de la position de début jusqu'à la fin de la chaîne sont extraits.

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

Si la valeur du paramètre de début est supérieure à la valeur du paramètre de fin, cette méthode permute les deux arguments. Cela signifie que start sera utilisé comme end et end sera utilisé comme start.

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr () : Il a 2 paramètres "start" et "count".

  • Le paramètre start est requis et spécifie la position où commencer l'extraction.

  • Le paramètre count est facultatif et spécifie le nombre de caractères à extraire.

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

Si le paramètre count n'est pas spécifié, tous les caractères depuis la position de départ jusqu'à la fin de la chaîne sont extraits. Si count est 0 ou négatif, une chaîne vide est retournée.

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple

raju poloju
la source
2

sous-chaîne (startIndex, endIndex (non inclus))

substr (startIndex, combien de caractères)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Sajith Mantharath
la source