🗑️

How to Use WeakMap and WeakSet

JavaScriptAdvanced

Weak references for memory-efficient collections.

Code Example

JavaScript
// 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!

Explanation

WeakMap/WeakSet hold weak references to objects. Keys/items can be garbage collected. Not iterable, no size property. Use for caching, private data, metadata.

Related Tutorials