しかし、JavaScriptの定期的な実装はありますか?
しかし、JavaScriptの定期的な実装はありますか?
回答:
Internet Explorer用のコードを記述する必要がある場合は、配列結合を使用する実装を選択したことを確認してください。文字列を+
or +=
演算子で連結すると、IEでは非常に遅くなります。これは特にIE6に当てはまります。最近のブラウザで+=
は、通常、配列の結合と同じくらい高速です。
多くの文字列連結を行う必要がある場合、通常は配列を埋め、文字列ビルダークラスを使用しません。
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
push
メソッドは複数の引数を受け入れることに注意してください。
[foo(), "bar", "baz"].join("");
場合も機能します。
push
複数の引数を受け入れることができることを知りませんでした。ランダムに学ぶこと。
http://jsperf.com/javascript-concat-vs-join/2でパフォーマンスを再確認しました。テストケースはアルファベットを1,000回連結または結合します。
現在のブラウザ(FF、Opera、IE11、Chrome)では、「連結」は「結合」よりも約4〜10倍高速です。
IE8では、どちらもほぼ同じ結果を返します。
IE7では、 "join"は残念ながら約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));
Windows 7 x64上のInternet Explorer 8とFirefox 3.5.5でテストしました。
最初は、少数の反復(数百、数千項目)でテストしました。結果は予測できませんでした(文字列の連結に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()
は、文字列の連結よりも高速な方法を選択してください。
join()
ECMAScriptの一部であり、すべてのJavaScriptインタープリターがそれを実装しています。なぜ「依存する」のでしょうか?
このコードは、いくつかの変更を加えて、実行したいルートのように見えます。
追加メソッドを次のように変更する必要があります。数値0を受け入れるように変更し、それを返すthis
ようにして、アペンドをチェーンできるようにしました。
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
、false
空の文字列、、 undefined
、またはNaN
。
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);
{0}
置換後の文字列にが含まれていると壊れます{1}
。
興味のある方のために、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の()のドキュメント詳細については、を。
私はこの関数を定義しました:
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歳です。
JavaScriptで多くの文字列連結を実行していることに気付いたとき、私はテンプレートを探し始めます。Handlebars.jsは、HTMLとJavaScriptをより読みやすく維持して、非常にうまく機能します。http://handlebarsjs.com
方法についてsys.StringBuilder()
は、次の資料を試してみてください。