[解決済み】JavaScriptの文字列は不変ですか?JavaScriptで「文字列ビルダー」は必要ですか?
質問
javascriptはimmutableとmutableのどちらの文字列を使用しますか?文字列ビルダーは必要ですか?
どのように解決するのですか?
イミュータブル(不変)です。のような文字列の中の文字を変更することはできません。
var myString = "abbdef"; myString[2] = 'c'
. のような文字列操作のメソッドは
trim
,
slice
は新しい文字列を返します。
同じように、同じ文字列への参照が2つある場合、一方を変更しても他方には影響しません。
let a = b = "hello";
a = a + " world";
// b is not affected
しかし、Ashが回答で言っていたこと(連結にはArray.joinを使うのが速い)をいつも聞いていたので、文字列を連結するさまざまな方法をテストして、最も速い方法をStringBuilderに抽象化したいと思いました。これが本当かどうか、いくつかのテストを書いてみました(本当ではありません!)。
これが一番早いと思っていたのですが、メソッドコールを追加すると遅くなるのではとずっと考えていました...。
function StringBuilder() {
this._array = [];
this._index = 0;
}
StringBuilder.prototype.append = function (str) {
this._array[this._index] = str;
this._index++;
}
StringBuilder.prototype.toString = function () {
return this._array.join('');
}
以下はパフォーマンスのスピードテストです。この3つは、いずれも
"Hello diggity dog"
を10万回繰り返すと、空の文字列になります。
3種類のテストを作成しました
-
使用方法
Array.push
とArray.join
-
Array インデックスの使用により
Array.push
を使用し、その後Array.join
- 文字列の連結
次に、同じ3つのテストを抽象化して作成し
StringBuilderConcat
,
StringBuilderArrayPush
と
StringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5
ぜひ、このサイトでテストを行い、良いサンプルを得てください。なお、小さなバグを修正したため、テスト用のデータが消去されてしまいましたが、十分なパフォーマンスデータが揃ったら、テーブルを更新します。次のサイトへ
http://jsperf.com/string-concat-without-sringbuilder/5
をクリックすると、古いデータ表が表示されます。
以下は、リンクを辿りたくない方のための数字(Ma5rch 2018年最新版)です。各テストでの数値は、1000演算/秒での数値です( 高いほど良い )
調査結果
-
現在、すべての常用ブラウザは、文字列の連結をうまく処理することができます。
Array.join
IE 11のみ有効 -
全体ではOperaが最も速く、Array.joinの4倍の速さ
-
Firefoxは2位で
Array.join
は、FFではわずかに遅いだけですが、Chromeではかなり遅く(3倍)なります。 -
Chromeは3位ですが、文字列の連結はArray.joinより3倍速いです。
-
StringBuilderを作成することは、パフォーマンスにあまり影響を与えないようです。
他の誰かがこれを役に立つと思うことを願っています。
異なるテストケース
RoyTinker が私のテストに欠陥があると考えたので、同じ文字列を連結して大きな文字列を作るのではなく、反復するたびに異なる文字を使う新しいケースを作りました。文字列の連結はまだ速いか、同じくらい速いようでした。では、これらのテストを実行してみましょう。
皆さんも他のテスト方法をどんどん考えてみてください。また、別のテストケースへの新しいリンクも以下に自由に追加してください。
関連
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで変数が文字列かどうかをチェックする
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】 Uncaught Reference Error: stLight is not defined (in Chrome only)
-
[解決済み] JavaScriptで複数行の文字列を作成する
-
[解決済み】string.charAt(x)かstring[x]か?]
-
[解決済み】JavaScriptのプロミス - reject vs. throw