The WeakSet
object lets you store weakly held objects in a collection.
The WeakSet
object lets you store weakly held objects in a collection.
WeakSet
objects are collections of objects. Just as with Set
s, each object in a WeakSet
may occur only once; all objects in a WeakSet
's collection are unique.
The main differences to the Set
object are:
WeakSet
s are collections of objects only. They cannot contain arbitrary values of any type, as Set
s can.WeakSet
is weak, meaning references to objects in a WeakSet
are held weakly. If no other references to an object stored in the WeakSet
exist, those objects can be garbage collected. Note: This also means that there is no list of current objects stored in the collection. WeakSets
are not enumerable.
Functions that call themselves recursively need a way of guarding against circular data structures by tracking which objects have already been processed.
WeakSet
s are ideal for this purpose:
// 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") { _refs.add(subject); for (const key in subject) { execRecursively(fn, subject[key], _refs); } } } const foo = { foo: "Foo", bar: { bar: "Bar", }, }; foo.bar.baz = foo; // Circular reference! execRecursively((obj) => console.log(obj), foo);
Here, a WeakSet
is created on the first run, and passed along with every subsequent function call (using the internal _refs
parameter).
The number of objects or their traversal order is immaterial, so a WeakSet
is more suitable (and performant) than a Set
for tracking object references, especially if a very large number of objects is involved.
WeakSet()
Creates a new WeakSet
object.
WeakSet.prototype.add()
Appends value
to the WeakSet
object.
WeakSet.prototype.delete()
Removes value
from the WeakSet
. WeakSet.prototype.has(value)
will return false
afterwards.
WeakSet.prototype.has()
Returns a boolean asserting whether value
is present in the WeakSet
object or not.
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
Note that foo !== bar
. While they are similar objects, they are not the same object. And so they are both added to the set.
Specification |
---|
ECMAScript Language Specification # sec-weakset-objects |
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | Deno | Node.js | |
WeakSet |
36 |
12 |
34 |
No |
23 |
9 |
37 |
36 |
34 |
24 |
9 |
3.0 |
1.0 |
0.12.0 |
WeakSet |
36 |
12 |
34 |
No |
23 |
9 |
37 |
36 |
34 |
24 |
9 |
3.0 |
1.0 |
0.12.0 |
add |
36 |
12 |
34 |
No |
23 |
9 |
37 |
36 |
34 |
24 |
9 |
3.0 |
1.0 |
0.12.0 |
delete |
36 |
12 |
34 |
No |
23 |
9 |
37 |
36 |
34 |
24 |
9 |
3.0 |
1.0 |
0.12.0 |
has |
36 |
12 |
34 |
No |
23 |
9 |
37 |
36 |
34 |
24 |
9 |
3.0 |
1.0 |
0.12.0 |
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet