いくつかのコードプロジェクトソリューション が表示されます。
しかし、JavaScriptには通常の実装がありますか?
Internet Explorer用のコードを記述する必要がある場合は、配列結合を使用する実装を選択したことを確認してください。 IEでは、+
または+=
演算子を使用して文字列を連結すると、非常に遅くなります。これは特にIE6に当てはまります。最近のブラウザでは、+=
は通常、配列の結合と同じくらい高速です。
多くの文字列の連結を行う必要がある場合、通常は配列を埋め、文字列ビルダークラスを使用しません。
var html = [];
html.Push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Push
メソッドは複数の引数を受け入れることに注意してください。
http://jsperf.com/javascript-concat-vs-join/2 のパフォーマンスを再確認しました。テストケースは、アルファベットを1,000回連結または結合します。
現在のブラウザ(FF、Opera、IE11、Chrome)では、「concat」は「join」よりも約4〜10倍高速です。
IE8では、どちらもほぼ同じ結果を返します。
IE7では、「結合」は残念ながら約100倍高速です。
いいえ、文字列を作成するための組み込みのサポートはありません。代わりに連結を使用する必要があります。
もちろん、文字列のさまざまな部分の配列を作成し、その配列でjoin()
を呼び出すこともできますが、使用するJavaScriptインタープリターでの結合の実装方法によって異なります。
str1+str2
メソッドとarray.Push(str1, str2).join()
メソッドの速度を比較する実験を行いました。コードはシンプルでした:
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));
Internet Explorer 8およびFirefox 3.5.5、両方ともWindows 7 x64でテストしました。
最初は、少数の反復(数百、数千の項目)でテストしました。結果は予測不能でした(配列の結合と同じように、文字列の連結に0ミリ秒、時には16ミリ秒かかりました)。
カウントを50,000に増やしたとき、結果はブラウザーによって異なりました-Internet Explorerでは文字列の連結が高速(94ミリ秒)で、結合は低速(125ミリ秒)でしたが、Firefoxでは配列の結合が高速(113ミリ秒)でしたストリング結合(117ミリ秒)。
その後、カウントを500'000に増やしました。両方のブラウザでarray.join()
は文字列連結より遅いでした。文字列連結はInternet Explorerで937ミリ秒、Firefoxで1155ミリ秒、Internet Explorerで配列結合1265、Firefoxで1207ミリ秒でした。
「スクリプトの実行に時間がかかりすぎる」ことなくInternet Explorerでテストできる最大反復回数は850,000です。 Internet Explorerは、文字列連結で1593、配列結合で2046、Firefoxでは文字列連結で2101、配列結合で2249でした。
結果-反復回数が少ない場合、array.join()
を使用してみてください。Firefoxの方が高速になる可能性があります。数が増えると、string1+string2
メソッドが高速になります。
Internet Explorer 6(Windows XP)でテストを実行しました。 100,000回以上の繰り返しでテストを試みた場合、プロセスはすぐに応答するために停止し、終了しませんでした。 40,000回の反復で結果は
Time (strings): 59175 ms
Time (arrays): 220 ms
つまり、Internet Explorer 6をサポートする必要がある場合は、array.join()
を選択します。これは、文字列の連結よりもはるかに高速です。
そのコードは、いくつかの変更を加えた場合のルートのように見えます。
Appendメソッドを次のように変更する必要があります。数字の0を受け入れ、this
を返すように変更して、追加を連鎖できるようにしました。
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.Push(value);
}
return this;
}
JavaScriptのECMAScript 6バージョン(別名ECMAScript 2015)が導入されました 文字列リテラル 。
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
単一引用符の代わりにバックティックが文字列を囲むことに注意してください。
C#では、次のようなことができます
String.Format("hello {0}, your age is {1}.", "John", 29)
JavaScriptでは、次のようなことができます
var x = "hello {0}, your age is {1}";
x = x.replace(/\{0\}/g, "John");
x = x.replace(/\{1\}/g, 29);
この関数を定義しました:
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;
}
また、c#のように呼び出すことができます。
var text = format("hello {0}, your age is {1}.", "John", 29);
結果:
こんにちはジョン、あなたの年齢は29です。
関心のある方のために、Array.joinを呼び出す代わりの方法を次に示します。
var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);
予想どおり、出力は文字列「foobar」です。 Firefoxでは、このアプローチはArray.joinよりも優れていますが、+連結によって性能が向上しています。 String.concatでは、各セグメントを個別の引数として指定する必要があるため、呼び出し元は、実行中のJavaScriptエンジンによって課せられる引数カウント制限によって制限されます。詳細については、 Function.prototype.apply()のドキュメント をご覧ください。
JavaScriptで多くの文字列連結を行っていることに気付いたとき、テンプレートを探し始めました。 Handlebars.jsは、HTMLとJavaScriptをより読みやすく保つために非常にうまく機能します。 http://handlebarsjs.com
sys.StringBuilder()
については、次の記事をご覧ください。