Detaillierte Erklärung zur Verwendung von JavaScript WeakMap

Detaillierte Erklärung zur Verwendung von JavaScript WeakMap

Ein WeakMap-Objekt ist eine Sammlung von Schlüssel-/Wertpaaren, wobei die Schlüssel schwache Referenzen sind. Die Schlüssel müssen Objekte sein, aber die Werte können alles sein.

Grammatik

neue WeakMap([iterierbar])

Parameter

iterierbar
Iterable ist ein Array (Array mit zwei Elementen) oder ein anderes iterierbares Objekt, dessen Elemente Schlüssel-Wert-Paare sind. Jedes Schlüssel-Wert-Paar wird der neuen WeakMap hinzugefügt. null wird als undefiniert behandelt.

beschreiben

Der Schlüssel von WeakMap kann nur vom Typ „Objekt“ sein. Primitive Datentypen (wie etwa Symbole) können nicht als Schlüssel verwendet werden.

Warum WeakMap?

In JavaScript kann die Map-API implementiert werden, indem ihre vier API-Methoden zwei Arrays gemeinsam nutzen (eines für Schlüssel und eines für Werte). Wenn Sie einer solchen Zuordnung einen Wert zuweisen, werden sowohl der Schlüssel als auch der Wert an das Ende beider Arrays angehängt. Dadurch stimmen die Schlüssel- und Werteindizes in den beiden Arrays überein. Wenn Sie einen Wert aus der Karte abrufen, müssen Sie alle Schlüssel durchlaufen und dann den Index verwenden, um den entsprechenden Wert aus dem Array der gespeicherten Werte abzurufen.

Eine solche Implementierung hat jedoch zwei große Nachteile. Erstens beträgt die Zeitkomplexität sowohl der Zuweisungs- als auch der Suchvorgänge O(n) (n ist die Anzahl der Schlüssel-Wert-Paare), da für beide Vorgänge zum Abgleichen das gesamte Array durchlaufen werden muss. Ein weiterer Nachteil besteht darin, dass es zu Speicherlecks kommen kann, da das Array immer einen Verweis auf jeden Schlüssel und Wert enthält. Solche Referenzen verhindern, dass der Garbage Collection-Algorithmus sie zurückfordert, selbst wenn keine anderen Referenzen vorhanden sind.

Im Gegensatz dazu enthält die native WeakMap eine „schwache Referenz“ zu jedem Schlüsselobjekt. Dies bedeutet, dass die Garbage Collection korrekt ausgeführt werden kann, wenn keine anderen Referenzen vorhanden sind. Die Struktur der nativen WeakMap ist speziell und effektiv, und der für die Zuordnung verwendete Schlüssel ist nur gültig, wenn er nicht wiederverwendet wurde.

Aufgrund dieser schwachen Referenz sind die Schlüssel von WeakMap nicht aufzählbar (es gibt keine Methode, um alle Schlüssel anzugeben). Wenn der Schlüssel aufzählbar ist, unterliegt seine Liste der Garbage Collection, was zu undefinierten Ergebnissen führt. Wenn Sie daher eine Liste der Schlüsselwerte dieses Objekttyps wünschen, sollten Sie eine Map verwenden.

Wenn Sie einem Objekt Daten hinzufügen möchten und den Speicherbereinigungsmechanismus nicht beeinträchtigen möchten, können Sie grundsätzlich WeakMap verwenden.

Eigentum

  • SchwacheMap.Länge

Der Wert der Längeneigenschaft ist 0.

  • WeakMap.prototype

Prototyp für den WeakMap-Konstruktor. Ermöglicht das Hinzufügen von Attributen zu allen WeakMap-Objekten.

WeakMap-Instanz

Alle WeakMap-Instanzen erben von WeakMap.prototype.

Eigentum

WeakMap.prototype.constructor
Gibt die Prototypfunktion zum Erstellen von WeakMap-Instanzen zurück. Die WeakMap-Funktion ist die Standardfunktion.

Verfahren

  • WeakMap.prototype.delete(Schlüssel)

Entfernen Sie das mit dem Schlüssel verknüpfte Objekt. Nach der Ausführung gibt WeakMap.prototype.has(key) false zurück.

  • WeakMap.prototype.get(Schlüssel)

Gibt das mit dem Schlüssel verknüpfte Objekt zurück, oder „undefined“ (wenn mit dem Schlüssel kein Objekt verknüpft ist).

  • WeakMap.prototype.has(Schlüssel)

Gibt einen Booleschen Wert zurück, basierend darauf, ob der Schlüssel mit dem Objekt verknüpft ist.

  • WeakMap.prototype.set(Schlüssel, Wert)

Legen Sie eine Reihe von schlüsselassoziierten Objekten in einer WeakMap fest und geben Sie dieses WeakMap-Objekt zurück.

Beispiel

Verwenden von WeakMap

const wm1 = neue WeakMap(),
   wm2 = neue WeakMap(),
   wm3 = neue WeakMap();
const o1 = {},
   o2 = Funktion(){},
   o3 = Fenster;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // Wert kann alles sein, einschließlich eines Objekts oder einer Funktion wm2.set(o3, undefiniert);
wm2.set(wm1, wm2); // Der Schlüssel und der Wert können jedes beliebige Objekt sein, sogar ein anderes WeakMap-Objekt wm1.get(o2); // "azerty"
wm2.get(o2); // undefiniert, es gibt keinen Schlüssel o2 in wm2 wm2.get(o3); // undefiniert, der Wert ist undefiniert

wm1.has(o2); // wahr
wm2.has(o2); // falsch
wm2.has(o3); // true (auch wenn der Wert nicht definiert ist)

wm3.set(o1, 37);
wm3.get(o1); // 37

wm1.has(o1); // wahr
wm1.delete(o1);
wm1.has(o1); // falsch

Implementieren Sie eine WeakMap-Klasse mit einer .clear()-Methode

Klasse ClearableWeakMap {
 Konstruktor(init) {
  this._wm = neue WeakMap(init)
 }
 klar() {
  this._wm = neue WeakMap()
 }
 löschen(k) {
  gib dies zurück._wm.delete(k)
 }
 bekomme(k) {
  gib dies zurück._wm.get(k)
 }
 hat(k) {
  gib dies zurück._wm.has(k)
 }
 setze(k, v) {
  dies._wm.set(k, v)
  gib das zurück
 }
}

Spezifikation

Spezifikation Status Kommentar
ECMAScript 2015 (6. Ausgabe, ECMA-262)
Schwache Karte
Standard Erste Definition.
ECMAScript (ECMA-262)
Schwache Karte
Lebensstandard

Oben finden Sie den detaillierten Inhalt der ausführlichen Erläuterung zur Verwendung von JavaScript WeakMap. Weitere Informationen zu JavaScript WeakMap finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Analyse der Unterschiede zwischen Object, Map und Weakmap in JavaScript
  • Detaillierte Erklärung zur Verwendung von Map- und WeakMap-Typen in JavaScript

<<:  Installieren Sie mysql5.7.17 mit RPM unter Linux

>>:  Detaillierte Erläuterung zur Konfiguration der mehrfädigen Master-Slave-Replikation von MySQL 5.7-Slaveknoten

Artikel empfehlen

Mehrere Möglichkeiten zum Sichern einer MySql-Datenbank

mysqldump-Tool-Sicherung Sichern Sie die gesamte ...

JavaScript zum Erzielen eines einfachen Countdown-Effekts

In diesem Artikelbeispiel wird der spezifische Co...

js realisiert horizontale und vertikale Slider

Als ich kürzlich an einem Übungsprojekt arbeitete...

Detaillierte Analyse der MySQL-Indexdatenstruktur

Inhaltsverzeichnis Überblick Indexdatenstruktur B...

Erste Erkundung gängiger Befehle für Docker-Anfänger

Bevor wir Docker offiziell verwenden, machen wir ...

Beispielcode zur Verwendung der Elementkalenderkomponente in Vue

Schauen Sie sich zunächst das Wirkungsdiagramm an...

Detaillierte Erklärung zur Formatierung von Zahlen in MySQL

Aus beruflichen Gründen musste ich kürzlich Zahle...

So fügen Sie eindeutige Indizes für Felder in MySQL hinzu und löschen sie

1. PRIMARY KEY hinzufügen (Primärschlüsselindex) ...

Vorgang zur Zeitzonenanpassung im Docker-Container

Wie kann ich überprüfen, ob die Zeitzone des Dock...

Analysieren der Knotenereignisschleife und der Nachrichtenwarteschlange

Inhaltsverzeichnis Was ist asynchron? Warum brauc...

Implementierungscode für den MySQL-Protokolltrigger

SQL-Anweisung DROP-TRIGGER WENN EXISTIERT sys_men...