Signatur
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, wieSets dies können.- Das
WeakSetist weak, das bedeutet, dass Referenzen auf Objekte in einemWeakSetschwach gehalten werden. Wenn keine anderen Referenzen auf einen imWeakSetgespeicherten 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
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
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.