¿Cómo realizo cambios de manera eficiente en una cadena en Javascript sin crear una nueva cadena cada vez que hago un cambio? El código adjunto ilustra esto, ya que cada operación "resultado +=" generará una nueva cadena.
La idea de usar un Unit8Array como área de trabajo parece fallar porque la conversión a una cadena es igual de ineficiente.
; Use mask to change characters in string to a ; '-' if mask dictates that. function maskOutput(input, mask) { let result = ''; for (let i=0; i < input.length; i++){ if (mask.charAt(i) === 'X') { result += '-'; } else { result += input.charAt(i); } } return result; }Lo primero que haría es verificar si las cadenas temporales realmente estaban causando un problema para mi página/aplicación, porque los motores de JavaScript son extremadamente buenos para optimizar problemas comunes como muchas cadenas temporales, especialmente en casos como su maskOutput donde la cadena es el resultado de la concatenación de cadenas. (V8, el motor en Chrome y en otros lugares, lo hace cuando es necesario al combinar cadenas parciales en una lista enlazada). Parece poco probable que la concatenación de cadenas en su función maskOutput sea un cuello de botella para su página/aplicación. Solía ser una práctica bastante estándar que verías código construyendo una cadena grande usando una matriz y luego .join("") al final, porque era más rápido alrededor de 2009, pero los motores de JavaScript han avanzado mucho desde entonces entonces y recuerdo que se volvió más rápido usar += en una cadena hace varios años.
Si hubiera algún caso de uso (presión de la memoria, lo que sea) en el que las cadenas temporales fueran un problema, podría usar una matriz simple¹ de caracteres individuales, convirtiendo una vez (de cadena a matriz) al principio si es necesario (no en su caso) y al final (de matriz a cadena). Pero para una cadena corta como las que imagino que maneja maskOutput , como usted dice, la sobrecarga no valdría la pena.
Pero solo para completar:
function maskOutput(input, mask) { const len = input.length; let result = Array(len); // Some engines actually do optimize this for (let i = 0; i < len; i++) { if (mask[i] === 'X') { // No need for a method call result[i] = "-"; } else { result[i] = input[i]; } } return result.join(""); } ¹ Uint8Array sería una mala elección, porque:
Uint16Array sería más apropiado.Uint8Array / Uint16Array requiere convertirlo del tipo de número de JavaScript a un entero sin signo de 8 bits/16 bits (y lo contrario en la lectura), que es realmente barato pero no es gratis. Y presumiblemente tendría que usar charCodeAt para obtener el valor para almacenar.