--- title: WeakMap slug: Web/JavaScript/Reference/Global_Objects/WeakMap tags: - Class - ECMAScript 2015 - JavaScript - Reference - WeakMap translation_of: Web/JavaScript/Reference/Global_Objects/WeakMap ---
WeakMap
オブジェクトは、キーが弱く参照されるキーと値の組のコレクションです。キーはオブジェクトでなければならず、値は任意の値を取ることができます。
WeakMap
については、 WeakMap オブジェクトのガイド (キー付きコレクション内) でより詳しく解説しています。
WeakMap のキーは Object
に限ります。{{Glossary("Primitive", "プリミティブ型")}} はキーとして使えません(例えば {{jsxref("Symbol")}} は WeakMap
のキーとして使えません)。
map API は、4 つの API メソッドから共有される 2 つの配列 (1 つはキー用、もう 1 つは値用) を用いることで、JavaScript で実装できます。このマップに要素を設定すると、それぞれの配列の最後に同時にキーと値を追加することになります。その結果、両方の配列でキーと値のインデックスは対応がとれています。マップから値を取得するには、すべてのキーを操作して一致するものを見つけ、見つかったキーのインデックスを使用して値の配列から対応する値を取り出します。
そうした実装では、主に 2 つの不都合が生じることとなります。
これに対して、ネイティブの WeakMap
では、キーとなるオブジェクトに対しては"弱い"参照が保持されます。これにより、キーとなったオブジェクトへの参照が他に存在しない場合に、そのオブジェクトはガベージコレクションの対象に含まれるようになります。ネイティブの WeakMap はキーとそのキーに関する情報をマッピングする場合に、キーがガベージコレクションされていないときにだけ意味があるため特に有用な構造です。
弱い参照を用いるため、WeakMap
のキーは列挙できません。 キーの一覧を取得するメソッドは存在しません。もし、可能であれば、キーの一覧はガベージコレクションに依存することになり、非決定性が生まれます。キーの一覧が必要な場合は、{{jsxref("Map")}}を使うことになります。
WeakMap
オブジェクトを生成します。key
に関連した値を削除します。その後 WeakMap.prototype.has(key)
は false
を返します。key
に関連した値を返します。見つからない場合、undefined
を返します。WeakMap
オブジェクト内に key
に関連した値があるかどうか示す Boolean を返します。WeakMap
オブジェクト内に key
に対する値を設定し、WeakMap
オブジェクトを返します。const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const 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
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; } }
仕様書 |
---|
{{SpecName('ESDraft', '#sec-weakmap-objects', 'WeakMap')}} |
{{Compat("javascript.builtins.WeakMap")}}
WeakMap