Alguém sabe qual é a diferença entre esses dois métodos?
String.prototype.slice
String.prototype.substring
javascript
substring
slice
substr
tmim
fonte
fonte
slice
é aquele com o comportamento menos inesperado.slice
pode realmente substituirsubstring
e não há razão para usá-lo.var a = "asdf".substring(-1);
, é tratado comovar a = "asdf".substring(0);
. Não há exceção lançada. E se você usarvar a = "asdf".substring(2, -1);
, ele usa0
no lugar de-1
(como antes) e troca os argumentos para que funcionem comovar a = "asdf".substring(0, 2);
. Eu até tentei estes em IE 8 e tenho os resultados sem exceçõesRespostas:
slice()
funciona comosubstring()
com alguns comportamentos diferentes.O que eles têm em comum:
start
igualstop
: retorna uma string vaziastop
for omitido: extrai caracteres até o final da sequênciaDistinções de :
substring()
start > stop
, entãosubstring
irá trocar esses 2 argumentos.NaN
, será tratado como se fosse0
.Distinções de
slice()
:start > stop
,slice()
retornará a seqüência vazia. (""
)start
for negativo: define char a partir do final da string, exatamente comosubstr()
no Firefox. Esse comportamento é observado no Firefox e no IE.stop
for negativo: os conjuntos param para:string.length – Math.abs(stop)
(valor original), exceto delimitados em 0 (portanto,Math.max(0, string.length + stop)
) conforme coberto no especificação ECMA .Fonte: Arte rudimentar de programação e desenvolvimento: Javascript: substr () vs substring ()
fonte
slice()
, deve ser #string.length - stop
slice()
, eu acho que deveria ser(string.length – 1) + stop
, ou, para torná-lo claro que é negativo,(string.length – 1) – Math.abs(stop)
String.slice
foi adicionado para que haja um método de string consistenteArray.slice
.substring
está lá para sempre, então eles não quebraram e adicionaram outro método. Dificilmente uma decisão ruim como 1. a consistência é boa e 2. permite que a sintaxe de fatia do CoffeeScript funcione em matrizes e strings. @Oriol: editou-o em.stop
será definido comostring.length + stop
sestop
for negativo. Lembrestop
- se é o índice após o último caractere extraído!Nota: se você estiver com pressa e / ou estiver procurando uma resposta curta, role até a parte inferior da resposta e leia as duas últimas linhas.se não estiver com pressa, leia tudo.
deixe-me começar declarando os fatos:
Sintaxe:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Nota 1:
slice()==substring()
O que faz?
O
slice()
método extrai partes de uma sequência e retorna as partes extraídas em uma nova sequência.O
substr()
método extrai partes de uma sequência, iniciando no caractere na posição especificada e retorna o número especificado de caracteres.O
substring()
método extrai partes de uma sequência e retorna as partes extraídas em uma nova sequência.Nota 2:
slice()==substring()
Muda a string original?
slice()
Nãosubstr()
faz Nãosubstring()
faz nãonota # 3:
slice()==substring()
Usando números negativos como argumento:
slice()
seleciona caracteres iniciando no final da seqüência desubstr()
caracteres seleciona caracteres iniciando no final da seqüência de caracteressubstring()
Não executaNota # 3:
slice()==substr()
se o primeiro argumento for maior que o segundo:
slice()
não for executado,substr()
pois o segundo argumento NÃO é uma posição, mas o valor de comprimento, ele será executado normalmente, sem problemassubstring()
, os dois argumentos serão trocados e serão executados normalmente.o primeiro argumento:
slice()
obrigatório indica: Índice inicialsubstr()
obrigatório, indica: Índice inicialsubstring()
obrigatório, indica: Índice inicialNota # 4:
slice()==substr()==substring()
o Segundo Argumento:
slice()
Opcional, A posição (até, mas não incluindo) onde finalizar a extraçãosubstr()
Opcional, O número de caracteres a serem extraídossubstring()
Opcional, A posição (até, mas não incluindo) onde finalizar a extraçãoNota # 5:
slice()==substring()
E se o segundo argumento for omitido?
slice()
seleciona todos os caracteres da posição inicial até o final da sequênciasubstr()
seleciona todos os caracteres da posição inicial até o final da sequênciasubstring()
seleciona todos os caracteres da posição inicial até o final da sequênciaNota # 6:
slice()==substr()==substring()
então, você pode dizer que há uma diferença entre
slice()
esubstr()
, enquantosubstring()
é basicamente uma cópia deslice()
.Resumo:
se você souber o índice (a posição) em que irá parar (mas NÃO incluir), use
slice()
se souber o tamanho dos caracteres a serem extraídos
substr()
.fonte
Ben Nadel escreveu um bom artigo sobre isso, ele aponta a diferença nos parâmetros para essas funções:
Ele também aponta que, se os parâmetros a serem fatiados são negativos, eles referenciam a string do final. Substring e substr não.
Aqui está o artigo dele sobre isso.
fonte
'0123456789'.substr(-3, 2) -> '78'
A única resposta é boa, mas requer uma pequena leitura. Especialmente com a nova terminologia "stop".
My Go - organizado por diferenças para torná-lo útil, além da primeira resposta de Daniel acima:
1) índices negativos. A sequência de caracteres requer índices positivos e definirá um índice negativo para 0. O índice negativo da fatia significa a posição do final da sequência.
2) Troca de índices. Substring reordenará os índices para tornar o primeiro índice menor ou igual ao segundo índice.
--------------------------
Comentário geral - acho estranho que o segundo índice seja a posição após o último caractere da fatia ou substring. Eu esperaria que "1234" .slice (2,2) retornasse "3". Isso justifica a confusão de Andy acima - eu esperaria que "1234" .slice (2, -1) retornasse "34". Sim, isso significa que eu sou novo em Javascript. Isso significa também esse comportamento:
Meu 2c.
fonte
A diferença entre substring e fatia - é como eles funcionam com argumentos negativos e com vista para linhas no exterior:
substring (início, fim)
Argumentos negativos são interpretados como zero. Valores muito grandes são truncados para o comprimento da string: alert ("testme" .substring (-2)); // "testme", -2 se torna 0
Além disso, se start> end, os argumentos são trocados, ou seja, a linha de plotagem retorna entre o início e o fim:
fatia
Os valores negativos são medidos a partir do final da linha:
É muito mais conveniente do que a estranha substring lógica.
Um valor negativo do primeiro parâmetro para substr suportado em todos os navegadores, exceto o IE8-.
Se a escolha de um destes três métodos, para uso na maioria das situações - será uma fatia : argumentos negativos e mantém e opera mais óbvio.
fonte
substr: Ele nos fornece buscar parte da string com base no índice especificado. sintaxe do substr- string.substr (start, end) start - start index informa onde a busca começa. O índice end - end indica até onde a string é buscada. É opcional.
fatia: está fornecendo para buscar parte da string com base no índice especificado. Isso nos permite especificar positivo e índice. sintaxe da fatia - string.slice (start, end) start - start index informa onde a busca é iniciada. É opcional. Na 'emenda', o índice inicial e final ajuda a obter um índice positivo e negativo.
código de exemplo para 'fatia' na string
código de exemplo para 'substring' na string
[* Nota: a indexação negativa começa no final da string.]
fonte
A única diferença entre o método de fatia e substring é de argumentos
Ambos aceitam dois argumentos, por exemplo, início / de e fim / para.
Você não pode passar um valor negativo como primeiro argumento para o método de substring , mas para que o método de fatia o atravesse do final.
Detalhes do argumento do método da fatia:
REF: http://www.thesstech.com/javascript/string_slice_method
Argumentos
start_index Índice de onde a fatia deve começar. Se o valor for fornecido em negativo, significa começar do último. por exemplo, -1 para o último caractere. end_index Índice após o final da fatia. Se não for fornecido, a fatia será retirada do start_index até o final da string. No caso de valor negativo, o índice será medido a partir do final da string.
Detalhes do argumento do método de substring:
REF: http://www.thesstech.com/javascript/string_substring_method
Argumentos
from Deve ser um número inteiro não negativo para especificar o índice de onde a sub-string deve iniciar. para Um número inteiro não negativo opcional para fornecer um índice antes do qual a sub-cadeia deve ser concluída.
fonte
Pois
slice(start, stop)
, sestop
for negativo,stop
será definido como:ao invés de:
fonte