
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, aber im Vergleich zu Set weist Set WeakSet Unterschiede auf:
WeakSetWeakSet add()WeakSetadd() , 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.