Parece haber mucha confusión que solo se abordó en los comentarios de elclanrs y raina77ow, así que permítanme publicar una respuesta aclaratoria.
Aclaración
De " string.splice" uno puede esperar que, como el de las matrices:
- acepta hasta 3 argumentos: posición inicial, longitud y (opcionalmente) inserción (cadena)
- devuelve la parte cortada
- modifica la cadena original
El problema es que el requisito de 3d no se puede cumplir porque las cadenas son inmutables (relacionado: 1 , 2 ), he encontrado el comentario más dedicado aquí :
En JavaScript, las cadenas son tipos de valores primitivos y no objetos ( especificación ). De hecho, a partir de ES5, que son uno de los únicos 5 tipos de valor junto con null, undefined, numbery boolean. Las cadenas se asignan por valor y no por referencia y se pasan como tales. Por lo tanto, las cadenas no solo son inmutables, son un valor . Cambiar la cadena "hello"a ser "world"es como decidir que a partir de ahora el número 3 es el número 4 ... no tiene sentido.
Entonces, con eso en cuenta, uno puede esperar que la string.splicecosa " " solo:
- acepta hasta 2 argumentos: posición inicial, longitud (la inserción no tiene sentido ya que la cadena no se cambia)
- devuelve la parte cortada
que es lo que substrhace; o alternativamente,
- acepta hasta 3 argumentos: posición inicial, longitud y (opcionalmente) inserción (cadena)
- devuelve la cadena modificada (sin la parte cortada y con inserción)
que es el tema de la siguiente sección.
Soluciones
Si le interesa optimizar, probablemente debería usar la implementación 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);
}
Sin embargo, el tratamiento del índice de fuera de límites puede variar. Según sus necesidades, es posible que desee:
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;
}
o incluso
index = index % this.length;
if (index < 0)
index = this.length + index;
Si no le importa el rendimiento, es posible que desee adaptar la sugerencia de Kumar, que es más sencilla:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Actuación
La diferencia de rendimiento aumenta drásticamente con la longitud de la cuerda. jsperf muestra que para cadenas con una longitud de 10, la última solución (dividir y unir) es dos veces más lenta que la solución anterior (usando slice), para cadenas de 100 letras es x5 y para cadenas de 1000 letras es x50, en Ops / sec es:
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
tenga en cuenta que cambié los argumentos 1er y 2d al pasar de 10 letras a 100 letras (aún me sorprende que la prueba de 100 letras sea más rápida que la de 10 letras).
str.splitpodría ser la función que está buscando: google.com/#q=javascript+string+split