WeakMap
Schlüssel müssen Objekte sein, keine primitiven Werte.
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // works fine (object key)
// can't use a string as the key
weakMap.set("test", "Not ok"); // Error, because "test" is not an object
Warum????
Sehen wir uns das folgende Beispiel an.
let user = { name: "User" };
let map = new Map();
map.set(user, "...");
user = null; // overwrite the reference
// 'user' is stored inside the map,
// We can get it by using map.keys()
Wenn wir ein Objekt als Schlüssel in einem regulären Objekt verwenden, existiert dieses Objekt auch Map
, solange
Map
es existiert. Es belegt Speicher und kann nicht Müll gesammelt werden.
WeakMap
ist in diesem Aspekt grundlegend anders. Es verhindert nicht die Speicherbereinigung von Schlüsselobjekten.
let user = { name: "User" };
let weakMap = new WeakMap();
weakMap.set(user, "...");
user = null; // overwrite the reference
// 'user' is removed from memory!
Wenn wir ein Objekt als Schlüssel verwenden und es keine anderen Verweise auf dieses Objekt gibt, wird es automatisch aus dem Speicher (und aus der Karte) entfernt.
WeakMap
unterstützt keine Iteration und Methoden () , Werte () , Einträge () , daher gibt es keine Möglichkeit, alle Schlüssel oder Werte daraus abzurufen.
WeakMap hat nur die folgenden Methoden:
- schwachMap.get (Schlüssel)
- schwachMap.set (Schlüssel, Wert)
- schwachMap.delete (Schlüssel)
- schwachMap.has (Schlüssel)
Das ist offensichtlich, als ob ein Objekt alle anderen Referenzen verloren hat (wie 'Benutzer' im obigen Code), dann soll es automatisch Müll gesammelt werden. Aber technisch ist es nicht genau angegeben, wann die Bereinigung stattfindet.
Die JavaScript-Engine entscheidet das. Es kann sich dafür entscheiden, die Speicherbereinigung sofort durchzuführen oder zu warten und die Bereinigung später durchzuführen, wenn weitere Löschvorgänge auftreten. Technisch gesehen ist die aktuelle Elementanzahl von a WeakMap
also nicht bekannt. Der Motor hat es möglicherweise gereinigt oder nicht oder teilweise. Aus diesem Grund werden Methoden, die auf alle Schlüssel / Werte zugreifen, nicht unterstützt.
Hinweis: - Der Hauptanwendungsbereich von WeakMap ist ein zusätzlicher Datenspeicher. Als würde man ein Objekt zwischenspeichern, bis dieses Objekt Müll gesammelt hat.