Sök…
Syntax
- ny WeakMap ([iterable]);
- weakmap.get (nyckel);
- weakmap.set (nyckel, värde);
- weakmap.has (nyckel);
- weakmap.delete (nyckel);
Anmärkningar
För användning av WeakMap, se Vilka är de faktiska användningarna av ES6 WeakMap? .
Skapa ett WeakMap-objekt
Med WeakMap-objekt kan du lagra nyckel- / värdepar. Skillnaden från kartan är att nycklarna måste vara objekt och det är svagt referenser. Detta innebär att om det inte finns några andra starka referenser till nyckeln kan elementet i WeakMap tas bort av avfallssamlare.
WeakMap-konstruktören har en valfri parameter, som kan vara vilket som helst iterbart objekt (till exempel Array) som innehåller nyckel- / värdepar som tvåelement-arrayer.
const o1 = {a: 1, b: 2},
o2 = {};
const weakmap = new WeakMap([[o1, true], [o2, o1]]);
Få ett värde kopplat till nyckeln
För att få ett värde kopplat till nyckeln använder .get()
metoden .get()
. Om det inte finns något värde kopplat till nyckeln, returneras den undefined
.
const obj1 = {},
obj2 = {};
const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.get(obj1)); // 7
console.log(weakmap.get(obj2)); // undefined
Tilldela ett värde till nyckeln
För att tilldela ett värde till nyckeln använder .set()
metoden .set()
. Det returnerar WeakMap-objektet så att du kan kedja .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
Kontrollera om ett element med nyckeln finns
För att kontrollera om ett element med en specificerad nyckel finns i en WeakMap använder .has()
metoden .has()
. Det returnerar true
om det går ut och på annat sätt false
.
const obj1 = {},
obj2 = {};
const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.has(obj1)); // true
console.log(weakmap.has(obj2)); // false
Ta bort ett element med nyckeln
För att ta bort ett element med en specificerad nyckel, använd .delete()
. Det returnerar true
om elementet fanns och har tagits bort, annars 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
Svag referensdemo
JavaScript använder referensräkningsteknik för att upptäcka oanvända objekt. När referensräkningen till ett objekt är noll, kommer det objektet att släppas av sopor. Weakmap använder svag referens som inte bidrar till referensräkning för ett objekt, därför är det mycket användbart att lösa problem med minnesläckage.
Här är en demo av svagt kart. Jag använder ett mycket stort objekt som värde för att visa att svag referens inte bidrar till referensräkningen.
// 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 }