JavaScript/WeakMap
- JavaScript > 標準ライブラリ WeakMap
WeakMapオブジェクト
編集WeakMapオブジェクトは弱保持オブジェクト(weakly held objects)をキーとするの連想配列を扱うための機能を組み込んだコレクションオブジェクトです。 WeakMapオブジェクトの生成には、WeakMapコンストラクターを使います。
const wm = new WeakMap()
WeakMapオブジェクトにリテラルはありません。
- 注意
- WeakMapオブジェクトもオブジェクトなので、ドット記法(wm.prop)やブラケット記法(wm.["prop"])でプロパティにアクセスできますが、それはWeakMapオブジェクトの提供する連想配列ではなく、ただのオブジェクトです。WeakMapオブジェクトの要素へのアクセスにはset(),get()メソッドを使います。
JavaScriptには、他にも連想配列をサポートするオブジェクト「Mapオブジェクト」がありますが、WeakMapはWeak held objects(弱保持オブジェクト)をキーとするところが違います。 具体的には、
- WeakMap のキーは、オブジェクトだけでプリミティブは格納できない
- WeakMap のキーとしたオブジェクトへの参照が他に存在しない場合、それらのオブジェクトはガベージコレクションされる可能性がある
- WeakMap は、反復プロトコルはサポートしない
コード例
編集- コード例
const wm1 = new WeakMap() ; console.log(wm1) let obj = {}, lmd = x => x * x, ary = [1,2,3] wm1.set(obj, "abc") ; console.log('wm1.set(obj, "abc") ; wm1 =', wm1) wm1.set(lmd, []) ; console.log('wm1.set(lmd, []) ; wm1 =', wm1) wm1.set(ary, 123) ; console.log('wm1.set(ary, 123) ; wm1 =', wm1) wm1.set([1,2,3], "1") ; console.log('wm1.set([1,2,3], "1"); wm1 =', wm1) wm1.delete(obj) ; console.log('wm1.delete(obj) ; wm1 =', wm1) wm1.delete(obj) ; console.log('wm1.delete(obj) ; wm1 =', wm1) wm1.set(obj, 0) ; console.log('wm1.set(obj, 0) ; wm1 =', wm1) console.log(`wm1.get(obj) = ${wm1.get(obj)}, wm1.get([]) = ${wm1.get([])}`) console.log(`wm1.has(obj) = ${wm1.has(obj)}, wm1.has([]) = ${wm1.has([])}`) const a = new WeakMap() const b = new WeakMap() a.set([], 1) b.set([], 1) console.log(a == b)
- 実行結果
WWeakMap { <items unknown> } wm1.set(obj, "abc") ; wm1 = WeakMap { <items unknown> } wm1.set(lmd, []) ; wm1 = WeakMap { <items unknown> } wm1.set(ary, 123) ; wm1 = WeakMap { <items unknown> } wm1.set([1,2,3], "1"); wm1 = WeakMap { <items unknown> } wm1.delete(obj) ; wm1 = WeakMap { <items unknown> } wm1.delete(obj) ; wm1 = WeakMap { <items unknown> } wm1.set(obj, 0) ; wm1 = WeakMap { <items unknown> } wm1.get(obj) = 0, wm1.get([]) = undefined wm1.has(obj) = true, wm1.has([]) = false false
- WeakMapの文字列化すると "WeakMap { <items unknown> }" になります(内容不明)。
- hasメソッドは、厳密に同一のオブジェクトのみ true を返します[1]。
プロパティ
編集静的プロパティ
編集- WeakMap.length
- 1
- コンストラクタの引数の数
- WeakMap.name
- "WeakMap"
- WeakMap.prototype
- [object]
静的メソッド
編集インスタンスプロパティ
編集WeakMap.prototype.size
編集WeakMapオブジェクトの要素数。
インスタンスメソッド
編集この節は書きかけです。この節を編集してくれる方を心からお待ちしています。
WeakMap.prototype.constructor()
編集WeakMap.prototype.delete(0)
編集WeakMap.prototype.get(0)
編集WeakMap.prototype.has(0)
編集= WeakMap.prototype.set(0,0)
編集脚註
編集- ^ “WeakMap - JavaScript // MDN” (2021年12月8日). 2021年12月28日閲覧。
外部リンク
編集- “ECMA-262::24.3 WeakMap Objects” (2021年12月17日). 2021年12月28日閲覧。