Auf dieser und dieser MDN-Seite scheint der einzige Unterschied zwischen Maps und WeakMaps darin zu liegen, dass WeakMaps keine "size" -Eigenschaft besitzt. Aber ist das wahr? Was ist der Unterschied zwischen ihnen?
javascript
ecmascript-6
ecmascript-harmony
weakmap
Dmitrii Sorin
quelle
quelle
key
kann nicht gesammelt werden, da Sie darauf verweisen.Antworten:
Auf derselben Seite, Abschnitt " Warum schwache Karte? " :
[Und deshalb haben sie auch kein
size
Eigentum]- das wäre das "normale"
Map
s . Nicht bei MDN erwähnt, aber im Einklang Vorschlag , diejenigen , auch habenitems
,keys
undvalues
Generator Methoden und die UmsetzungIterator
Schnittstelle .quelle
new Map().get(x)
also ungefähr die gleiche Suchzeit wie das Lesen einer Eigenschaft von einem einfachen Objekt?WeakMap
immer noch ein Array (oder eine andere Sammlung) von Einträgen. Es teilt dem Garbage Collector lediglich mit, dass dies schwache Referenzen sind .Beide verhalten sich unterschiedlich, wenn ein Objekt, auf das durch ihre Schlüssel / Werte verwiesen wird, gelöscht wird. Nehmen wir den folgenden Beispielcode:
Die obige IIFE ausgeführt gibt es keine Art , wie wir verweisen können
{x: 12}
und{y: 12}
mehr. Der Garbage Collector löscht den Schlüssel-b-Zeiger aus „WeakMap“ und entfernt ihn ebenfalls{y: 12}
aus dem Speicher. Im Fall von "Map" entfernt der Garbage Collector jedoch keinen Zeiger aus "Map" und auch nicht{x: 12}
aus dem Speicher.Zusammenfassung: Mit WeakMap kann der Garbage Collector seine Aufgabe ausführen, Map jedoch nicht.
Referenzen: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/
quelle
map.entries().next().value // [{x:12}, 1]
WeakMap
es nur nicht primitive Schlüssel haben kann (keine Zeichenfolgen oder Zahlen oderSymbol
s als Schlüssel, nur Arrays, Objekte, andere Karten usw.).Map
aber nicht in derWeakMap
Vielleicht wird die nächste Erklärung für jemanden klarer.
Wie Sie sehen,
k1
können wir nach dem Entfernen des Schlüssels aus dem Speicher weiterhin innerhalb der Karte darauf zugreifen. Gleichzeitig wird durch Entfernen desk2
Schlüssels von WeakMap dieser auchwm
als Referenz entfernt.Aus diesem Grund hat WeakMap keine aufzählbaren Methoden wie forEach, da es keine Liste von WeakMap-Schlüsseln gibt, sondern nur Verweise auf andere Objekte.
quelle
forEach
,(key, val)
sein sollte eigentlich(val, key)
Ein weiterer Unterschied (Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ):
Eine Zeichenfolge, eine Zahl oder ein Boolescher Wert können auch nicht als
WeakMap
Schlüssel verwendet werden. AMap
kann primitive Werte für Schlüssel verwenden.quelle
Aus Javascript.info
Karte - Wenn wir ein Objekt als Schlüssel in einer regulären Karte verwenden, ist dieses Objekt auch vorhanden, solange die Karte vorhanden ist. Es belegt Speicher und kann nicht Müll gesammelt werden.
Ähnlich wie wenn ein Objekt als Schlüssel in einer regulären Karte verwendet wird, existiert dieses Objekt auch, solange die Karte existiert. Es belegt Speicher und kann nicht Müll gesammelt werden
WeakMap - Wenn wir nun ein Objekt als Schlüssel verwenden und keine anderen Verweise auf dieses Objekt vorhanden sind, wird es automatisch aus dem Speicher (und aus der Karte) entfernt.
quelle
WeapMap in Javascript enthält keine Schlüssel oder Werte. Es bearbeitet lediglich den Schlüsselwert mithilfe einer eindeutigen ID und definiert eine Eigenschaft für das Schlüsselobjekt.
Da es die Eigenschaft to
key object
by method definiertObject.definePropert()
, darf der Schlüssel kein primitiver Typ sein .und auch weil WeapMap keine Schlüsselwertpaare enthält, können wir die Längeneigenschaft von schwache Karte nicht erhalten.
und auch manipulierter Wert wird dem Schlüsselobjekt zurück zugewiesen, Garbage Collector kann Schlüssel leicht sammeln, wenn er nicht verwendet wird.
Beispielcode für die Implementierung.
Referenz der Umsetzung
quelle
id
, aber dies sollte eindeutig sein, indem etwas Math.random und Date.now () usw. verwendet werden. Und durch Hinzufügen dieser dynamischen ID kann der erste Punkt gelöst werden. Könnten Sie mir bitte eine Lösung für die letzten beiden Punkte geben?WeakMap
Schlüssel müssen Objekte sein, keine primitiven Werte.Warum????
Sehen wir uns das folgende Beispiel an.
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:
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.quelle