javacript Array
とObject
の違いはあまり大きくありません。javascript配列は実際に配列として実装されていますか?
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
sおよびObject
の両方を使用することができますので、length
フィールドを追加し、主Array
ようですなど)、これはどのように処理されますか?明らかに、私たちの配列が実際にキー値を持つハッシュマップとして格納されることは望ましくありません!私たちのデータが実際の配列として保存されることを合理的に確かめるにはどうすればいいですか?
は限りいくつかのアプローチがあり、私が見ることができるようにエンジンがかかることがあります:
Array
はObject
とまったく同じように実装されている - 文字列のキーを持つ連想配列として。Array
は
Array
をすれば非常識なメモリの使用を防止するためのいくつかの密度ヒューリスティックで、特殊なケースであり、すべてのオブジェクトは、ヒューリスティックへの取得します配列を使用する方が理にかなっているかどうかを確認してください。- 私が考えていないような不思議そうな複雑さがあります。適切な配列型(咳 WebGLの型付けされた配列咳)があった場合
Object
と同じ数字キーをバックアップ
std::vector
様配列、およびあなたが
ar[100000000] = 0;
本当にこれは簡単であろう。
[記事](http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics)は少し古く、実装について明示的に説明していません。しかし、パフォーマンスの詳細な測定を行い、実装の可能性を推測します。 –
配列は 'length'プロパティが設定された_just_マップではありません。そうであった場合、シフトまたはシフトしないとインデックス作成が中断される(すなわち、配列から値をシフトし、1から始まらずにインデックス0から開始します。だから少なくとももう少し進んでいます。 (もちろんこれは実装に関しては何も言わない) – Flambino
なぜ 'r [0] == ob [0] == ar [" 0 "] == ob [" 0 "] == arであると思いますか? bar == ob.bar'本当ですか? '' a '==' a '==' a''は '' false''と評価される '' true == 'a''を評価するため、falseです。 –