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

codeTap to expand ⛶
1// WeakMap — keys must be objects, auto-GC'd
2const 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!
12
13// Private data pattern with WeakMap
14const 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")); // true
26console.log(user.password); // undefined (truly private!)
27
28// WeakSet — track objects without preventing GC
29const visited = new WeakSet();
30function processNode(node) {
31 if (visited.has(node)) return; // Already processed
32 visited.add(node);
33 // Process node...
34}
35
36// DOM element metadata
37const elementData = new WeakMap();
38function track(element) {
39 elementData.set(element, {
40 clicks: 0,
41 lastClicked: null
42 });
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:

  1. Use WeakMap to cache computed values for objects
  2. Implement a visited-tracker for graph traversal using WeakSet
  3. Create a "mark as read" system for notifications using WeakSet
  4. 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(), or entries()

  • WeakMap has no .size property — you can't know how many entries it has

  • You 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.