この記事は編集レビューを必要としています。ぜひご協力ください。
これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。
イントロダクション
WeakMap は、オブジェクトをキーにする、キー/バリュー型のマップです。
API
メソッド | 詳細 |
---|---|
myWeakMap.get(key [, defaultValue]) |
key オブジェクトに関連付けられた値を返します。関連付けられた値が存在しない場合、defaultValue が返ります。 |
myWeakMap.set(key, value) |
myWeakMap に於いて、 key オブジェクトと値を関連付けます。undefined が返ります。 |
myWeakMap.has(key) |
myWeakMap に於いて、key オブジェクトに関連する値が設定されているかどうかを検証した真偽値が返ります。 |
myWeakMap.delete(key) |
key オブジェクトに関連付けられた値を削除します。このメソッドが呼ばれた後では、myWeakMap.has(key) は false を返すことになります。 |
myWeakMap.clear() |
myWeakMap の値を全て空にします。undefined が返ります。 |
例
var wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); var o1 = {}, o2 = function(){}, o3 = window; wm1.set(o1, 37); wm1.set(o2, "azerty"); wm2.set(o1, o2); // 値は(オブジェクトまたは関数を含む)何であってもかまいません wm2.set(o3, undefined); wm2.set(wm1, wm2); // キーも値もどんなオブジェクトでもかまいません。WeakMap であってもよいのです! wm1.get(o2); // "azerty" wm2.get(o2); // wm2 には o2 に関連付けられた値が無い為、undefined が返ってきます wm2.get(o3); // 値が undefined と関連付けられている為、undefined が返ってきます wm1.has(o2); // true wm2.has(o2); // false wm2.has(o3); // true (値が関連付けられているならば、たとえ値が 'undefined' であっても true となります) wm3.set(o1, 37); wm3.get(o1); // 37 wm3.clear(); wm3.get(o1); // undefined, wm3 は clear されたため o1 に関連する値は持っていません wm1.has(o1); // true wm1.delete(o1); wm1.has(o1); // false
なぜ WeakMap なのか?
経験豊富な JavaScript プログラマであれば、4 つの API メソッドから共有される 2 つの配列( 1 つはキー用、もう 1 つはバリュー用)を用いることで、この API を JavaScript で実装することが可能であることに気づくでしょう。そうした実装では、主に 2 つの不都合が生じることとなります。1 つ目の不都合は、探索の計算量が O(n) となること (O(n) search)(n はマップ中におけるキーの数を表す)。もう 1 つの不都合はメモリリークの問題です。(2 つの配列を使って)マップを自作した場合、キーの配列はキーとしたオブジェクトへの参照を保持し続けるでしょう。従って、それらのキーとなったオブジェクトはガベージコレクションの対象から外されることとなります。ネイティブな WeakMap では、キーとなるオブジェクトに対しては"弱い"参照が保持されます。これにより、キーとなったオブジェクトへの参照が他に存在しない場合に、そのオブジェクトはガベージコレクションの対象に含まれるようになります。
弱参照を用いるため、WeakMap のキーは列挙できません(つまり、キーの一覧を取得するメソッドは存在しません)。キーの一覧はガベージコレクションに依存することになり、非決定性が生まれます。キーの一覧が必要な場合は、あなた自身の手でキーの一覧を管理することになります。ECMAScript proposal では、弱参照を使用しない且つキーの列挙が可能な、単純なセットやマップの導入も目標とされていることを付け加えておきます。
標準仕様
仕様書 | 策定状況 | コメント |
---|---|---|
Unknown | ドラフト |
ブラウザ互換性
Feature | Chrome | Firefox (SpiderMonkey) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (有)[1] | 6.0 (6.0) | 未サポート | 未サポート | 未サポート |
clear() |
未サポート | 20.0 (20.0) | 未サポート | 未サポート | 未サポート |
Feature | Android | Firefox Mobile (SpiderMonkey) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 未サポート | 6.0 (6.0) | 未サポート | 未サポート | 未サポート |
clear() |
未サポート | 20.0 (20.0) | 未サポート | 未サポート | 未サポート |