Aquí hay muchas respuestas, y todas se basan en dos métodos:
- MÉTODO1: divide la cadena usando dos subcadenas y rellena el carácter entre ellas
- MÉTODO2: convierta la cadena en una matriz de caracteres, reemplace un miembro de la matriz y únase a él
Personalmente, usaría estos dos métodos en diferentes casos. Dejame explicar.
@FabioPhms: Su método fue el que usé inicialmente y tenía miedo de que sea malo en una cadena con muchos caracteres. Sin embargo, la pregunta es ¿qué hay muchos personajes? Lo probé en 10 párrafos "lorem ipsum" y me llevó unos milisegundos. Luego lo probé en una cadena 10 veces más grande, realmente no había gran diferencia. Hm.
@vsync, @Cory Mawhorter: sus comentarios no son ambiguos; sin embargo, de nuevo, ¿qué es una cadena grande? Estoy de acuerdo en que para 32 ... 100kb el rendimiento debería ser mejor y uno debería usar la variante de subcadena para esta operación de reemplazo de caracteres.
Pero, ¿qué sucederá si tengo que hacer bastantes reemplazos?
Necesitaba realizar mis propias pruebas para probar qué es más rápido en ese caso. Digamos que tenemos un algoritmo que manipulará una cadena relativamente corta que consta de 1000 caracteres. Esperamos que en promedio cada carácter en esa cadena sea reemplazado ~ 100 veces. Entonces, el código para probar algo como esto es:
var str = "... {A LARGE STRING HERE} ...";
for(var i=0; i<100000; i++)
{
var n = '' + Math.floor(Math.random() * 10);
var p = Math.floor(Math.random() * 1000);
// replace character *n* on position *p*
}
Creé un violín para esto, y está aquí . Hay dos pruebas, TEST1 (subcadena) y TEST2 (conversión de matriz).
Resultados:
- PRUEBA1: 195ms
- PRUEBA2: 6 ms
¡Parece que la conversión de matriz supera a la subcadena en 2 órdenes de magnitud! Entonces, ¿qué demonios pasó aquí?
Lo que sucede en realidad es que todas las operaciones en TEST2 se realizan en la matriz misma, utilizando expresiones de asignación como strarr2[p] = n
. La asignación es realmente rápida en comparación con la subcadena en una cadena grande, y está claro que va a ganar.
Entonces, se trata de elegir la herramienta adecuada para el trabajo. De nuevo.
str[0] = 'x'
no parece arrojar ningún error, ¡pero no tiene el efecto deseado!