Veo un poco de código en soluciones de proyectos.

Pero hay un regular de la implementación en JavaScript?

InformationsquelleAutor leora | 2010-01-18

10 Comentarios

  1. 288

    Si tienes que escribir el código para Internet Explorer, asegúrese de elegir una aplicación, que utiliza la matriz de combinaciones. Concatenar cadenas con el + o += operador son extremadamente lentos en IE. Esto es especialmente cierto para IE6. En los navegadores modernos += es generalmente tan rápido como matriz de combinaciones.

    Cuando tengo que hacer un montón de concatenaciones de cadenas me suele llenar una matriz y no usar un generador de cadenas de clase:

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

    Tenga en cuenta que el push métodos acepta múltiples argumentos.

    • +1 para el lenguaje en favor de los objetos.
    • Y si estás generando en línea de salida, o a todos los miembros son literales, [foo(), "bar", "baz"].join(""); funciona, también.
    • Mientras que probablemente uno no puede esperar que dropbox enlaces para seguir trabajando por casi 3 años, me gustaría ser curioso acerca de la comparación, y si todavía se sostiene.
    • tu link esta roto 🙁
    • Me parece que esto es mucho más legible que la cadena de + cadena + cadena
    • Yo no sabía push puede aceptar múltiples argumentos. El azar de las cosas que aprende.
    • Tenga en cuenta que IE aquí significa IE 7 y versiones anteriores. En IE 8+ concatenación no es peor que los otros navegadores.

  2. 45

    Acabo de volver a revisar el rendimiento en http://jsperf.com/javascript-concat-vs-join/2.
    La prueba en casos de concatenar o unirse a el alfabeto de 1.000 veces.

    En los navegadores actuales (FF, Opera, IE11, Chrome), «concat» es aproximadamente de 4 a 10 veces más rápido que el de «unirse».

    En IE8, tanto el retorno sobre la igualdad de resultados.

    En IE7, «combinación» es alrededor de 100 veces más rápido por desgracia.

    • Gracias por este. Este debe ser golpeado en la respuesta de la lista. También es mucho más rápido en IE10 así (sé que no es un navegador moderno, pero lo menciono para cualquier potencial NMCI los desarrolladores de ver esto).
    • Yo creo que el examen es golpear una ruta de código en Chrome donde nunca haciendo el real concatenar debido a que la cadena nunca se lee. Incluso cuando obligando a que, sin embargo, la velocidad de ejecución es todavía considerablemente más rápido: jsperf.com/yet-another-string-concat-test/1
  3. 32

    No, no hay ningún soporte incorporado para la construcción de cadenas. Usted tiene que utilizar la concatenación lugar.

    Usted puede, por supuesto, hacer una matriz de diferentes partes de la cadena y, a continuación, llamar a join() en dicha matriz, pero luego depende de cómo la combinación es implementado en el intérprete de JavaScript que utiliza.

    Hice un experimento para comparar la velocidad de str1+str2 método de comparación array.push(str1, str2).join() método. El código fue 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));

    He probado en Internet Explorer 8 y Firefox 3.5.5, tanto en un Windows 7 de 64 bits.

    Al principio he probado en un número pequeño de iteraciones (algunos cientos, algunos miles de artículos). Los resultados eran impredecibles (a veces la concatenación de cadenas se llevó 0 milisegundos, a veces tardamos 16 milisegundos, lo mismo para la matriz de unirse).

    Cuando he aumentado el recuento de 50.000, los resultados fueron diferentes en los distintos navegadores de Internet el Explorador de la concatenación de cadenas fue más rápido (94 milisegundos) y unirse fue más lenta(125 milisegundos), mientras que en Firefox la matriz de combinación fue más rápido (113 milisegundos) que la cadena de unión (117 milisegundos).

    Entonces he aumentado el recuento de 500’000. Ahora el array.join() fue más lento que la concatenación de cadenas en ambos navegadores: la concatenación de cadenas se 937 ms en Internet Explorer, 1155 ms en Firefox, matriz de unirse a 1265 en Internet Explorer, y 1207 ms en Firefox.

    El máximo número de iteraciones que podría poner a prueba en Internet Explorer sin tener «el guión está tomando demasiado tiempo para ejecutar» era de 850.000. Luego a Internet el Explorador se 1593 para la concatenación de cadenas y 2046 de una matriz de unirse, y Firefox tuvo 2101 para la concatenación de cadenas y 2249 de una matriz de combinación.

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

    ACTUALIZACIÓN

    He realizado el test en Internet Explorer 6 (Windows XP). El proceso se detuvo para responder inmediatamente y nunca se terminó, si he probado el de 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 usted necesita para apoyar a Internet Explorer 6, elija array.join() que es mucho más rápido que la concatenación de cadenas.

    • join() es parte de ECMAScript y afaik cada intérprete de JavaScript implementa. ¿Por qué es «depende»?
    • él quiso decir CÓMO se implementó… si se implementa de una manera que, en un bucle, la cadena está continuamente anexa oposición a creado todos a la vez, el uso de unirse tendría sentido
    • Sí, era lo que yo quería decir realmente. Perdón por mi inglés 😉 he añadido los resultados de una comparación de lo rápido que funciona el método en dos de los navegadores. Usted puede ver, es diferente.
    • IE6, como siempre, es la excepción 🙂
    • gracias por el Excelente sugerencia 🙂
    • Las personas con IE6 está acostumbrada a tener todo muy lento, aunque. No creo que voy a echarle la culpa a usted.

  4. 7

    Que el código que se parece a la ruta que desea tomar con un par de cambios.

    Usted desea cambiar el método append a este aspecto. He cambiado a aceptar el número 0, y para hacerla volver this para que la cadena de su anexa.

    StringBuilder.prototype.append = function (value) {
        if (value || value === 0) {
            this.strings.push(value);
        }
        return this;
    }
    • Por qué sólo aceptar la no-NaN los números y las cadenas no vacías? Su método no aceptar null, false, cadenas vacías, undefined, o NaN.
    • +1 para el encadenamiento.
    • Prefiero mantener mi clase StringBuilder limpio por no aceptar cualquier cosa, pero válida cadenas y números. Es sólo una cuestión de preferencia personal.
  5. 5

    El ECMAScript 6 versión (también conocido como ECMAScript 2015) de JavaScript introducido los literales de cadena.

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

    Aviso de que las garrapatas, en lugar de las comillas simples, encerrar la cadena.

    • ¿Cómo esta la respuesta a la pregunta?
    • Mortensen, esta respuesta solo se da otra forma de construir una cadena. El cartel original no especifica qué tipo de cadena de la funcionalidad del generador estaba siendo buscado.
    • Esto no responde a la pregunta. En todos los.
  6. 4

    En C# se puede hacer algo como

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

    En JavaScript se podría hacer algo como

     var x = "hello {0}, your age is {1}";
     x = x.replace(/\{0\}/g, "John");
     x = x.replace(/\{1\}/g, 29);
    • Dudo mucho que ejecuta una expresión regular en lugar de una cadena de unión será más eficiente
    • Además, este es un terrible ejecución. Se va a romper si la cadena con la que {0} se sustituye contiene {1}.
    • la cadena no es una variable, una constante, para saber cuál es el contenido a priori.
    • Copiar y pegar todos de que a través de su código, es incluso peor idea.
    • Una camisa con $1 y $2 sustitución de la no captura de los grupos: x..replace(/([\s\s]*?)\{0\}([\s\s]*?)\{1\}/g, «$1Tom$225»)
    • Esto no responde a la pregunta. Una clase StringBuilder no es para la interpolación de cadenas.

  7. 1

    Para los interesados, aquí una alternativa a la invocación de la Matriz.unirse:

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

    El resultado, como era de esperar, es la cadena ‘foobar’. En Firefox, este enfoque supera el rendimiento de la Matriz.unirse, pero es superado por concatenación+. Desde La Cadena.concat requiere cada segmento de ser especificado como un argumento separado, la persona que llama está limitada por ningún argumento contar límite impuesto por la ejecución de motor de JavaScript. Echa un vistazo a la documentación de la Función.el prototipo.aplicar() para obtener más información.

    • Esto no funciona en Chrome, ya que «de la Cadena.concat» no está definido. En su lugar, puede utilizar «.concat.la aplicación(«, arrayOfStrings). Pero esto es todavía muy lento método.
  8. 0

    Cuando me encuentro haciendo un montón de concatenación de cadenas en JavaScript, que me pongo a buscar plantillas. Handlebars.js funciona bastante bien mantener el código HTML y JavaScript más legible. http://handlebarsjs.com

  9. 0

    He definido esta función:

    function format() {
            var args = arguments;
            if (args.length <= 1) { 
                return args;
            }
            var result = args[0];
            for (var i = 1; i < args.length; i++) {
                result = result.replace(new RegExp("\{" + (i - 1) + "\}", "g"), args[i]);
            }
            return result;
        }

    Y pueden ser llamados de c#:

     var text = format("hello {0}, your age is {1}.",  "John",  29);

    Resultado:

    hola Juan, su edad es de 29.

    • Me gusta…se ve como c#
    • Esta respuesta no tiene nada que ver con la pregunta.

Dejar respuesta

Please enter your comment!
Please enter your name here