WeakMap & WeakSet
📖 Concept
WeakMap and WeakSet are like Map and Set, but with weakly held references — meaning they don't prevent garbage collection of their keys.
| Feature | Map/Set | WeakMap/WeakSet |
|---|---|---|
| Key types | Any | Objects only |
| Enumerable | Yes (iterable) | No |
| Size property | Yes | No |
| GC behavior | Prevents GC | Allows GC |
🏠 Real-world analogy: A WeakMap is like a sticky note on a file folder. When the folder (object) is thrown away, the sticky note (WeakMap entry) automatically disappears — no cleanup needed.
💻 Code Example
1// WeakMap — keys must be objects, auto-GC'd2const cache = new WeakMap();3function processData(obj) {4 if (cache.has(obj)) return cache.get(obj);5 const result = { /* expensive computation */ processed: true };6 cache.set(obj, result);7 return result;8}9let data = { name: "Alice" };10processData(data);11data = null; // The WeakMap entry is eligible for GC!1213// Private data pattern with WeakMap14const privateData = new WeakMap();15class User {16 constructor(name, password) {17 this.name = name;18 privateData.set(this, { password });19 }20 checkPassword(input) {21 return privateData.get(this).password === input;22 }23}24const user = new User("Alice", "secret");25console.log(user.checkPassword("secret")); // true26console.log(user.password); // undefined (truly private!)2728// WeakSet — track objects without preventing GC29const visited = new WeakSet();30function processNode(node) {31 if (visited.has(node)) return; // Already processed32 visited.add(node);33 // Process node...34}3536// DOM element metadata37const elementData = new WeakMap();38function track(element) {39 elementData.set(element, {40 clicks: 0,41 lastClicked: null42 });43 element.addEventListener("click", () => {44 const data = elementData.get(element);45 data.clicks++;46 data.lastClicked = new Date();47 });48}49// When element is removed from DOM, data is auto-cleaned!
🏋️ Practice Exercise
Mini Exercise:
- Use WeakMap to cache computed values for objects
- Implement a visited-tracker for graph traversal using WeakSet
- Create a "mark as read" system for notifications using WeakSet
- Build a memoizer for object-keyed functions using WeakMap
⚠️ Common Mistakes
WeakMap/WeakSet keys MUST be objects — primitives like strings or numbers don't work
WeakMaps are NOT iterable — you can't use
forEach,keys(),values(), orentries()WeakMap has no
.sizeproperty — you can't know how many entries it hasYou can't clear a WeakMap — there's no
.clear()method (or it's non-standard)Thinking WeakMap entries are deleted immediately — GC timing is unpredictable
💼 Interview Questions
🎤 Mock Interview
Mock interview is powered by AI for WeakMap & WeakSet. Login to unlock this feature.