30

オブジェクトが Javascript エンジン (V8、Spidermonkey など) の内部でどのように実装されているのか疑問に思っていました。それらは本当に単なるハッシュテーブルですか? もしそうなら、彼らはどのように衝突を処理しますか?

4

3 に答える 3

17

まず第一に、答えはおそらく JS エンジンによって多少異なるでしょう。また、具体的にはプロパティ ストレージについて質問していると思います。明らかに、オブジェクトには他の状態もたくさんあります (プロトタイプ チェーン リンクは明白な状態です)。

Spidermonkey の場合、オブジェクトは基本的に (プロパティ名、プロパティに関する情報) のペアのリンク リストを持ちますが、プロパティが多すぎるまでは、リンク リストを保持していると思われます (実際には JS のプロパティの順序が重要であるため)。プロパティ名をリンクされたリストのエントリにマップする帯域外ハッシュテーブルを追加します。

ハッシュテーブルへの切り替えには他の理由もあるかもしれません。詳細は時間の経過とともに正確に修正されたわけではなく、将来変更される可能性があります.

リンクされたリストとハッシュテーブルは、実際にはオブジェクト間で共有されます。2 つのオブジェクトが同じプロパティ名と対応するプロパティ情報 (保存された値を持つプロパティの場合、値は含まれません) を持ち、プロパティが同じ順序で設定されている限り、それらはプロパティ リンク リストを共有できます。

実際のプロパティ値は、格納する必要がある場合、オブジェクト内の配列に格納されます (より正確には、2 つの配列。1 つはオブジェクトとインラインで割り当てられ、そのサイズはオブジェクトの作成時に固定され、もう 1 つは動的に割り当てられてサイズ変更されます)。後で追加されるプロパティの必要に応じて)。

于 2012-04-22T02:15:48.587 に答える