WeakMap and WeakSet
WeakMap and WeakSet are special data structures in JavaScript (introduced in ES6) that behave similarly to Map and Set, but with one crucial difference: they hold "weak" references to their keys (WeakMap) or values (WeakSet).
1. WeakMap
A WeakMap is a collection of key/value pairs where the keys must be objects and the values can be arbitrary values.
Key Features
- Weak References: The references to the key objects are held "weakly". If there are no other references to the key object, it can be garbage collected.
- Keys must be Objects: You cannot use primitive values (string, number, boolean) as keys.
- Not Iterable: You cannot loop over a WeakMap (
forEach,for...of) or get its size (.size). This is because the garbage collector decides when to remove items, so the state is non-deterministic.
Syntax
let weakMap = new WeakMap();
let obj = { name: "Object" };
weakMap.set(obj, "some value");
console.log(weakMap.get(obj)); // "some value"
obj = null;
// The object is now eligible for garbage collection.
// Once collected, the entry in weakMap is automatically removed.
Use Case: Private Data
Before private class fields (#field), WeakMaps were used to store private data for objects without exposing it or causing memory leaks.
const privateData = new WeakMap();
class User {
constructor(name) {
privateData.set(this, { name: name });
}
getName() {
return privateData.get(this).name;
}
}
2. WeakSet
A WeakSet is a collection of objects, similar to Set, but the objects are held weakly.
Key Features
- Weak References: Objects in the set can be garbage collected if there are no other references to them.
- Values must be Objects: You cannot store primitives.
- Not Iterable: No
size,forEach, etc.
Syntax
let weakSet = new WeakSet();
let obj = { data: 1 };
weakSet.add(obj);
console.log(weakSet.has(obj)); // true
obj = null;
// obj is removed from weakSet automatically when GC runs.
3. Summary Differences
| Feature | Map / Set | WeakMap / WeakSet |
|---|---|---|
| Keys/Values | Any type (primitives & objects) | Objects only |
| References | Strong (prevents GC) | Weak (allows GC) |
| Iterable | Yes (keys(), values(), loop) |
No |
| Size property | Yes (.size) |
No |
programming/javascript/vanilla/javascript programming/javascript/vanilla/es6-features programming/javascript/vanilla/data-types