PassFront
  1. PassFront
  2. База знаний
  3. Массивы и структуры данных

В чем разница между WeakMap и Map?

Массивы и структуры данных

`WeakMap` — это коллекция «ключ–значение», где ключами могут быть только объекты, и ссылки на них слабые: они не мешают сборщику мусора удалить объект. Map держит ключи сильными ссылками.

Различия

  • Ключи: Map — любого типа; WeakMap — только объекты (и с ES2023 — незарегистрированные символы).
  • Ссылки: Map — сильные (объект-ключ не удалится, пока в Map); WeakMap — слабые (если на объект больше нет других ссылок, он и запись из WeakMap удаляются GC).
  • Итерация: Map итерируем, есть size, keys/values; WeakMap — нет итерации, size и перебора.
  • Методы: у WeakMap только get, set, has, delete.
let obj = {};
const wm = new WeakMap();
wm.set(obj, 'данные');
obj = null; // объект и запись в WeakMap станут доступны для сборки мусора

Зачем нужен WeakMap

  • Приватные данные для объектов без утечек.
  • Кеш/метаданные, привязанные к объектам, которые автоматически чистятся, когда объект больше не нужен.
const cache = new WeakMap();
function getData(obj) {
  if (!cache.has(obj)) cache.set(obj, compute(obj));
  return cache.get(obj);
}

Почему WeakMap не итерируем

Из-за слабых ссылок содержимое может исчезнуть в любой момент (GC), поэтому перечислять его нельзя.

Коротко для собеседования

WeakMap — ключи только объекты, слабые ссылки (не мешают GC): когда на объект нет других ссылок, запись удаляется автоматически. Не итерируем, нет size, только get/set/has/delete. Для приватных данных и кеша, привязанного к объектам. Map — любые ключи, сильные ссылки, итерируем.

Другие вопросы раздела