Das WeakMap Objekt ist eine Sammlung an Schlüssel/Wert-Paaren in welcher die Schlüssel schwach referenziert sind. Die Schlüssel müssen Objekte sein und die Werte können willkürliche Werte haben.
Mehr Informationen über WeakMaps finden Sie im Bereich WeakMap object in Keyed collections.
Syntax
new WeakMap([iterable])
Parameter
iterable- Iterable ist ein Array oder ein anderes iterierbares Objekt, dessen Elemente Schlüssel/Wert-Paare (2-Element-Arrays) sind. Jedes Schlüssel-Wert-Paar wird zur neuen WeakMap hinzugefügt.
nullwird als undefiniert behandelt.
Beschreibung
Schlüssel von WeakMaps sind nur vom Typ Object . Primitive Datentypen als Schlüssel sind nicht erlaubt (z.B. kann ein Symbol kein WeakMap Schlüssel sein).
Warum WeakMap?
Eine Map-API könnte in JavaScript mit zwei Arrays (eines für Schlüssel, eines für Werte) implementiert werden, die von den vier API-Methoden gemeinsam genutzt werden. Das Setzen von Elementen auf dieser Map würde das gleichzeitige hinzufügen eines Schlüssels und Werts an das Ende jedes dieser Arrays beinhalten. Folglich würden die Indizes des Schlüssels und des Werts beiden Arrays entsprechen. Das Abrufen von Werten aus der Map würde das Durchlaufen aller Schlüssel umfassen, um eine Übereinstimmung zu finden, und dann den Index dieser Übereinstimmung verwenden, um den entsprechenden Wert aus dem Wertefeld abzurufen.
Eine solche Implementierung hätte zwei Hauptprobleme. Die erste ist eine O (n) Menge und Suche (n ist die Anzahl der Schlüssel in der Map), da beide Operationen durch die Liste der Schlüssel durchlaufen müssen, um einen passenden Wert zu finden. Die zweite Unannehmlichkeit ist ein Speicherverlust, da die Arrays sicherstellen, dass Verweise auf jeden Schlüssel und jeden Wert auf unbestimmte Zeit beibehalten werden. Diese Verweise verhindern, dass die Schlüssel als Garbage Collection erfasst werden, selbst wenn keine anderen Verweise auf das Objekt vorhanden sind. Dies würde auch verhindern, dass die entsprechenden Werte als Müll gesammelt werden.
Im Gegensatz dazu enthalten native WeakMaps "schwache" Verweise auf Schlüsselobjekte, was bedeutet, dass sie die Garbage Collection nicht verhindern, wenn es keinen anderen Verweis auf das Schlüsselobjekt geben würde. Dadurch wird auch verhindert, dass die Sammlung von Werten in der Map verhindert wird. Native WeakMaps können besonders nützliche Konstrukte sein, wenn Schlüssel zu Informationen über den Schlüssel zugeordnet werden, die nur wertvoll sind, wenn der Schlüssel nicht als Garbage Collected erfasst wurde.
Da die Referenzen schwach sind, sind WeakMap Schlüssel nicht aufzählbar (dh es gibt keine Methode, die Ihnen eine Liste der Schlüssel WeakMap ). Wenn dies der Fall wäre, würde die Liste vom Zustand der Speicherbereinigung abhängen, was zu Nicht-Determinismus führen würde. Wenn Sie eine Liste mit Schlüsseln haben möchten, sollten Sie eine Map verwenden.
Eigenschaften
WeakMap.length- Der Wert der
lengthEigenschaft ist 0. WeakMap.prototype- Repräsentiert den Prototyp des
WeakMap-Konstruktors. Ermöglicht das Hinzufügen von Eigenschaften zu allenWeakMapObjekten.
WeakMap Instanzen
Alle WeakMap Instanzen erben von WeakMap.prototype.
Eigenschaften
WeakMap.length- The value of the
lengthproperty is0. WeakMap.prototype- Represents the prototype for the
WeakMapconstructor. Allows the addition of properties to allWeakMapobjects.
Methoden
WeakMap.prototype.delete(key)- Removes any value associated to the
key.WeakMap.prototype.has(key)will returnfalseafterwards. WeakMap.prototype.get(key)- Returns the value associated to the
key, orundefinedif there is none. WeakMap.prototype.has(key)- Returns a Boolean asserting whether a value has been associated to the
keyin theWeakMapobject or not. WeakMap.prototype.set(key, value)- Sets the
valuefor thekeyin theWeakMapobject. Returns theWeakMapobject. WeakMap.prototype.clear()Removes all key/value pairs from theWeakMapobject. Note that it is possible to implement aWeakMap-like object that has a.clear()method by encapsulating aWeakMapobject that hasn't it (see example on pageWeakMap)
Beispiele
Mit WeakMap
var wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap();
var o1 = {},
o2 = function() {},
o3 = window;
wm1.set(o1, 37);
wm1.set(o2, 'azerty');
wm2.set(o1, o2); // Wert kann alles sein, einschließlich eines Objektes oder einer Funktion
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // Schlüssel und Werte können irgendein Objekt sein. Sogar WeakMaps!
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined, weil es keinen Schlüssel für o2 in wm2 gibt
wm2.get(o3); // undefined, weil dieser Wert der Auslegungswert ist
wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (auch bei einem Wert von 'undefined')
wm3.set(o1, 37);
wm3.get(o1); // 37
wm1.has(o1); // true
wm1.delete(o1);
wm1.has(o1); // false
Implementieren einer WeakMap-ähnlichen Klasse mit einer .clear() Methode
class ClearableWeakMap {
constructor(init) {
this._wm = new WeakMap(init)
}
clear() {
this._wm = new WeakMap()
}
delete(k) {
return this._wm.delete(k)
}
get(k) {
return this._wm.get(k)
}
has(k) {
return this._wm.has(k)
}
set(k, v) {
this._wm.set(k, v)
return this
}
}
Specifications
| Specification | Status | Comment |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'WeakMap' in dieser Spezifikation. |
Standard | Erste Definition. |
| ECMAScript (ECMA-262) Die Definition von 'WeakMap' in dieser Spezifikation. |
Lebender Standard |
Browser-Kompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakMap | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox Vollständige Unterstützung 6 | IE Vollständige Unterstützung 11 | Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android Vollständige Unterstützung 6 | Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
WeakMap() constructor | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox Vollständige Unterstützung 6 | IE Vollständige Unterstützung 11 | Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android Vollständige Unterstützung 6 | Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
clear | Chrome Keine Unterstützung 36 — 43 | Edge Keine Unterstützung Nein | Firefox Keine Unterstützung 20 — 46 | IE Vollständige Unterstützung 11 | Opera Keine Unterstützung 25 — 30 | Safari Keine Unterstützung 8 — 9 | WebView Android Keine Unterstützung 37 — 43 | Chrome Android Keine Unterstützung 36 — 43 | Firefox Android Keine Unterstützung 20 — 46 | Opera Android Keine Unterstützung 25 — 30 | Safari iOS Keine Unterstützung 8 — 9 | Samsung Internet Android Keine Unterstützung 3.0 — 4.0 | nodejs Keine Unterstützung 0.12 — 4.0.0 |
delete | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
6
| IE Vollständige Unterstützung 11 | Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android
Vollständige Unterstützung
6
| Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
get | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
6
| IE Vollständige Unterstützung 11 | Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android
Vollständige Unterstützung
6
| Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
has | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
6
| IE Vollständige Unterstützung 11 | Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android
Vollständige Unterstützung
6
| Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
set | Chrome Vollständige Unterstützung 36 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
6
| IE
Teilweise Unterstützung
11
| Opera Vollständige Unterstützung 23 | Safari Vollständige Unterstützung 8 | WebView Android Vollständige Unterstützung 37 | Chrome Android Vollständige Unterstützung 36 | Firefox Android
Vollständige Unterstützung
6
| Opera Android Vollständige Unterstützung 24 | Safari iOS Vollständige Unterstützung 8 | Samsung Internet Android Vollständige Unterstützung 3.0 | nodejs
Vollständige Unterstützung
0.12
|
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Teilweise Unterstützung
- Teilweise Unterstützung
- Keine Unterstützung
- Keine Unterstützung
- Nicht standardisiert. Erwarte schlechte browserübergreifende Unterstützung.
- Nicht standardisiert. Erwarte schlechte browserübergreifende Unterstützung.
- Veraltet. Nicht für den Einsatz in neuen Webseiten gedacht.
- Veraltet. Nicht für den Einsatz in neuen Webseiten gedacht.
- Siehe Implementierungshinweise.
- Siehe Implementierungshinweise.
- Benutzer muss dieses Feature explizit aktivieren.
- Benutzer muss dieses Feature explizit aktivieren.