Skip to content
  • WeakMap, WeakSet & WeakRef · JavaScript

WeakMap, WeakSet & WeakRef

LearnViaNotes @learnvianotes· 2 min read

Weak collections hold their keys weakly: if nothing else references a key object, it can be garbage-collected and its entry silently disappears.

Map / SetWeakMap / WeakSet
KeysAnythingObjects (and non-registered symbols) only
Keeps key alive?Yes — strong referenceNo — weak reference
Iterable / size?YesNo (contents depend on the GC)
MethodsFull APIget/set/has/delete · add/has/delete

Use case: private data / metadata per object

JavaScript
const privateData = new WeakMap();
class Person {
  constructor(name, ssn) {
    this.name = name;
    privateData.set(this, { ssn });   // disappears when the Person is collected
  }
  lastFour() { return privateData.get(this).ssn.slice(-4); }
}
const p = new Person("Asha", "123-45-6789");
console.log(p.lastFour(), p);
Output
6789 Person { name: 'Asha' }

Use case: caching without leaks

JavaScript
const cache = new WeakMap();
function expensiveSummary(obj) {
  if (cache.has(obj)) return cache.get(obj) + " (cached)";
  const result = `keys=${Object.keys(obj).length}`;
  cache.set(obj, result);
  return result;
}
const report = { a: 1, b: 2 };
console.log(expensiveSummary(report));
console.log(expensiveSummary(report));
Output
keys=2
keys=2 (cached)

WeakSet: tagging objects

JavaScript
const visited = new WeakSet();
function visit(node) {
  if (visited.has(node)) return "already visited";
  visited.add(node);
  return "visiting";
}
const node = {};
console.log(visit(node), "/", visit(node));
try {
  visited.add("string");
} catch (e) {
  console.log(e.message);
}
Output
visiting / already visited
Invalid value used in weak set

WeakRef and FinalizationRegistry (ES2021)

JavaScript
let big = { data: "large object" };
const ref = new WeakRef(big);
console.log(ref.deref()?.data);   // still alive
big = null;                       // now only weakly reachable — may be collected later
const registry = new FinalizationRegistry((label) => console.log("collected", label));
registry.register({}, "temp object");
Output
large object

Why can't you iterate a WeakMap?

Free for students and teachers

Write notes like this one

Cards for every idea, quizzes and flashcards, read aloud — on the web and your phone.

Something wrong with this note? Open it to report