Start · Sprachen · JavaScript · Referenz · WeakSet

WeakSet

Klasse

Ein <code>WeakSet</code> ist eine Sammlung von garbage-collectable Werten (Objekte und nicht-registrierte Symbols), in der jeder Wert nur einmal vorkommt.

seit JavaScript ES2015 Kategorie: core

Signatur

new WeakSet() new WeakSet(iterable)

Beschreibung

Ein WeakSet ist eine Sammlung von garbage-collectable Werten, einschließlich Objekten und nicht-registrierten Symbols. Ein Wert im WeakSet darf nur einmal vorkommen. Er ist einzigartig innerhalb der Sammlung des WeakSet.

Werte von WeakSets müssen garbage-collectable sein. Die meisten primitiven Datentypen können beliebig erzeugt werden und haben keine Lebensdauer, weshalb sie nicht gespeichert werden können. Objekte und nicht-registrierte Symbols können gespeichert werden, weil sie garbage-collectable sind.

Die wichtigsten Unterschiede zum Set-Objekt sind:

  • WeakSets sind Sammlungen von ausschließlich Objekten und Symbols. Sie können keine beliebigen Werte irgendeines Typs enthalten, wie Sets dies können.
  • Das WeakSet ist weak, das bedeutet, dass Referenzen auf Objekte in einem WeakSet schwach gehalten werden. Wenn keine anderen Referenzen auf einen im WeakSet gespeicherten Wert existieren, können diese Werte durch die Garbage Collection eingesammelt werden.

Hinweis: Das bedeutet auch, dass es keine Liste der aktuell in der Sammlung gespeicherten Werte gibt. WeakSets sind nicht enumerierbar.

Key equality

Wie beim regulären Set basiert die Wertgleichheit auf dem SameValueZero-Algorithmus, der demselben Verhalten wie der ===-Operator entspricht, weil WeakSet nur Objekt- und Symbol-Werte enthalten kann. Das bedeutet, dass die Gleichheit bei Objektwerten auf der Objektidentität basiert. Sie werden per Referenz verglichen, nicht per Wert.

Parameter

Name Typ Default Beschreibung
$iterable Iterable<object>|null|undefined undefined Ein optionales iterierbares Objekt (z. B. ein Array), dessen Elemente dem WeakSet hinzugefügt werden. Jedes Element muss ein Objekt oder ein nicht registriertes Symbol sein, sonst wird ein TypeError geworfen.

Rückgabewert

Typ
WeakSet
Beschreibung
Eine neue WeakSet-Instanz, die die übergebenen Werte enthält.

Beispiele

Verwendung des WeakSet-Objekts

const ws = new WeakSet();
const foo = {};
const bar = {};

ws.add(foo);
ws.add(bar);

ws.has(foo); // true
ws.has(bar); // true

ws.delete(foo); // removes foo from the set
ws.has(foo); // false, foo has been removed
ws.has(bar); // true, bar is retained

Zirkuläre Referenzen erkennen

// Execute a callback on everything stored inside an object
function execRecursively(fn, subject, _refs = new WeakSet()) {
  // Avoid infinite recursion
  if (_refs.has(subject)) {
    return;
  }

  fn(subject);
  if (typeof subject === "object" && subject) {
    _refs.add(subject);
    for (const key in subject) {
      execRecursively(fn, subject[key], _refs);
    }
    _refs.delete(subject);
  }
}

const foo = {
  foo: "Foo",
  bar: {
    bar: "Bar",
  },
};

foo.bar.baz = foo; // Circular reference!
execRecursively((obj) => console.log(obj), foo);

// Wichtig · Fallstricke

Funktionen, die sich selbst rekursiv aufrufen, benötigen eine Möglichkeit, sich gegen zirkuläre Datenstrukturen abzusichern, indem verfolgt wird, welche Objekte bereits verarbeitet wurden. WeakSets sind hierfür ideal geeignet. Die Anzahl der Objekte oder deren Traversierungsreihenfolge ist unerheblich, weshalb ein WeakSet zum Verfolgen von Objektreferenzen besser (und performanter) geeignet ist als ein Set, insbesondere wenn eine sehr große Anzahl von Objekten beteiligt ist.

Siehe auch