930 votes

Quelle est la différence entre substr et substring ?

Quelle est la différence entre

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

y

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

Ils semblent tous deux produire "ab".

16 votes

@Derek Note, substring surpasse tous les autres sur Chrome ces derniers temps.

4 votes

Pour compléter le commentaire de @Derek... Contrairement à la slice méthode, substring ne gère pas l'ajustement pour les paramètres négatifs.

2 votes

Je pense que la question la plus importante est "pourquoi JavaScript a à la fois une substr méthode et un substring méthode" ? C'est vraiment la méthode préférée de surcharge ?

1025voto

Delan Azabani Points 33013

La différence se situe au niveau du deuxième argument. Le deuxième argument de substring est l'indice auquel il faut s'arrêter (sans l'inclure), mais le deuxième argument de la commande substr est la longueur maximale à retourner.

Des liens ?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring

71 votes

Cela semble être une source d'erreur commune. Il est bon de connaître la différence. J'ai trouvé d'autres commentaires à ce sujet ici : rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring

3 votes

@Pawel aussi quand vous voulez qu'il soit à la fin de la chaîne (pas de deuxième argument)

0 votes

C'est tellement ridicule que je regrette presque l'époque où l'on développait des applets Java. ("Presque", parce que nous devions nous soucier d'IE à l'époque).

356voto

Colin Hebert Points 40084

substr ( MDN ) prend les paramètres suivants (from, length) .
substring ( MDN ) prend les paramètres suivants (from, to) .

Mise à jour : MDN considère substr l'héritage.

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

Vous pouvez vous souvenir substr**i**ng (avec un i ) prend i ndices, tout comme une autre méthode d'extraction de chaînes de caractères, sl i ce (avec un i ).

Lorsque vous partez de 0, vous pouvez utiliser l'une ou l'autre méthode.

155 votes

.substring() prend des indices. Vous pouvez vous en souvenir car c'est le seul dont le nom comporte un "i". .slice() prend aussi des indices.

12 votes

@colllin, ce commentaire sur le i et les indicies devrait sûrement être déplacé dans la réponse !

45voto

JefferMC Points 597

Comme le laisse entendre 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 le fait pas.

Desde MDN :

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

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

substring(begin-offset, end-offset-exclusive) où begin-offset est 0 ou plus

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

26voto

yatima2975 Points 4191

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

Vous trouverez plus d'informations sur ce sujet aquí .

23voto

Nate Lipp Points 156

La principale différence est que

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

substring() vous permet de spécifier les indices et le second argument n'est PAS inclusif.

Il existe quelques subtilités supplémentaires entre substr() et substring(), comme 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"

0 votes

Vous avez manqué l'utile "deuxième argument négatif" pour slice : "string".slice(2,-2); // "ri"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X