Array
JavaScriptとの違いObject
はそれほど大きくありません。実際、主にフィールドArray
を追加しているように見えるため、 sとsの両方を数値配列として使用できます。length
Array
Object
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
だから私の質問は、人気のあるJavaScriptエンジン(V8、JavaScriptCore、SpiderMonkeyなど)では、これはどのように処理されますか?明らかに、配列が実際にキー値を持つハッシュマップとして格納されることは望ましくありません。データが実際の配列として格納されていることを合理的に確認するにはどうすればよいですか?
私が見る限り、エンジンがとることができるいくつかのアプローチがあります:
Array
Object
文字列キーを持つ連想配列として-とまったく同じ方法で実装されます。Array
は特殊なケースでありstd::vector
、数値キーを裏付ける-like配列と、必要に応じて異常なメモリ使用を防ぐための密度ヒューリスティックがあります。ar[100000000] = 0;
Array
はと同じObject
であり、すべてのオブジェクトは、配列を使用する方が理にかなっているかどうかを確認するためにヒューリスティックを取得します。- 私が考えもしなかった、めちゃくちゃ複雑な何か。
適切な配列型( cough WebGL型の配列cough )があれば、これは実際にはもっと簡単です。