6

したがって、JavaScript に連想配列があるとします。

var hashTable = {};

hashTable["red"] = "ff0000";
hashTable["green"] = "00ff00";
hashTable["blue"] = "0000ff";

次のような値を取得するとどうなりますか。

var blue = hashTable["blue"];

他の言語のハッシュテーブルと同様のパフォーマンスですか? つまり、プロパティの場所を特定するために使用される実際のハッシュ関数がありますか、それとも次のようなループ検索がありますか?

for (var color in hashTable) {
    if (hashTable.hasOwnProperty(color)) {
        //look for matching key
    }
}

実装はブラウザーごとに異なりますか? この特定のトピックに関連するものは見つかりませんでした。ありがとう。

4

3 に答える 3

4

さまざまな JavaScript エンジンで異なる方法で実装されており、最近では、オブジェクトは「辞書のような」データ構造に支えられていないようです。

https://developers.google.com/v8/designから:

JavaScript は動的なプログラミング言語です。プロパティは、その場でオブジェクトに追加したり、オブジェクトから削除したりできます。これは、オブジェクトのプロパティが変更される可能性が高いことを意味します。ほとんどの JavaScript エンジンは、辞書のようなデータ構造をオブジェクト プロパティのストレージとして使用します。各プロパティ アクセスには、メモリ内のプロパティの場所を解決するための動的ルックアップが必要です。このアプローチにより、JavaScript でのプロパティへのアクセスは、通常、Java や Smalltalk などのプログラミング言語でのインスタンス変数へのアクセスよりもはるかに遅くなります。これらの言語では、インスタンス変数は、オブジェクトのクラスによって定義された固定オブジェクト レイアウトにより、コンパイラによって決定された固定オフセットに配置されます。アクセスは単にメモリのロードまたはストアの問題であり、多くの場合、1 つの命令のみが必要です。

JavaScript プロパティへのアクセスに必要な時間を短縮するために、V8 はプロパティへのアクセスに動的ルックアップを使用しません。代わりに、V8 はバックグラウンドで隠しクラスを動的に作成します。この基本的な考え方は新しいものではありません - プロトタイプベースのプログラミング言語である Self used maps は、似たようなことを行うためにマップを使用しました。V8 では、新しいプロパティが追加されると、オブジェクトの隠しクラスが変更されます。

Firefox の IonMonkey も同様のことを行います。Mozilla の開発者へのインタビューから ( http://www.infoq.com/news/2011/05/ionmonkey ):

動的言語にはおそらく固有の最適化の利点はありませんが、静的言語にはない興味深い最適化があります。たとえば、JavaScript を作成している場合、オブジェクトは、プロパティ名を値にマッピングするハッシュ テーブルとしてユーザーに表示されます。実際にそのように実装すると、遅くなり、多くのメモリを使用します。

優れたエンジンは、同じように見えるオブジェクトを内部的にグループ化して、Java に似た内部クラスをそれらから抽出することができます。その後、JIT はオブジェクトを実際の型を持つものとして扱い、コストのかかるプロパティ ルックアップを回避する超高速コードを生成できます。

于 2013-05-29T23:36:43.453 に答える
3

Javascript には、実際には「連想配列」がありません。名前付きプロパティと、オブジェクトが他のオブジェクトからプロパティを継承できるようにするプロトタイプを持つことができる JavaScriptオブジェクト{}を返します。

そのため、プロパティはプロトタイプ オブジェクトから継承される可能性があり、特定のプロパティを名前で検索するには、プロトタイプ ツリーをたどって検索する必要があるため、パフォーマンスはハッシュ テーブルのようにはなりません。

このブログ投稿からも洞察が得られる場合があります。

http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/

于 2013-05-29T23:28:48.530 に答える
0

この用語associative arrayは、その使用法を説明しています。これは、あるものを別のものに関連付けるために使用されるキーと値のコンテナーです。ただし、この用語hash tableはその実装を説明しています。ハッシュ関数を使用して、基になる配列内の要素を見つけます。associative array赤黒木またはその他のデータ構造を使用するが、ハッシュ テーブルを使用しない実装が存在する可能性があります。

于 2013-05-29T23:45:26.423 に答える