[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
質問
引用元 MDN
<ブロッククオート文字列リテラル(二重引用符または一重引用符で示される)および文字列 文字列リテラル(二重引用符で囲まれた文字列)、およびコンストラクタ以外のコンテキストで(つまり はプリミティブ文字列です。JavaScript は自動的に は自動的にプリミティブを String オブジェクトに変換します。 そのため、プリミティブな文字列に対してStringオブジェクトのメソッドを使うことができます。そのため メソッドがプリミティブな文字列に対して呼び出されたり、プロパティの検索が行われるような場面では が発生する場合、JavaScript は自動的に文字列プリミティブをラップして メソッドを呼び出したり、プロパティを参照したりします。
で、文字列プリミティブに対する操作(メソッド呼び出し)は、文字列オブジェクトに対する操作よりも遅くなるはずだと(論理的に)考えていました。なぜなら、文字列プリミティブはすべて
method
が適用される前に文字列Objectに変換されるからです。
しかし、この テストケース では、結果は逆になっています。その コードブロック-1 よりも速く実行されます。 コードブロック-2 の方が高速に動作します。
コードブロック-1 :
var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
コードブロック-2 :
var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
結果はブラウザによって異なりますが コードブロック-1 は常に高速です。どなたかこれを説明していただけませんか? コードブロック-1 よりも速いのか。 コードブロック-2 .
どのように解決するのですか?
JavaScriptには、プリミティブとオブジェクトという2つの主要な型カテゴリがあります。
var s = 'test';
var ss = new String('test');
シングルクォート/ダブルクォートのパターンは、機能的には同じです。それはさておき、あなたが名付けようとしている動作はオートボックスと呼ばれるものです。つまり、実際に起こることは、プリミティブはラッパー型のメソッドが呼び出されたときに、そのラッパー型に変換される、ということです。簡単に言うと
var s = 'test';
プリミティブなデータ型です。メソッドを持たず、生データのメモリ参照へのポインタに過ぎず、ランダムアクセスの速度がはるかに速いのはこのためです。
では、次のようにするとどうなるでしょうか。
s.charAt(i)
のようになるのでしょうか?
では
s
のインスタンスではないので
String
のインスタンスではない場合、JavaScript は自動ボックス化されます。
s
を持ちますが、これは
typeof string
をラッパーの型に変換します。
String
を持つ
typeof object
より正確には
s.valueOf(s).prototype.toString.call = [object String]
.
オートボックスの動作は
s
を必要に応じてラッパー型にキャストしますが、より単純なデータ型を扱っているため、標準的な操作は信じられないほど高速です。しかし、オートボクシングと
Object.prototype.valueOf
は異なる効果を持ちます。
自動ボックス化を強制したい場合、あるいはプリミティブをラッパーの型にキャストしたい場合は
Object.prototype.valueOf
を使うことができますが、動作は異なります。様々なテストシナリオに基づき、自動ボックス化は、変数のプリミティブな性質を変えることなく、「必要な」メソッドを適用するだけです。これが、より良い速度を得る理由です。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] selectタグのngModelの変更を検出する方法(Angular 2)?