Skip to content

Set vs WeakSet ​

Set ​

A Set is a collection of unique values.

Features ​

  • Stores primitives and objects
  • Iterable (for...of, forEach)
  • Has a size property
  • Prevents stored objects from being garbage collected

Methods ​

javascript
add()
delete()
has()
clear()

Properties ​

javascript
size

Iteration ​

javascript
keys()
values()
entries()
forEach()
for...of

WeakSet ​

A WeakSet is a collection of unique objects only.

Features ​

  • Stores objects only (arrays, functions, objects)
  • Cannot store primitives
  • Holds weak references
  • Objects are automatically removed when garbage collected
  • Not iterable
  • No size property

Methods ​

javascript
add()
delete()
has()

Weak References ​

A WeakSet does not prevent an object from being garbage collected.

Set ​

javascript
let obj = { id: 1 };

const set = new Set();
set.add(obj);

obj = null;
Set ─────► Object
  • Strong reference
  • Object remains in memory

WeakSet ​

javascript
let obj = { id: 1 };

const weakSet = new WeakSet();
weakSet.add(obj);

obj = null;
WeakSet - - -► Object
  • Weak reference
  • Object can be garbage collected
  • Entry is automatically removed

Why Is WeakSet Not Iterable? ​

The garbage collector can remove objects at any time.

If iteration were allowed, the collection could change while being traversed, leading to unpredictable behavior.

Therefore, WeakSet has:

  • No for...of
  • No forEach()
  • No keys()
  • No values()
  • No entries()
  • No size

Comparison ​

FeatureSetWeakSet
Stores primitivesYesNo
Stores objectsYesYes
Duplicate valuesNoNo
IterableYesNo
sizeYesNo
clear()YesNo
Strong referencesYesNo
Automatic garbage collectionNoYes

Use Cases ​

Use Set when: ​

  • Need unique values
  • Need iteration
  • Need collection size
  • Need to store primitives

Use WeakSet when: ​

  • Tracking objects only
  • Avoiding memory leaks
  • Tracking processed DOM elements
  • Temporary object metadata

Example:

javascript
const processed = new WeakSet();

function process(element) {
    if (processed.has(element)) return;

    processed.add(element);

    // Process element...
}