サーチ…


構文

  • 新しいWeakMap([iterable]);
  • weakmap.get(key);
  • weakmap.set(key、value);
  • weakmap.has(key);
  • weakmap.delete(key);

備考

WeakMapの使用については、「 ES6 WeakMapの実際の使用方法」を参照してください

WeakMapオブジェクトの作成

WeakMapオブジェクトを使用すると、キーと値のペアを格納できます。 Mapとの違いは、キーはオブジェクトであり、弱参照されている必要があるということです。つまり、キーへの他の強い参照がない場合、WeakMapの要素はガベージコレクタによって削除できます。

WeakMapコンストラクタにはオプションのパラメータがあります。このパラメータは、2要素配列としてキー/値のペアを含む任意の反復可能オブジェクト(Arrayなど)です。

const o1 = {a: 1, b: 2},
      o2 = {};

const weakmap = new WeakMap([[o1, true], [o2, o1]]);

キーに関連付けられた値を取得する

キーに関連付けられた値を取得するには、 .get()メソッドを使用します。キーに関連付けられた値がない場合は、 undefined返します。

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.get(obj1)); // 7
console.log(weakmap.get(obj2)); // undefined

キーに値を割り当てる

キーに値を割り当てるには、 .set()メソッドを使用します。 WeakMapオブジェクトを返します。したがって、 .set()呼び出しをチェーンすることができます。

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap();
weakmap.set(obj1, 1).set(obj2, 2);
console.log(weakmap.get(obj1)); // 1
console.log(weakmap.get(obj2)); // 2

キーを持つ要素が存在するかどうかを確認する

特定のキーを持つ要素がWeakMapに存在するかどうかを調べるには、 .has()メソッドを使用します。終了した場合はtrue返し、それ以外の場合はfalse返しtrue

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.has(obj1)); // true
console.log(weakmap.has(obj2)); // false

キーを持つ要素の削除

指定したキーを持つ要素を削除するには、 .delete()メソッドを使用します。要素が存在し、削除されている場合はtrue返し、それ以外の場合はfalse返しtrue

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.delete(obj1)); // true
console.log(weakmap.has(obj1)); // false
console.log(weakmap.delete(obj2)); // false

弱いリファレンスデモ

JavaScriptは参照カウント技術を使用して未使用のオブジェクトを検出します。オブジェクトへの参照カウントがゼロの場合、そのオブジェクトはガベージコレクタによって解放されます。 Weakmapは、オブジェクトの参照カウントに寄与しない弱参照を使用するため、メモリリークの問題を解決するのに非常に便利です。

ここにweakmapのデモがあります。弱い参照が参照カウントに寄与しないことを示すために、非常に大きなオブジェクトを値として使用します。

// manually trigger garbage collection to make sure that we are in good status.
> global.gc(); 
undefined

// check initial memory use,heapUsed is 4M or so
> process.memoryUsage(); 
{ rss: 21106688,
  heapTotal: 7376896,
  heapUsed: 4153936,
  external: 9059 }

> let wm = new WeakMap();
undefined

> const b = new Object();
undefined

> global.gc();
undefined

// heapUsed is still 4M or so
> process.memoryUsage(); 
{ rss: 20537344,
  heapTotal: 9474048,
  heapUsed: 3967272,
  external: 8993 }

// add key-value tuple into WeakMap,
// key is b,value is 5*1024*1024 array 
> wm.set(b, new Array(5*1024*1024));
WeakMap {}

// manually garbage collection
> global.gc();
undefined

// heapUsed is still 45M
> process.memoryUsage(); 
{ rss: 62652416,
  heapTotal: 51437568,
  heapUsed: 45911664,
  external: 8951 }

// b reference to null
> b = null;
null

// garbage collection
> global.gc();
undefined

// after remove b reference to object,heapUsed is 4M again 
// it means the big array in WeakMap is released
// it also means weekmap does not contribute to big array's reference count, only b does.
> process.memoryUsage(); 
{ rss: 20639744,
  heapTotal: 8425472,
  heapUsed: 3979792,
  external: 8956 }


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow