Einfach ausgedrückt: Wenn eine Variable oder ein Objekt „nicht erreichbar“ ist, besteht keine Notwendigkeit, dass die Variable oder das Objekt weiterhin im Speicher gespeichert wird und recycelt werden sollte.
Zum Beispiel:
let xiaoming = {name:'xiaoming'}//Erstellen Sie ein Objekt und verwenden Sie die Variable xiaoming als Referenz für xiaoming = null //Machen Sie die Variable xiaoming leer, sodass das Objekt {name:'xiaoming'} nicht erreichbar ist//{ name:'xiaoming'} Objekt wird recycelt.
Wenn ein Objekt von einem Array und anderen Objekten referenziert wird, gilt das Objekt als erreichbar, solange das Array und das Objekt, die es referenzieren, im Array vorhanden sind.
Objekte im Array:
let xiaoming = {name:'xiaoming'} let arr = [xiaoming] xiaoming = null //Machen Sie die Variable xiaoming leer //Das Objekt {name:'xiaoming'} wird nicht freigegeben, da es im Array vorhanden ist.
Wenn wir ein Objekt als Schlüssel Map
verwenden, gilt dies auch, wenn Map
vorhanden ist , dann Das Objekt wird von der Engine nicht recycelt.
Schlüsselobjekt in Map
:
let xiaoming = {name:'xiaoming'} let map = new Map() map.set(xiaoming,'ein Junge') xiaoming = null //Machen Sie die Variable xiaoming leer //Das Objekt {name:'xiaoming'} wird nicht freigegeben, da es der Schlüssel der Karte ist und
Map
in der Verarbeitung der Freigabe von WeapMap
grundlegend unterscheidet Es ist einfach so, dass WeapMap
die Speicherbereinigung aufgrund von Objekten als Schlüssel nicht verhindert.
Der Unterschied zwischen WeakMap
und Map
lässt sich in drei Aspekte unterteilen:
WeakMap
kann nur Objekte als Schlüssel verwendenlassen schwachMap = new WeakMap() let obj = {name:'obj'} schwachMap.set(obj,'obj als Schlüssel') schwachMap.set('str','str as the key')//Die
Ergebnisse der Fehlercodeausführung lauten wie folgt:
Es ist ersichtlich, dass das Programm nicht normal ausgeführt werden kann, wenn wir Zeichenfolgen als key
verwenden.
Mit anderen Worten: Wenn ein Objekt außer WeakMap
Referenz keine anderen Referenzen hat, wird das Objekt vom System recycelt.
Zum Beispiel:
let schwachMap = new WeakMap() let obj = {name:'obj'} schwachMap.set(obj,'obj als Schlüssel') obj = null //Variable obj leer machen //Zu diesem Zeitpunkt wird das Objekt {name:'obj'} recycelt.
WeakMap
unterstützt begrenzte Methoden.WeakMap
unterstützt keine IterationWeakMap
unterstützt keine keys()
WeakMap
unterstützt keine values()
WeakMap
unterstützt entires()
nicht, daher haben wir keine Möglichkeit, alle Schlüssel-Wert-Paare abzurufen.
WeakMap
kann nur die folgenden Methoden verwenden:
weakMap.get(key)
Holen Sie sich das Schlüssel-Wert-PaarweakMap.set(key,val)
Legen Sie das Schlüssel-Wert-Paar festweakMap.delete(key)
Löschen Sie das Schlüssel-Wert-PaarweakMap.has(key)
Bestimmen Sie, ob esvorhanden ist. Die Datenzugriffsmethode von WeakMap
muss eingeschränkt werden, da der Zeitpunkt der Freigabe des Objekts durch die JavaScript
-Engine nicht bestimmt werden kann.
Wenn ein Objekt alle Referenzen verliert, gibt JavaScript
Engine den vom Objekt belegten Speicherplatz möglicherweise sofort frei oder wartet eine Weile.
Daher kann die Anzahl der Elemente von WeakMap
zu einem bestimmten Zeitpunkt nicht bestimmt werden. (Stellen Sie sich vor, wenn wir die Elemente von WeakMap
durchlaufen, nachdem ein Objekt alle Referenzen verloren hat, erhalten wir möglicherweise unterschiedliche Ergebnisse.)
Das Anwendungsszenario von WeakMap
besteht normalerweise darin, Daten zu speichern, die zu einem Objekt „gehören“. Sofern vorhanden, sollten auch die zu diesem Objekt „gehörenden“ Daten freigegeben werden.
Es gibt eine historische Geschichte, die sich sehr gut für die Verwendung von WeakMap eignet: „Der schlaue Hase stirbt, die Lakaien werden gekocht; die Vögel sind verschwunden und der gute Bogen ist verborgen.“
Wenn wir diese Geschichte in JavaScript
Code beschreiben, sollten wir WeakMap
verwenden:
let schwachMap = new WeakMap() let Rabbit = {name:'rabbit'} //Der schlaue Hase let runDog = {name:'runDog'} //Der laufende Hund let flyBird = {name:'flyBird'} //Der fliegende Vogel let goodBow = {name :'goodBow'} //Liang Gong schwachMap.set(rabbit,runDog) schwachMap.set(flyBird,goodBow) Rabbit = null //Der schlaue Hase stirbt flyBird = null //Die Vögel sind weg//Bald werden die Lakaien und der gute Bogen freigelassen, vielleicht nicht sofort //Diese Geschichte sagt uns, dass es kein gutes Ende dafür gibt, ein zu sein Lakai, möglicherweise nicht sofort von // getötet, aberim Vergleich zu Set weist
Set
WeakSet
Unterschiede auf:
WeakSet
WeakSet
add()
WeakSet
add()
, has()
, delete()
WeakSet
unterstützt size
Größenattribut und keys()
Methode nicht.WeakMap
können WeakMap
verwenden, um einige Existenzinformationen zu überprüfen oder den Status wie „Ja/Nein“ zu überprüfen um festzustellen, ob der Benutzer online ist:
let onlineUser = new WeakMap() let zhangSan = {name:'Zhang San'} let liSi = {name:'李思'} let wangEr = {name:'王二'} let maZi = {name:'Mazi'} Funktion login(user){ ... ... onlineUser.add(Benutzer) } //Bestimmen Sie, ob der Benutzer online ist. Funktion isOnline(user){ return onlineUser.has(user) }
Die Einschränkung von WeakMap
und WeakSet
besteht darin, dass sie nicht alle Elemente auf einmal iterieren und abrufen können, was ihre wichtige Rolle an sehr kritischen Stellen nicht beeinträchtigt.
WeakMap
kann nur Objekte als Schlüssel verwenden. Wenn alle externen Verweise auf den Schlüssel verloren gehen (keine anderen Variablen außer WeakMap
verweisen auf das Schlüsselobjekt), verhindert WeakMap
nicht, dass die Engine den Schlüsselwert wiederverwendet. Nach dem Recycling sind die entsprechenden Elemente WeakMap
nicht mehr vorhanden.WeakSet
kann nur Objekte speichern. Sobald das Objektelement alle externen Referenzen verliert (mit Ausnahme von WeakSet
verweisen keine anderen Variablen auf das Elementobjekt), verhindert WeakSet
nicht, dass die Engine das Element wiederverwendet. Nach dem Recycling verschwinden die entsprechenden Elemente im WeakSet
.clear()
, size
, keys()
values()
WeakMap
„values() WeakSet
werden häufig zum Speichern von Datenstrukturen verwendet, die dem „Haupt“-Objekt zugeordnet sind Die zugehörige Datenstruktur wird natürlich gelöscht.