WeakSet is a special version of Set that holds objects “weakly”. This means that if an object is no longer used anywhere else, the garbage collector can remove it from WeakSet. Stores only objects, and elements cannot be iterated.
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
console.log(weakSet.has(obj)); // true
// Can't iterate!
// for (const item of weakSet) // Error!WeakSet is like a magical bag that cleans itself when things inside are no longer needed by anyone! If you put something in the bag, but nobody remembers that item anymore, the bag will throw it out by itself. This helps avoid memory leaks! 🧙
Main WeakSet features:
// Creating WeakSet
const trackedObjects = new WeakSet();
// Objects only
const obj1 = { name: 'first' };
const obj2 = { name: 'second' };
// Adding objects
trackedObjects.add(obj1);
trackedObjects.add(obj2);
// Checking existence
console.log(trackedObjects.has(obj1)); // true
console.log(trackedObjects.has(obj2)); // true
// Deletion
trackedObjects.delete(obj1);
console.log(trackedObjects.has(obj1)); // falselet obj = {};
const weakSet = new WeakSet();
weakSet.add(obj);
// When obj is no longer used
obj = null;
// Object will be automatically removed
// by garbage collector (at some point)const weakSet = new WeakSet();
const obj = {};
// add(value) — adds object
weakSet.add(obj);
// has(value) — checks object existence
const exists = weakSet.has(obj);
// delete(value) — removes object
weakSet.delete(obj);
// NO size property!
// NO clear() method!const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
// ❌ Error — can't iterate WeakSet
// for (const item of weakSet) // TypeError!
// ❌ Error — no keys(), values(), entries() methods
// weakSet.keys(); // TypeError!
// ❌ Error — no forEach
// weakSet.forEach(); // TypeError!const processedObjects = new WeakSet();
function processObject(obj) {
// Check if already processed
if (processedObjects.has(obj)) {
return 'already processed';
}
// Process object
// ... processing logic ...
// Mark as processed
processedObjects.add(obj);
return 'processed';
}const visitedNodes = new WeakSet();
function traverse(node) {
// Don't process already visited nodes
if (visitedNodes.has(node)) {
return;
}
// Mark as visited
visitedNodes.add(node);
// Process node
console.log('Processing:', node);
// Recursively process child nodes
if (node.children) {
node.children.forEach(traverse);
}
}// ❌ Error — objects only
const weakSet = new WeakSet();
// weakSet.add('string'); // TypeError!
// weakSet.add(123); // TypeError!
// weakSet.add(true); // TypeError!
// ✅ Correctly — objects only
const obj = {};
weakSet.add(obj); // works// ❌ Error — thinking WeakSet is like Set
const weakSet = new WeakSet();
const obj = {};
weakSet.add(obj);
// Can't iterate!
// weakSet.forEach(item => {}); // Error!// Regular Set vs WeakSet
const set = new Set(); // Can store any values
const weakSet = new WeakSet(); // Only objects
set.add("string"); // ✅ Works
// weakSet.add("string"); // ❌ Error!WeakSet is an excellent tool for tracking objects without risk of memory leaks! 💪
Want more articles to prepare for interviews? Subscribe to EasyAdvice, bookmark the site and improve yourself every day 💪