JavaScript WeakMap and WeakSet for Memory Management

Day 41/50 – JavaScript Interview Question? Question: What is the WeakMap and WeakSet, and when should you use them? Simple Answer: WeakMap and WeakSet are collections that hold "weak" references to objects, meaning if there are no other references to an object, it can be garbage collected. Keys in WeakMap and values in WeakSet must be objects (not primitives), and they're not iterable. 🧠 Why it matters in real projects: WeakMaps prevent memory leaks when associating metadata with DOM elements or objects. They're crucial in frameworks like Vue 3 for reactivity systems, storing private data, and caching without preventing garbage collection. When an object is removed, its WeakMap entries disappear automatically. 💡 One common mistake: Trying to use primitive values as keys in WeakMap or storing primitives in WeakSet (throws TypeError). Also expecting to iterate over WeakMap/WeakSet—they don't have .forEach(), .keys(), or .size to prevent memory management interference. 📌 Bonus: // Regular Map - prevents garbage collection const map = new Map(); let obj = { data: 'large object' }; map.set(obj, 'metadata'); obj = null; // Object still in memory! (referenced by map) // WeakMap - allows garbage collection const weakMap = new WeakMap(); let obj2 = { data: 'large object' }; weakMap.set(obj2, 'metadata'); obj2 = null; // Object can be garbage collected ✓ // Practical use cases: // 1. Private data storage const privateData = new WeakMap(); class User { constructor(name, ssn) { this.name = name; privateData.set(this, { ssn }); // Private! } getSSN() { return privateData.get(this).ssn; } } // 2. DOM element metadata (prevents memory leaks) const elementMetadata = new WeakMap(); function attachMetadata(element, data) { elementMetadata.set(element, data); } const div = document.querySelector('#myDiv'); attachMetadata(div, { clicks: 0 }); // When div is removed from DOM, metadata is auto-cleaned // 3. Caching with automatic cleanup const cache = new WeakMap(); function processObject(obj) { if (cache.has(obj)) { return cache.get(obj); } const result = expensiveComputation(obj); cache.set(obj, result); return result; } // WeakSet example - tracking objects const visitedNodes = new WeakSet(); function traverse(node) { if (visitedNodes.has(node)) return; visitedNodes.add(node); // Process node... node.children.forEach(traverse); } // Limitations: // ✗ Can't use primitives weakMap.set('string', 'value'); // TypeError! // ✗ Can't iterate weakMap.forEach(...); // undefined (doesn't exist) weakMap.size; // undefined // ✗ Can't clear all at once weakMap.clear(); // undefined (doesn't exist) #JavaScript #WebDevelopment #Frontend #LearnInPublic #InterviewQuestions #Programming #TechInterviews #myDiv #WeakMap #MemoryManagement #WebDev #AdvancedJS

To view or add a comment, sign in

Explore content categories