javascript stringbuilder

¿JavaScript tiene una clase incorporada de stringbuilder?



(9)

Veo algunas soluciones de proyectos de código .

Pero, ¿hay una implementación regular en JavaScript?



Acabo de volver a comprobar el rendimiento en http://jsperf.com/javascript-concat-vs-join/2 . Los casos de prueba concatenan o unen el alfabeto 1,000 veces.

En los navegadores actuales (FF, Opera, IE11, Chrome), "concat" es aproximadamente 4-10 veces más rápido que "join".

En IE8, ambos devuelven resultados casi iguales.

En IE7, "unirse" desafortunadamente es 100 veces más rápido.


Cuando me encuentro haciendo una gran cantidad de concatenación de cadenas en JavaScript, empiezo a buscar plantillas. Handlebars.js funciona bastante bien manteniendo el HTML y JavaScript más legibles. http://handlebarsjs.com


En C # puedes hacer algo como

String.Format("hello {0}, your age is {1}.", "John", 29)

En JavaScript puedes hacer algo como

var x = "hello {0}, your age is {1}"; x = x.replace(//{0/}/g, "John"); x = x.replace(//{1/}/g, 29);


Ese código se parece a la ruta que desea tomar con algunos cambios.

Querrá cambiar el método de agregar para que se vea así. Lo cambié para aceptar el número 0 y para que lo devuelva, de modo que puedas encadenar tus enlaces.

StringBuilder.prototype.append = function (value) { if (value || value === 0) { this.strings.push(value); } return this; }


La versión ECMAScript 6 (también conocida como ECMAScript 2015) de JavaScript introdujo literales de cadenas .

var classType = "stringbuilder"; var q = `Does JavaScript have a built-in ${classType} class?`;

Tenga en cuenta que las marcas de retroceso, en lugar de comillas simples, encierran la cadena.


No, no hay soporte integrado para construir cadenas. Tienes que usar la concatenación en su lugar.

Por supuesto, puede hacer una matriz de diferentes partes de su cadena y luego llamar a join() en esa matriz, pero luego depende de cómo se implemente la unión en el intérprete de JavaScript que está utilizando.

Hice un experimento para comparar la velocidad del método str1+str2 método array.push(str1, str2).join() . El código era simple:

var iIterations =800000; var d1 = (new Date()).valueOf(); str1 = ""; for (var i = 0; i<iIterations; i++) str1 = str1 + Math.random().toString(); var d2 = (new Date()).valueOf(); log("Time (strings): " + (d2-d1)); var d3 = (new Date()).valueOf(); arr1 = []; for (var i = 0; i<iIterations; i++) arr1.push(Math.random().toString()); var str2 = arr1.join(""); var d4 = (new Date()).valueOf(); log("Time (arrays): " + (d4-d3));

Lo probé en Internet Explorer 8 y Firefox 3.5.5, ambos en un Windows 7 x64.

Al principio probé en pequeñas cantidades de iteraciones (algunos cientos, algunos miles de elementos). Los resultados fueron impredecibles (a veces la concatenación de cadenas tardaba 0 milisegundos, a veces demoraba 16 milisegundos, lo mismo para la unión de arreglos).

Cuando incrementé la cuenta a 50,000, los resultados fueron diferentes en diferentes navegadores: en Internet Explorer la concatenación de cadenas fue más rápida (94 milisegundos) y la unión fue más lenta (125 milisegundos), mientras que en Firefox la combinación de arreglos fue más rápida (113 milisegundos) unión de cuerda (117 milisegundos).

Luego aumenté la cuenta a 500,000. Ahora el array.join() era más lento que la concatenación de cadenas en ambos navegadores: la concatenación de cadenas era de 937 ms en Internet Explorer, de 1155 ms en Firefox, de una matriz de 1265 en Internet Explorer y de 1207 ms en Firefox.

El recuento máximo de iteraciones que pude probar en Internet Explorer sin tener "el script tarda demasiado en ejecutarse" fue de 850,000. Luego Internet Explorer fue 1593 para la concatenación de cadenas y 2046 para la combinación de arreglos, y Firefox tenía 2101 para la concatenación de cadenas y 2249 para la combinación de arreglos.

Resultados : si el número de iteraciones es pequeño, puede intentar usar array.join() , ya que podría ser más rápido en Firefox. Cuando el número aumenta, el método string1+string2 es más rápido.

ACTUALIZAR

Realicé la prueba en Internet Explorer 6 (Windows XP). El proceso se detuvo para responder de inmediato y nunca finalizó, si probé la prueba en más de 100.000 iteraciones. En 40,000 iteraciones los resultados fueron

Time (strings): 59175 ms Time (arrays): 220 ms

Esto significa que, si necesita admitir Internet Explorer 6, elija array.join() que es mucho más rápido que la concatenación de cadenas.


Para los interesados, aquí hay una alternativa para invocar Array.join:

var arrayOfStrings = [''foo'', ''bar'']; var result = String.concat.apply(null, arrayOfStrings); console.log(result);

La salida, como se esperaba, es la cadena ''foobar''. En Firefox, este enfoque supera a Array.join, pero se ve superado por + concatenación. Dado que String.concat requiere que cada segmento se especifique como un argumento separado, la persona que llama está limitada por cualquier límite de recuento de argumentos impuesto por el motor de ejecución de JavaScript. Eche un vistazo a la documentación de Function.prototype.apply () para más información.


Si tiene que escribir código para Internet Explorer, asegúrese de elegir una implementación, que utiliza combinaciones de matrices. Las cadenas de concatenación con el operador + o += son extremadamente lentas en IE. Esto es especialmente cierto para IE6. En los navegadores modernos += suele ser tan rápido como se une a la matriz.

Cuando tengo que hacer muchas concatenaciones de cadenas, suelo llenar una matriz y no uso una clase de generador de cadenas:

var html = []; html.push( "<html>", "<body>", "bla bla bla", "</body>", "</html>" ); return html.join("");

Tenga en cuenta que los métodos push aceptan múltiples argumentos.