Qual é a diferença entre substr e substring?

844

Qual é a diferença entre

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

e

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

Ambos parecem produzir "ab".

Diferença Engine
fonte
13
@Derek 功夫 會 功夫 Observe que substring supera todos os outros no Chrome ultimamente.
9183 Steven Lu Lu
4
Adicionando ao comentário do @Derek ... Diferentemente do slicemétodo, substringnão trata do ajuste para parâmetros negativos.
Dzeimsas Zvirblis
1
Eu acho que a pergunta mais importante é "por que o JavaScript tem um substrmétodo e um substringmétodo"? Este é realmente o método preferido de sobrecarga?
Sinjai 26/01
7
Atualmente, o MDN tem um grande aviso vermelho sobre substr()ser o que você pode chamar de "pseudo-obsoleto" na parte superior da página de documentos aqui: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Alguém tem mais informações sobre isso, por exemplo, existe algum navegador que esteja planejando se tornar obsoleto substr()em algum momento no futuro? Ou, como sugeriu Steven Lu, pode haver desvantagens de desempenho no uso substr()daqui para frente?
jamess 17/09/18

Respostas:

930

A diferença está no segundo argumento. O segundo argumento para substringé o índice no qual parar (mas não inclui), mas o segundo argumento substré o comprimento máximo a ser retornado.

Links?

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

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

Delan Azabani
fonte
61
Parece uma fonte comum de erro. É bom saber a diferença. Encontrado comentários adicionais sobre esta aqui: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader
3
@Pawel também quando você quer que o final da cadeia (sem segundo argumento)
André Chalella
Isso é tão ridículo que quase sinto falta dos dias de desenvolvimento de applets Java. ( 'Quase', porque nós tivemos que se preocupar com IE naquela época.)
Michael Scheper
2
Você também deve mencionar a diferença no primeiro argumento, que pode ser negativo para substr (nesse caso, começa do final), mas não para substring. Veja a resposta do JefferMC, mas há tantos menos votos que muitas pessoas podem perder essa parte importante.
youen
2
Como esta é a resposta de longe a mais votada, provavelmente deve ser editada para incluir a que String.prototype.substr()está obsoleta ... (Está definida no Anexo B da norma ECMA-262, cuja introdução afirma: "… Os programadores não devem usar ou assumir o existência desses recursos e comportamentos ao escrever o novo código ECMAScript.… ")
TS
309

substring( MDN ) assume parâmetros como (from, to).
substr( MDN ) assume parâmetros como (from, length).

Atualização : o MDN considera substrlegado.

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

Você pode se lembrar dos substringíndices, assim como outro método de extração de sequência, fatia .

Ao iniciar a partir de 0, você pode usar qualquer um dos métodos.

Colin Hebert
fonte
140
.substring()leva índices. Você pode se lembrar porque é o único com um 'i' no nome. .slice()leva índices também.
colllina
10
@ Colllin, esse comentário sobre o i e indícios certamente deve ser movido para a resposta!
MyDaftQuestions
35

Como sugerido na resposta de yatima2975, há uma diferença adicional:

substr()aceita uma posição inicial negativa como um deslocamento do final da string. substring()não.

Do MDN :

Se start for negativo, substr () o utilizará como um índice de caracteres no final da string.

Então, para resumir as diferenças funcionais:

substring(begin-offset, end-offset-exclusive)onde o deslocamento inicial é 0ou maior

substr(begin-offset, length) onde o deslocamento inicial também pode ser negativo

JefferMC
fonte
25

Outro problema que me deparei recentemente é que no IE 8, "abcd".substr(-1)retorna erroneamente "abcd", enquanto o Firefox 3.6 retorna "d"como deveria.slicefunciona corretamente em ambos.

Mais sobre este tópico pode ser encontrado aqui .

yatima2975
fonte
17

A principal diferença é que

substr () permite especificar o comprimento máximo a ser retornado

substring () permite especificar os índices e o segundo argumento NÃO é inclusivo

Existem algumas sutilezas adicionais entre substr () e substring (), como a manipulação de argumentos iguais e negativos. Observe também que substring () e slice () são semelhantes, mas nem sempre são os mesmos.

  //*** 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
fonte
Você perdeu o útil "segundo argumento negativo" para slice:"string".slice(2,-2); // "ri"
Paul
8

A diferença é o segundo parâmetro. Seus segundos parâmetros, enquanto ambos os números, esperam duas coisas diferentes:

Ao usar substring, o segundo parâmetro é o primeiro índice a não incluir:

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

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

Ao usar substr, o segundo parâmetro é o número de caracteres a serem incluídos na substring:

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

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

A grande diferença é que substr()é um método descontinuado que ainda pode ser usado, mas deve ser usado com cautela, pois espera-se que sejam removidos totalmente em algum momento no futuro. Você deve trabalhar para remover o uso deles do seu código. E o substring()método foi bem-sucedido e especificou o anterior.

5ervant
fonte
2
Você pode apontar para uma fonte confiável que indique a descontinuação de substr()? Eu li isso de várias pessoas, mas não consigo encontrar nenhuma informação na Web que suporte a declaração. Além disso, o Mozilla não o inclui na lista de recursos obsoletos / obsoletos: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM
@DanielM Tanto quanto me lembro, ele foi descontinuado quando eu postei essa resposta, talvez o artigo tenha mudado e agora não esteja descontinuado (mas não tenho certeza) .. Mas ainda está registrado em alguns artigos, como em sstut.com/javascript/substring- method.php como descontinuado.
31/05/16
3
@DanielM String.prototype.substr() é definido no Anexo B da norma ECMA-262, cuja introdução afirma: "… Os programadores não devem usar ou assumir a existência desses recursos e comportamentos ao escrever o novo código ECMAScript.…"
TS
O @TS substr()é realmente considerado obsoleto em alguns documentos.
servant
2
Essa deve ser a resposta aceita hoje. O uso de funções herdadas quando há alternativas não é uma opção para um bom código. Voto esta resposta para torná-la mais visível à medida que o Google leva a esta página.
vbezhenar
4

Métodos Slice vs Substr vs Substring vs []

Há benefícios de desempenho para cada um desses métodos javascript. Por favor, use essas funções adequadamente.

Ali007
fonte
9
Essa resposta seria melhor se incluísse algum texto de resumo aqui sobre as conclusões dos benefícios de desempenho vinculados, por favor.
2540625
3

substring (): Possui 2 parâmetros "start" e "end".

  • começar parâmetro é necessário e especifica a posição onde iniciar a extração.
  • fim parâmetro é opcional e especifica a posição em que a extração deve terminar.

Se o parâmetro final não for especificado, todos os caracteres da posição inicial até o final da sequência serão extraídos.

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

Output : Substring

Se o valor do parâmetro inicial for maior que o valor do parâmetro final, esse método trocará os dois argumentos. Isso significa que o início será usado como final e o fim será usado como início.

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

Output : Substring

substr () : Possui 2 parâmetros "start" e "count".

  • O parâmetro start é necessário e especifica a posição onde iniciar a extração.

  • O parâmetro count é opcional e especifica o número de caracteres a serem extraídos.

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


Output : Substr Exa

Se o parâmetro count não for especificado, todos os caracteres da posição inicial até o final da string serão extraídos. Se count for 0 ou negativo, uma sequência vazia será retornada.

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

Output : ple

raju poloju
fonte
2

substring (startIndex, endIndex (não incluído))

substr (startIndex, quantos caracteres)

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
fonte