WeakMap は、オブジェクトをキーにする、キー/バリュー型のマップです。

構文

new WeakMap([iterable])

引数

iterable
要素がキー・値の対(2 要素の配列)である Array または他の反復処理可能なオブジェクトです。それぞれのキー・値対が新しい WeakMap に追加されます。 null は undefined として扱われます。

説明

WeakMapのキーはオブジェクトに限ります。 プリミティブ型 はキーとして使えません。 (例えば SymbolWeakMap のキーとして使えません。).

なぜ WeakMap なのか?

経験豊富な JavaScript プログラマであれば、4 つの API メソッドから共有される 2 つの配列( 1 つはキー用、もう 1 つはバリュー用)を用いることで、この API を JavaScript で実装することが可能であることに気づくでしょう。そうした実装では、主に 2 つの不都合が生じることとなります。1 つ目の不都合は、探索の計算量が O(n) となること (O(n) search)(n はマップ中におけるキーの数を表す)。もう 1 つの不都合はメモリリークの問題です。(2 つの配列を使って)マップを自作した場合、キーの配列はキーとしたオブジェクトへの参照を保持し続けるでしょう。従って、それらのキーとなったオブジェクトはガベージコレクションの対象から外されることとなります。ネイティブな WeakMap では、キーとなるオブジェクトに対しては"弱い"参照が保持されます。これにより、キーとなったオブジェクトへの参照が他に存在しない場合に、そのオブジェクトはガベージコレクションの対象に含まれるようになります。

弱参照を用いるため、WeakMap のキーは列挙できません(つまり、キーの一覧を取得するメソッドは存在しません)。キーの一覧はガベージコレクションに依存することになり、非決定性が生まれます。キーの一覧が必要な場合は、あなた自身の手でキーの一覧を管理することになります。ECMAScript proposal では、弱参照を使用しない且つキーの列挙が可能な、単純なセットやマップの導入も目標とされていることを付け加えておきます。

WeakMap インスタンス

すべてのWeakMapインスタンスは、WeakMap.prototypeから継承します。

プロパティ

WeakMap.prototype.constructor
インスタンスのプロトタイプを生成する関数を返します。これは、デフォルトではWeakMap 関数です。

メソッド

WeakMap.prototype.delete(key)
key に関連した値を削除します。その後 WeakMap.prototype.has(key)false を返します。
WeakMap.prototype.get(key)
key に関連した値を返します。見つからない場合、undefined を返します。
WeakMap.prototype.has(key)
WeakMap オブジェクト内に key に関連した値があるかどうか示す Boolean を返します。
WeakMap.prototype.set(key, value)
WeakMap オブジェクト内に key に対する値を設定し、WeakMap オブジェクトを返します。
WeakMap.prototype.clear()
WeakMap オブジェクトからすべてのキー/バリューペアを削除します。.clear() メソッドを持っていない WeakMap オブジェクトをカプセル化することによって、.clear() メソッドを持つ WeakMap オブジェクトに似たオブジェクトを実装することが可能であることに注意して下さい。(WeakMap ページの例を確認してください。)

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

標準仕様

仕様書 策定状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
WeakMap の定義
標準 Initial definition.
ECMAScript Latest Draft (ECMA-262)
WeakMap の定義
ドラフト  

ブラウザ互換性

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応3612611238
new WeakMap(iterable)381236 なし259
new WeakMap(null) あり123711 ?8
WeakMap() without new throws あり124211 あり9
clear36 — 43 なし20 — 461125 — 308 — 9
delete36 あり6111238
get36 あり6211238
has36 あり6111238
prototype36 あり611238
set36 あり61113238
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応3636126238 あり
new WeakMap(iterable)38381236259 あり
new WeakMap(null) あり あり1237 ?8 あり
WeakMap() without new throws あり あり1242 あり9 あり
clear36 — 4336 — 43 なし20 — 4625 — 308 — 9 あり
delete3636 あり61238 あり
get3636 あり62238 あり
has3636 あり61238 あり
prototype3636 あり6238 あり
set3636 あり61238 あり

1. Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.

2. Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.

3. Returns 'undefined' instead of the 'Map' object.

関連情報

ドキュメントのタグと貢献者

このページの貢献者: SphinxKnight, zakki, lv7777, teoli, ethertank, saneyuki_s
最終更新者: SphinxKnight,