Parece haver muita confusão que foi abordada apenas nos comentários de elclanrs e raina77ow, então deixe-me postar uma resposta esclarecedora.
Esclarecimento
De " string.splice" pode-se esperar que, como aquele para arrays:
- aceita até 3 argumentos: posição inicial, comprimento e (opcionalmente) inserção (string)
- retorna a parte cortada
- modifica a string original
O problema é que o requisito 3D não pode ser atendido porque as strings são imutáveis (relacionadas: 1 , 2 ), encontrei o comentário mais dedicado aqui :
Em JavaScript, as strings são tipos de valores primitivos e não objetos ( especificação ). Na verdade, a partir de ES5, eles são um dos apenas 5 tipos de valor ao lado null, undefined, numbere boolean. As strings são atribuídas por valor e não por referência e são passadas como tal. Portanto, as strings não são apenas imutáveis, elas são um valor . Mudar a string "hello"para ser "world"é como decidir que a partir de agora o número 3 é o número 4 ... não faz sentido.
Portanto, com isso em consideração, pode-se esperar que a string.splicecoisa " " apenas:
- aceita até 2 argumentos: posição inicial, comprimento (a inserção não faz sentido, pois a string não é alterada)
- retorna a parte cortada
que é o que substrfaz; ou alternativamente,
- aceita até 3 argumentos: posição inicial, comprimento e (opcionalmente) inserção (string)
- retorna a string modificada (sem a parte cortada e com inserção)
que é o assunto da próxima seção.
Soluções
Se você se preocupa com a otimização, provavelmente deve usar a implementação de Mike:
String.prototype.splice = function(index, count, add) {
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
return this.slice(0, index) + (add || "") + this.slice(index + count);
}
No entanto, tratar o índice fora dos limites pode variar. Dependendo de suas necessidades, você pode desejar:
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
if (index >= this.length) {
index -= this.length;
if (index >= this.length)
index = this.length - 1;
}
ou mesmo
index = index % this.length;
if (index < 0)
index = this.length + index;
Se você não se preocupa com o desempenho, pode querer adaptar a sugestão de Kumar, que é mais direta:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
atuação
A diferença de desempenho aumenta drasticamente com o comprimento da corda. jsperf mostra que, para strings com o comprimento de 10, a última solução (divisão e junção) é duas vezes mais lenta do que a solução anterior (usando o slice), para strings de 100 letras é x5 e para strings de 1000 letras é x50, em Ops / segundo é:
10 letters 100 letters 1000 letters
slice implementation 1.25 M 2.00 M 1.91 M
split implementation 0.63 M 0.22 M 0.04 M
note que eu mudei o primeiro e o segundo argumento ao passar de 10 letras para 100 letras (ainda estou surpreso que o teste para 100 letras é mais rápido do que para 10 letras).
str.splitpode ser a função que você está procurando: google.com/#q=javascript+string+split