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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid WebviewChrome für AndroidEdge MobileFirefox für AndroidOpera für AndroidSafari auf iOSSamsung InternetNode.js
Grundlegende UnterstützungChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 6IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung 12Firefox Android Vollständige Unterstützung 6Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
new WeakMap(iterable)Chrome Vollständige Unterstützung 38Edge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 36IE Keine Unterstützung NeinOpera Vollständige Unterstützung 25Safari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung 38Chrome Android Vollständige Unterstützung 38Edge Mobile Vollständige Unterstützung 12Firefox Android Vollständige Unterstützung 36Opera Android Vollständige Unterstützung 25Safari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
new WeakMap(null)Chrome Vollständige Unterstützung JaEdge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 37IE Vollständige Unterstützung 11Opera ? Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung JaChrome Android Vollständige Unterstützung JaEdge Mobile Vollständige Unterstützung 12Firefox Android Vollständige Unterstützung 37Opera Android ? Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
WeakMap() without new throwsChrome Vollständige Unterstützung JaEdge Vollständige Unterstützung 12Firefox Vollständige Unterstützung 42IE Vollständige Unterstützung 11Opera Vollständige Unterstützung JaSafari Vollständige Unterstützung 9WebView Android Vollständige Unterstützung JaChrome Android Vollständige Unterstützung JaEdge Mobile Vollständige Unterstützung 12Firefox Android Vollständige Unterstützung 42Opera Android Vollständige Unterstützung JaSafari iOS Vollständige Unterstützung 9Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
clear
VeraltetNicht standardisiert
Chrome Keine Unterstützung 36 — 43Edge Keine Unterstützung NeinFirefox Keine Unterstützung 20 — 46IE Vollständige Unterstützung 11Opera Keine Unterstützung 25 — 30Safari Keine Unterstützung 8 — 9WebView Android Keine Unterstützung 37 — 43Chrome Android Keine Unterstützung 36 — 43Edge Mobile Keine Unterstützung NeinFirefox Android Keine Unterstützung 20 — 46Opera Android Keine Unterstützung 25 — 30Safari iOS Keine Unterstützung 8 — 9Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung Ja
deleteChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung JaFirefox Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
getChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung JaFirefox Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
hasChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung JaFirefox Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
prototypeChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung JaFirefox Vollständige Unterstützung 6IE Vollständige Unterstützung 11Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 6Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.
setChrome Vollständige Unterstützung 36Edge Vollständige Unterstützung JaFirefox Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
IE Teilweise Unterstützung 11
Hinweise
Teilweise Unterstützung 11
Hinweise
Hinweise Returns 'undefined' instead of the 'Map' object.
Opera Vollständige Unterstützung 23Safari Vollständige Unterstützung 8WebView Android Vollständige Unterstützung 37Chrome Android Vollständige Unterstützung 36Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 6
Hinweise
Vollständige Unterstützung 6
Hinweise
Hinweise 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.
Opera Android Vollständige Unterstützung 23Safari iOS Vollständige Unterstützung 8Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.12
Vollständige Unterstützung 0.10
Deaktiviert
Deaktiviert From version 0.10: this feature is behind the --harmony runtime flag.

Legende

Vollständige Unterstützung  
Vollständige Unterstützung
Teilweise Unterstützung  
Teilweise Unterstützung
Keine Unterstützung  
Keine Unterstützung
Kompatibilität unbekannt  
Kompatibilität unbekannt
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.

See also

Schlagwörter des Dokuments und Mitwirkende

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