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 の定義
ドラフト  

ブラウザ互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 36Edge 完全対応 12Firefox 完全対応 6IE 完全対応 11Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 12Firefox Android 完全対応 6Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
new WeakMap(iterable)Chrome 完全対応 38Edge 完全対応 12Firefox 完全対応 36IE 未対応 なしOpera 完全対応 25Safari 完全対応 9WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 36Opera Android 完全対応 25Safari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
new WeakMap(null)Chrome 完全対応 ありEdge 完全対応 12Firefox 完全対応 37IE 完全対応 11Opera ? Safari 完全対応 8WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 12Firefox Android 完全対応 37Opera Android ? Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
WeakMap() without new throwsChrome 完全対応 ありEdge 完全対応 12Firefox 完全対応 42IE 完全対応 11Opera 完全対応 ありSafari 完全対応 9WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 12Firefox Android 完全対応 42Opera Android 完全対応 ありSafari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
clear
非推奨非標準
Chrome 未対応 36 — 43Edge 未対応 なしFirefox 未対応 20 — 46IE 完全対応 11Opera 未対応 25 — 30Safari 未対応 8 — 9WebView Android 未対応 37 — 43Chrome Android 未対応 36 — 43Edge Mobile 未対応 なしFirefox Android 未対応 20 — 46Opera Android 未対応 25 — 30Safari iOS 未対応 8 — 9Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
deleteChrome 完全対応 36Edge 完全対応 ありFirefox 完全対応 6
補足
完全対応 6
補足
補足 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.
IE 完全対応 11Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 ありFirefox Android 完全対応 6
補足
完全対応 6
補足
補足 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.
Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
getChrome 完全対応 36Edge 完全対応 ありFirefox 完全対応 6
補足
完全対応 6
補足
補足 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.
IE 完全対応 11Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 ありFirefox Android 完全対応 6
補足
完全対応 6
補足
補足 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.
Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
hasChrome 完全対応 36Edge 完全対応 ありFirefox 完全対応 6
補足
完全対応 6
補足
補足 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.
IE 完全対応 11Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 ありFirefox Android 完全対応 6
補足
完全対応 6
補足
補足 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.
Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
prototypeChrome 完全対応 36Edge 完全対応 ありFirefox 完全対応 6IE 完全対応 11Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 ありFirefox Android 完全対応 6Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
setChrome 完全対応 36Edge 完全対応 ありFirefox 完全対応 6
補足
完全対応 6
補足
補足 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.
IE 部分対応 11
補足
部分対応 11
補足
補足 Returns 'undefined' instead of the 'Map' object.
Opera 完全対応 23Safari 完全対応 8WebView Android 完全対応 37Chrome Android 完全対応 36Edge Mobile 完全対応 ありFirefox Android 完全対応 6
補足
完全対応 6
補足
補足 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.
Opera Android 完全対応 23Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.

凡例

完全対応  
完全対応
部分対応  
部分対応
未対応  
未対応
実装状況不明  
実装状況不明
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。
非推奨。新しいウェブサイトでは使用しないでください。
非推奨。新しいウェブサイトでは使用しないでください。
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

関連情報

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

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