Free Online Code Editor
Weak references for memory-efficient collections.
// WeakMap - keys must be objects
const weakMap = new WeakMap();
let obj1 = { id: 1 };
let obj2 = { id: 2 };
weakMap.set(obj1, "Value 1");
weakMap.set(obj2, "Value 2");
console.log(weakMap.get(obj1)); // "Value 1"
console.log(weakMap.has(obj2)); // true
// Garbage collection
obj1 = null; // obj1 can be garbage collected
// weakMap entry is automatically removed
// WeakSet - stores objects only
const weakSet = new WeakSet();
let user1 = { name: "Alice" };
let user2 = { name: "Bob" };
weakSet.add(user1);
weakSet.add(user2);
console.log(weakSet.has(user1)); // true
user1 = null; // Can be garbage collected
// Practical example: Private data
const privateData = new WeakMap();
class Person {
constructor(name, age) {
privateData.set(this, { name, age });
}
getName() {
return privateData.get(this).name;
}
getAge() {
return privateData.get(this).age;
}
}
const person = new Person("Charlie", 30);
console.log(person.getName()); // "Charlie"
// console.log(person.name); // undefined (truly private)
// Memoization with WeakMap
const cache = new WeakMap();
function processObject(obj) {
if (cache.has(obj)) {
console.log("Cache hit");
return cache.get(obj);
}
console.log("Processing...");
const result = { /* expensive computation */ processed: true };
cache.set(obj, result);
return result;
}
const data = { id: 1 };
processObject(data); // Processing...
processObject(data); // Cache hit
// Track object metadata
const metadata = new WeakMap();
function addMetadata(obj, meta) {
metadata.set(obj, meta);
}
function getMetadata(obj) {
return metadata.get(obj);
}
const item = { id: 1 };
addMetadata(item, { created: Date.now() });
console.log(getMetadata(item));
// Differences from Map/Set
console.log("WeakMap is not iterable");
// for (const [k, v] of weakMap) {} // Error!
console.log("WeakMap has no size property");
// console.log(weakMap.size); // undefined
console.log("WeakMap has no clear method");
// weakMap.clear(); // Error!WeakMap/WeakSet hold weak references to objects. Keys/items can be garbage collected. Not iterable, no size property. Use for caching, private data, metadata.