230

いくつかのコード プロジェクト ソリューションが表示されます。

しかし、JavaScript には通常の実装がありますか?

4

12 に答える 12

365

Internet Explorer 用のコードを作成する必要がある場合は、配列結合を使用する実装を選択したことを確認してください。+or演算子を使用した文字列の連結は+=、IE では非常に遅くなります。これは特に IE6 に当てはまります。最新のブラウザー+=では、通常、配列の結合と同じくらい高速です。

多くの文字列連結を行う必要がある場合、通常は配列に入力し、文字列ビルダー クラスは使用しません。

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

pushメソッドは複数の引数を受け入れることに注意してください。

于 2010-01-18T16:42:41.563 に答える
66

http://jsperf.com/javascript-concat-vs-join/2でパフォーマンスを再確認しました。テスト ケースは、アルファベットを 1,000 回連結または結合します。

現在のブラウザ (FF、Opera、IE11、Chrome) では、"concat" は "join" よりも約 4 ~ 10 倍高速です。

IE8 では、どちらもほぼ同じ結果を返します。

IE7 では、残念ながら「結合」は約 100 倍高速です。

于 2014-11-25T12:08:33.287 に答える
42

いいえ、文字列を構築するための組み込みサポートはありません。代わりに連結を使用する必要があります。

もちろん、文字列のさまざまな部分の配列を作成し、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()は、文字列連結よりも高速な方を選択してください。

于 2010-01-18T16:31:52.570 に答える
10

このコードは、いくつかの変更を加えると、目的のルートのように見えます。

append メソッドを次のように変更します。番号 0 を受け入れるように変更しthis、追加をチェーンできるように戻すようにしました。

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}
于 2010-01-18T16:43:20.440 に答える
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() のドキュメントを参照してください。

于 2014-03-31T22:21:21.430 に答える
1

Typescript の StringBuilder クラスの簡単な例を次に示します。

export class StringBuilder {
  private _lines: string[] = [];

  write(line: string = ""): void {
    this._lines.push(line);
  }

  writeln(line: string = ""): void {
    this._lines.push(line);
    this._lines.push("\n");
  }

  toString(): string {
    return this._lines.join("");
  }
}

次のように使用できます。

const sb = new StringBuilder();
sb.write("Hello World");
sb.writeln("!");
console.log(sb.toString());
于 2022-01-06T00:27:58.753 に答える