Vedo alcune soluzioni per progetti di codice .
Ma c'è un'implementazione regolare in JavaScript?
Vedo alcune soluzioni per progetti di codice .
Ma c'è un'implementazione regolare in JavaScript?
Risposte:
Se devi scrivere codice per Internet Explorer, assicurati di aver scelto un'implementazione, che utilizza i join di array. La concatenazione di stringhe con l' operatore +
o +=
è estremamente lenta su IE. Ciò è particolarmente vero per IE6. Nei browser moderni di +=
solito è veloce quanto i join di array.
Quando devo fare molte concatenazioni di stringhe di solito riempio un array e non uso una classe builder:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Si noti che i push
metodi accettano più argomenti.
[foo(), "bar", "baz"].join("");
funziona anche.
push
potesse accettare più argomenti. Le cose casuali che impari.
Ho appena ricontrollato le prestazioni su http://jsperf.com/javascript-concat-vs-join/2 . I casi di test concatenano o uniscono l'alfabeto 1.000 volte.
Negli attuali browser (FF, Opera, IE11, Chrome), "concat" è circa 4-10 volte più veloce di "join".
In IE8, entrambi restituiscono risultati uguali.
In IE7, "join" è purtroppo circa 100 volte più veloce.
No, non esiste un supporto integrato per la creazione di stringhe. Devi invece usare la concatenazione.
Naturalmente, puoi creare un array di diverse parti della tua stringa e quindi chiamare join()
quell'array, ma dipende quindi da come viene implementato il join nell'interprete JavaScript che stai utilizzando.
Ho fatto un esperimento per confrontare la velocità del str1+str2
metodo rispetto al array.push(str1, str2).join()
metodo. Il codice era semplice:
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));
L'ho provato in Internet Explorer 8 e Firefox 3.5.5, entrambi su Windows 7 x64.
All'inizio ho testato un numero limitato di iterazioni (alcune centinaia, alcune migliaia di elementi). I risultati erano imprevedibili (a volte la concatenazione di stringhe impiegava 0 millisecondi, a volte impiegava 16 millisecondi, lo stesso per l'unione di array).
Quando ho aumentato il conteggio a 50.000, i risultati erano diversi nei diversi browser: in Internet Explorer la concatenazione di stringhe era più veloce (94 millisecondi) e l'unione era più lenta (125 millisecondi), mentre in Firefox l'unione dell'array era più veloce (113 millisecondi) rispetto a unione di stringhe (117 millisecondi).
Quindi ho aumentato il conteggio a 500'000. Ora array.join()
era più lento della concatenazione di stringhe in entrambi i browser: la concatenazione di stringhe era 937 ms in Internet Explorer, 1155 ms in Firefox, array array 1265 in Internet Explorer e 1207 ms in Firefox.
Il numero massimo di iterazioni che ho potuto testare in Internet Explorer senza che "l'esecuzione dello script richieda troppo tempo" era 850.000. Quindi Internet Explorer era il 1593 per la concatenazione di stringhe e il 2046 per l'unione di array e Firefox aveva 2101 per la concatenazione di stringhe e 2249 per l'unione di array.
Risultati : se il numero di iterazioni è ridotto, puoi provare a utilizzare array.join()
, poiché potrebbe essere più veloce in Firefox. Quando il numero aumenta, il string1+string2
metodo è più veloce.
Ho eseguito il test su Internet Explorer 6 (Windows XP). Il processo ha smesso di rispondere immediatamente e non è mai terminato, se ho provato il test su oltre 100.000 iterazioni. Su 40.000 iterazioni i risultati furono
Time (strings): 59175 ms
Time (arrays): 220 ms
Ciò significa che, se è necessario supportare Internet Explorer 6, scegliere array.join()
quale è molto più veloce della concatenazione di stringhe.
join()
fa parte di ECMAScript e afaik lo implementa ogni interprete JavaScript. Perché dovrebbe "dipendere"?
Quel codice sembra il percorso che vuoi prendere con alcune modifiche.
Ti consigliamo di cambiare il metodo append in modo che assomigli a questo. L'ho modificato per accettare il numero 0 e per farlo tornare in this
modo da poter concatenare i tuoi allegati.
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
stringhe vuote undefined
o NaN
.
La versione ECMAScript 6 (aka ECMAScript 2015) di JavaScript ha introdotto valori letterali stringa .
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
Si noti che i segni di spunta, anziché le virgolette singole, racchiudono la stringa.
In C # puoi fare qualcosa del genere
String.Format("hello {0}, your age is {1}.", "John", 29)
In JavaScript potresti fare qualcosa del genere
var x = "hello {0}, your age is {1}";
x = x.replace(/\{0\}/g, "John");
x = x.replace(/\{1\}/g, 29);
{0}
viene sostituita contiene {1}
.
Per coloro che sono interessati, ecco un'alternativa all'invocazione di Array.join:
var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);
L'output, come previsto, è la stringa "foobar". In Firefox, questo approccio supera Array.join ma è sovraperformato da + concatenazione. Poiché String.concat richiede che ogni segmento sia specificato come argomento separato, il chiamante è limitato da qualsiasi limite di conteggio degli argomenti imposto dal motore JavaScript in esecuzione. Dai un'occhiata alla documentazione di Function.prototype.apply () per maggiori informazioni.
Ho definito questa funzione:
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;
}
E può essere chiamato come c #:
var text = format("hello {0}, your age is {1}.", "John", 29);
Risultato:
ciao John, hai 29 anni.
Quando mi ritrovo a fare molta concatenazione di stringhe in JavaScript, inizio a cercare il modello. Handlebars.js funziona abbastanza bene mantenendo HTML e JavaScript più leggibili. http://handlebarsjs.com
Che ne dici di sys.StringBuilder()
provare il seguente articolo.