Suche…


Syntax

  • neue WeakMap ([iterable]);
  • schwachmap.get (Schlüssel);
  • schwachmap.set (Schlüssel, Wert);
  • schwachmap.has (Schlüssel);
  • schwachmap.delete (Schlüssel);

Bemerkungen

Informationen zur Verwendung von WeakMap finden Sie unter Was ist die tatsächliche Verwendung von ES6 WeakMap? .

WeakMap-Objekt erstellen

Mit dem WeakMap-Objekt können Sie Schlüssel / Wert-Paare speichern. Der Unterschied zu Map besteht darin, dass Schlüssel Objekte sein müssen und schwach referenziert werden. Dies bedeutet, dass das Element in WeakMap durch den Garbage Collector entfernt werden kann, wenn es keine anderen starken Verweise auf den Schlüssel gibt.

WeakMap-Konstruktor verfügt über einen optionalen Parameter, bei dem es sich um ein beliebiges iterierbares Objekt (z. B. Array) handeln kann, das Schlüssel / Wert-Paare als Arrays mit zwei Elementen enthält.

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

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

Einen Wert mit dem Schlüssel verknüpfen

Verwenden Sie die .get() -Methode, um einen mit dem Schlüssel .get() Wert .get() . Wenn dem Schlüssel kein Wert zugeordnet ist, wird undefined .

const obj1 = {},
      obj2 = {};

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

Dem Schlüssel einen Wert zuweisen

Um dem Schlüssel einen Wert zuzuweisen, verwenden Sie die Methode .set() . Es gibt das WeakMap-Objekt zurück, sodass Sie .set() Aufrufe .set() können.

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

Überprüfen, ob ein Element mit dem Schlüssel vorhanden ist

Verwenden Sie die Methode .has() , um zu überprüfen, ob ein Element mit einem bestimmten Schlüssel in einer WeakMap vorhanden ist. Es gibt true zurück true wenn es existiert, und andernfalls false .

const obj1 = {},
      obj2 = {};

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

Ein Element mit dem Schlüssel entfernen

Verwenden .delete() zum Entfernen eines Elements mit einem angegebenen Schlüssel die Methode .delete() . Sie gibt true zurück true wenn das Element vorhanden war und entfernt wurde, andernfalls false .

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

Schwache Referenzdemo

JavaScript verwendet Referenzzählverfahren , um nicht verwendete Objekte zu erkennen. Wenn die Referenzzählung für ein Objekt Null ist, wird dieses Objekt vom Garbage Collection-Speicher freigegeben. Weakmap verwendet schwache Referenz , die nicht Zählung eines Objekts zu verweisen beiträgt, daher ist es sehr nützlich ist , Speicher zu lösen Leck Probleme .

Hier ist eine Demo von Weakmap. Ich benutze ein sehr großes Objekt als Wert, um zu zeigen, dass eine schwache Referenz nicht zum Referenzzähler beiträgt.

// 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow