この翻訳は不完全です。英語から この記事を翻訳 してください。

The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced.  The keys must be objects and the values can be arbitrary values.

You can learn more about WeakMaps in the section WeakMap object in キー付きコレクション.

構文

new WeakMap([iterable])

引数

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

説明

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

なぜ WeakMap なのか?

map API は、4 つの API メソッドから共有される 2 つの配列( 1 つはキー用、もう 1 つは値用)を用いることで、JavaScript で実装できます。Setting elements on this map would involve pushing a key and value onto the end of each of those arrays simultaneously. As a result, the indices of the key and value would correspond to both arrays.  Getting values from the map would involve iterating through all keys to find a match, then using the index of this match to retrieve the corresponding value from the array of values. 

そうした実装では、主に 2 つの不都合が生じることとなります。1 つ目の不都合は、探索の計算量が O(n) となること (O(n) search)(n はマップ中におけるキーの数を表す)。もう 1 つの不都合はメモリーリークの問題です。(2 つの配列を使って)マップを自作した場合、キーの配列はキーとしたオブジェクトへの参照を保持し続けるでしょう。従って、それらのキーとなったオブジェクトはガベージコレクションの対象から外されることとなります。

ネイティブな WeakMap では、キーとなるオブジェクトに対しては"弱い"参照が保持されます。これにより、キーとなったオブジェクトへの参照が他に存在しない場合に、そのオブジェクトはガベージコレクションの対象に含まれるようになります。Native WeakMaps can be particularly useful constructs when mapping keys to information about the key that is valuable only if the key has not been garbage collected.

弱参照を用いるため、WeakMap のキーは列挙できません(つまり、キーの一覧を取得するメソッドは存在しません)。もし、可能であれば、キーの一覧はガベージコレクションに依存することになり、非決定性が生まれます。キーの一覧が必要な場合は、Mapを使うことになります。

プロパティ

WeakMap.length
The value of the length property is 0.
WeakMap.prototype
Represents the prototype for the WeakMap constructor. Allows the addition of properties to all WeakMap objects.

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 ページの例を確認してください。)

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

wm1.has(o1);   // true
wm1.delete(o1);
wm1.has(o1);   // false

Implementing a WeakMap-like class with a .clear() method

class ClearableWeakMap {
  constructor(init) {
    this._wm = new WeakMap(init)
  }
  clear() {
    this._wm = new WeakMap()
  }
  delete(k) {
    return this._wm.delete(k)
  }
  get(k) {
    return this._wm.get(k)
  }
  has(k) {
    return this._wm.has(k)
  }
  set(k, v) {
    this._wm.set(k, v)
    return this
  }
}

仕様

仕様書 策定状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
WeakMap の定義
標準 初期定義
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.

凡例

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

関連情報

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

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