Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Ein WeakMap ist eine Sammlung von Schlüssel/Wert-Paaren, bei der die Schlüssel Objekte oder nicht-registrierte Symbole sein müssen, mit Werten beliebigen JavaScript-Typs. Es werden keine starken Referenzen auf die Schlüssel erstellt. Das bedeutet, dass die Anwesenheit eines Objekts als Schlüssel in einer WeakMap nicht verhindert, dass das Objekt vom Garbage Collector gesammelt wird. Sobald ein Objekt, das als Schlüssel verwendet wird, gesammelt wurde, werden seine entsprechenden Werte in jeder WeakMap ebenfalls Kandidaten für die Garbage Collection — solange sie nicht anderswo stark referenziert sind. Der einzige primitive Typ, der als Schlüssel einer WeakMap verwendet werden kann, ist das Symbol — genauer gesagt, nicht-registrierte Symbole —, da nicht-registrierte Symbole garantiert einzigartig sind und nicht erneut erstellt werden können.
WeakMap ermöglicht das Verknüpfen von Daten mit Objekten auf eine Weise, die nicht verhindert, dass die Schlüsselobjekte gesammelt werden, selbst wenn die Werte die Schlüssel referenzieren. Eine WeakMap erlaubt jedoch nicht die Beobachtung der Lebendigkeit ihrer Schlüssel, weshalb sie keine Enumeration zulässt; wenn eine WeakMap irgendeine Methode bereitstellen würde, um eine Liste ihrer Schlüssel zu erhalten, würde die Liste vom Zustand der Garbage Collection abhängen und Nicht-Determinismus einführen. Wenn Sie eine Liste von Schlüsseln haben möchten, sollten Sie eher Map als eine WeakMap verwenden.
Sie können mehr über die WeakMap im Abschnitt WeakMap-Objekt des Leitfadens zu Schlüssel-Sammlungen erfahren.
Die Schlüssel von WeakMaps müssen Garbage-Collectable sein. Die meisten primitiven Datentypen können willkürlich erstellt werden und haben keine Lebensdauer, sodass sie nicht als Schlüssel verwendet werden können. Objekte und nicht-registrierte Symbole können als Schlüssel verwendet werden, da sie Garbage-Collectable sind.
Wie bei regulären Map, basiert die Wertgleichheit auf dem SameValueZero-Algorithmus, der dem ===-Operator entspricht, da WeakMap nur Objekt- und Symbolschlüssel halten kann. Das bedeutet, dass die Gleichheit für Objektschlüssel auf der Objektidentität basiert. Sie werden durch Referenz und nicht durch Wert verglichen.
Eine Karten-API könnte in JavaScript mit zwei Arrays (einem für Schlüssel, einem für Werte) implementiert werden, die von den vier API-Methoden gemeinsam genutzt werden. Das Hinzufügen von Elementen auf dieser Karte würde gleichzeitig das Anhängen eines Schlüssels und eines Wertes an das Ende jedes dieser Arrays beinhalten. Dadurch würden die Indizes des Schlüssels und des Wertes mit beiden Arrays korrespondieren. Das Abrufen von Werten von der Karte würde das Durchlaufen aller Schlüssel zum Finden eines Übereinstimmung erfordern und dann den Index dieser Übereinstimmung verwenden, um den entsprechenden Wert aus dem Array der Werte abzurufen.
Eine solche Implementierung hätte zwei wesentliche Nachteile:
Im Gegensatz dazu referenziert ein Schlüsselobjekt in einer WeakMap seine Inhalte stark, solange der Schlüssel nicht gesammelt wird, danach jedoch nur noch schwach. Eine WeakMap:
Eine WeakMap kann eine besonders nützliche Konstruktion sein, wenn Schlüssel Informationen zugeordnet werden, die nur dann wertvoll sind, wenn der Schlüssel nicht vom Garbage Collector gesammelt wurde.
Da eine WeakMap jedoch nicht die Lebendigkeit ihrer Schlüssel beobachten lässt, sind ihre Schlüssel nicht aufzählbar. Es gibt keine Methode, eine Liste der Schlüssel zu erhalten. Wenn es eine gäbe, würde die Liste vom Zustand der Garbage Collection abhängen und Nicht-Determinismus einführen. Wenn Sie eine Liste von Schlüsseln haben möchten, sollten Sie eine Map verwenden.
Erstellt ein neues WeakMap-Objekt.
Diese Eigenschaften sind auf WeakMap.prototype definiert und werden von allen WeakMap-Instanzen geteilt.
WeakMap.prototype.constructorDie Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für WeakMap-Instanzen ist der Anfangswert der WeakMap-Konstruktor.
WeakMap.prototype[Symbol.toStringTag]Der anfängliche Wert der [Symbol.toStringTag]-Eigenschaft ist der String "WeakMap". Diese Eigenschaft wird in Object.prototype.toString() verwendet.
Entfernt den Eintrag, der durch den Schlüssel in dieser WeakMap angegeben wird.
WeakMap.prototype.get()Gibt den Wert zurück, der dem Schlüssel in dieser WeakMap entspricht, oder undefined, wenn keiner vorhanden ist.
WeakMap.prototype.getOrInsert()Gibt den Wert zurück, der dem angegebenen Schlüssel in dieser WeakMap entspricht. Ist der Schlüssel nicht vorhanden, fügt es einen neuen Eintrag mit dem Schlüssel und einem gegebenen Standardwert ein und gibt den eingefügten Wert zurück.
WeakMap.prototype.getOrInsertComputed()Gibt den Wert zurück, der dem angegebenen Schlüssel in dieser WeakMap entspricht. Ist der Schlüssel nicht vorhanden, fügt es einen neuen Eintrag mit dem Schlüssel und einem Standardwert, der aus einem gegebenen Rückruf berechnet wird, ein und gibt den eingefügten Wert zurück.
WeakMap.prototype.has()Gibt einen booleschen Wert zurück, der angibt, ob ein Eintrag mit dem angegebenen Schlüssel in dieser WeakMap existiert oder nicht.
WeakMap.prototype.set()Fügt einen neuen Eintrag mit einem angegebenen Schlüssel und Wert zu dieser WeakMap hinzu oder aktualisiert einen vorhandenen Eintrag, wenn der Schlüssel bereits existiert.
Entwickler können eine WeakMap verwenden, um private Daten einem Objekt zuzuordnen, mit folgenden Vorteilen:
Dies entspricht grob dem Folgenden unter Verwendung von privaten Feldern:
Eine WeakMap kann verwendet werden, um einem Objekt Metadaten zuzuordnen, ohne die Lebensdauer des Objekts selbst zu beeinflussen. Dies ist dem Beispiel der privaten Mitglieder sehr ähnlich, da private Mitglieder ebenfalls als externe Metadaten modelliert sind, die nicht an der prototypischen Vererbung teilnehmen.
Dieses Anwendungsbeispiel kann auf bereits erstellte Objekte erweitert werden. Zum Beispiel können wir im Web zusätzliche Daten mit einem DOM-Element verknüpfen, auf die das DOM-Element später zugreifen kann. Ein gängiger Ansatz ist, die Daten als Eigenschaft anzuhängen:
Dieser Ansatz funktioniert, hat aber einige Tücken:
Die Verwendung einer WeakMap behebt diese Probleme:
Hier kennt nur der Code, der auf clicked zugreift, den geklickten Zustand jedes Buttons, und externer Code kann die Zustände nicht ändern. Darüber hinaus werden, wenn einer der Buttons aus dem DOM entfernt wird, die zugehörigen Metadaten automatisch vom Garbage Collector gesammelt.
Sie können Objekte, die an eine Funktion übergeben werden, mit dem Ergebnis dieser Funktion verknüpfen, sodass dasselbe Objekt erneut übergeben wird und das zwischengespeicherte Ergebnis zurückgegeben werden kann, ohne die Funktion erneut auszuführen. Das ist nützlich, wenn die Funktion rein ist (d.h. sie verändert keine äußeren Objekte oder verursacht andere beobachtbare Nebeneffekte).
Dies funktioniert nur, wenn der Eingabewert Ihrer Funktion ein Objekt ist. Selbst wenn der Eingabewert nie erneut übergeben wird, bleibt das Ergebnis weiterhin im Cache, solange der Schlüssel (Eingabewert) existiert. Eine effektivere Methode ist die Verwendung einer Map in Verbindung mit WeakRef-Objekten, die es Ihnen ermöglichen, jeden Eingabewert-Typ mit seinem jeweiligen (potenziell großen) Berechnungsergebnis zu verknüpfen. Weitere Einzelheiten finden Sie im Beispiel zu WeakRefs und FinalizationRegistry.
| ECMAScript® 2027 Language Specification # sec-weakmap-objects |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.