2012-02-10 12 views
18

javacript ArrayObjectの違いはあまり大きくありません。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ようですなど)、これはどのように処理されますか?明らかに、私たちの配列が実際にキー値を持つハッシュマップとして格納されることは望ましくありません!私たちのデータが実際の配列として保存されることを合理的に確かめるにはどうすればいいですか?

は限りいくつかのアプローチがあり、私が見ることができるようにエンジンがかかることがあります:

  1. ArrayObjectとまったく同じように実装されている - 文字列のキーを持つ連想配列として。
  2. Array
  3. Objectと同じ数字キーをバックアップ std::vector様配列、およびあなたが ar[100000000] = 0;
  4. Arrayをすれば非常識なメモリの使用を防止するためのいくつかの密度ヒューリスティックで、特殊なケースであり、すべてのオブジェクトは、ヒューリスティックへの取得します配列を使用する方が理にかなっているかどうかを確認してください。
  5. 私が考えていないような不思議そうな複雑さがあります。適切な配列型( WebGLの型付けされた配列)があった場合

本当にこれは簡単であろう。

+2

[記事](http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics)は少し古く、実装について明示的に説明していません。しかし、パフォーマンスの詳細な測定を行い、実装の可能性を推測します。 –

+2

配列は 'length'プロパティが設定された_just_マップではありません。そうであった場合、シフトまたはシフトしないとインデックス作成が中断される(すなわち、配列から値をシフトし、1から始まらずにインデックス0から開始します。だから少なくとももう少し進んでいます。 (もちろんこれは実装に関しては何も言わない) – Flambino

+1

なぜ 'r [0] == ob [0] == ar [" 0 "] == ob [" 0 "] == arであると思いますか? bar == ob.bar'本当ですか? '' a '==' a '==' a''は '' false''と評価される '' true == 'a''を評価するため、falseです。 –

答えて

12

SpiderMonkeyでは、配列は基本的にjsvalsのC配列として実装されています。これらは「密集配列」と呼ばれます。しかし、配列に似ていないものをオブジェクトのように扱うようにし始めると、その実装はオブジェクトに非常に似ているものに変更されます。

ストーリーのモラル:配列が必要な場合は、配列を使用します。オブジェクトが必要な場合は、オブジェクトを使用します。

ああ、jsvalは、64ビットのCタイプで可能な任意のJavaScript値を表すことのできる種類のバリエーションです。

6

V8とCarakan(おそらくChakra)では、名前が配列インデックス(ES5で定義されている)であるプロパティを持つすべての(非ホスト)オブジェクト(配列でもないオブジェクトでも)は、密な配列(ある値のラッパーを含むC配列)または疎な配列(バイナリ検索ツリーとして実装される)のいずれかです。

統一されたオブジェクト表現は、列挙順序に影響を与えることを示しています。オブジェクトの場合、SpiderMonkeyとSquirrelFishは両方ともすべてのプロパティを挿入順に指定します。配列では、一般的に(少なくともSMでは特別なケースがあります!)配列のインデックスが最初になり、次に他のすべてのプロパティが挿入されます。 V8、Carakan、Chakraは、オブジェクトの型に関係なく、配列のインデックスを常に最初に指定し、次に挿入順に他のすべてのプロパティを指定します。

関連する問題