Zoeken…


Syntaxis

  • nieuwe WeakMap ([iterable]);
  • weakmap.get (key);
  • zwakmap.set (sleutel, waarde);
  • weakmap.has (key);
  • weakmap.delete (key);

Opmerkingen

Zie Wat zijn de feitelijke toepassingen van ES6 WeakMap? Voor het gebruik van WeakMap. .

Een WeakMap-object maken

Met het WeakMap-object kunt u sleutel / waarde-paren opslaan. Het verschil met Map is dat sleutels objecten moeten zijn en er nauwelijks naar wordt verwezen. Dit betekent dat als er geen andere sterke verwijzingen naar de sleutel zijn, het element in WeakMap kan worden verwijderd door de vuilnisman.

WeakMap constructor heeft een optionele parameter, die elk iterabel object (bijvoorbeeld Array) kan zijn dat sleutel / waarde-paren bevat als arrays met twee elementen.

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

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

Een waarde ophalen die aan de sleutel is gekoppeld

Gebruik de methode .get() om een waarde aan de sleutel te koppelen. Als er geen waarde aan de sleutel is gekoppeld, retourneert deze undefined .

const obj1 = {},
      obj2 = {};

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

Een waarde toewijzen aan de sleutel

Gebruik de methode .set() om een waarde aan de sleutel toe te wijzen. Het retourneert het WeakMap-object, zodat u .set() -oproepen kunt .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

Controleren of er een element met de sleutel bestaat

Gebruik de methode .has() om te controleren of een element met een opgegeven sleutel wordt afgesloten in een WeakMap. Het retourneert true als het wordt afgesloten en anders false .

const obj1 = {},
      obj2 = {};

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

Een element verwijderen met de sleutel

Gebruik de methode .delete() om een element met een opgegeven sleutel te verwijderen. Het retourneert true als het element bestond en is verwijderd, anders 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

Zwakke referentiedemo

JavaScript gebruikt referentieteltechniek om ongebruikte objecten te detecteren. Wanneer het aantal verwijzingen naar een object nul is, wordt dat object vrijgegeven door de vuilnisman. Weakmap maakt gebruik van zwakke verwijzing die niet bijdraagt aan de hand telling van een object, daarom is het zeer nuttig om het geheugen op te lossen lek problemen .

Hier is een demo van zwakke kaart. Ik gebruik een zeer groot object als waarde om aan te tonen dat zwakke referentie niet bijdraagt aan het aantal referenties.

// 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow