Das WeakMap Objekt ist eine Sammlung an Schlüssel/Wert-Paaren in welche 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. null wird 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 length Eigenschaft ist 0.
WeakMap.prototype
Repräsentiert den Prototyp des WeakMap -Konstruktors. Ermöglicht das Hinzufügen von Eigenschaften zu allen WeakMap Objekten.

WeakMap Instanzen

Alle WeakMap Instanzen erben von WeakMap.prototype.

Eigenschaften

WeakMap.prototype.constructor
Returns the function that created an instance's prototype. This is the WeakMap function by default.

Methoden

WeakMap.prototype.delete(key)
Removes any value associated to the key. WeakMap.prototype.has(key) will return false afterwards.
WeakMap.prototype.get(key)
Returns the value associated to the key, or undefined if there is none.
WeakMap.prototype.has(key)
Returns a Boolean asserting whether a value has been associated to the key in the WeakMap object or not.
WeakMap.prototype.set(key, value)
Sets the value for the key in the WeakMap object. Returns the WeakMap object.
WeakMap.prototype.clear()
Removes all key/value pairs from the WeakMap object. Note that it is possible to implement a WeakMap-like object that has a .clear() method by encapsulating a WeakMap object that hasn't it (see example on page WeakMap)

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 Latest Draft (ECMA-262)
Die Definition von 'WeakMap' in dieser Spezifikation.
Entwurf  

Browser-Kompatibilität

FunktionChromeEdgeFirefoxInternet ExplorerOperaSafari
Grundlegende Unterstützung3612611238
new WeakMap(iterable)381236 Nein259
new WeakMap(null) Ja123711 ?8
WeakMap() without new throws Ja124211 Ja9
clear36 — 43 Nein20 — 461125 — 308 — 9
delete36 Ja6111238
get36 Ja6211238
has36 Ja6111238
prototype36 Ja611238
set36 Ja61113238
FunktionAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Grundlegende Unterstützung3636126238 Ja
new WeakMap(iterable)38381236259 Ja
new WeakMap(null) Ja Ja1237 ?8 Ja
WeakMap() without new throws Ja Ja1242 Ja9 Ja
clear36 — 4336 — 43 Nein20 — 4625 — 308 — 9 Ja
delete3636 Ja61238 Ja
get3636 Ja62238 Ja
has3636 Ja61238 Ja
prototype3636 Ja6238 Ja
set3636 Ja61238 Ja

1. Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.

2. Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.

3. Returns 'undefined' instead of the 'Map' object.

See also

Schlagwörter des Dokuments und Mitwirkende

Mitwirkende an dieser Seite: jakobpack
Zuletzt aktualisiert von: jakobpack,