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

Для чего используется WeakMap?

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

`WeakMap` используют для приватных данных объектов и кеша/метаданных, привязанных к объектам, которые должны автоматически очищаться сборщиком мусора, когда объект больше не нужен.

Главная особенность

Ключами могут быть только объекты (и с ES2023 — незарегистрированные символы), и ссылки на них слабые — не мешают сборке мусора. Когда на объект-ключ больше нет других ссылок, запись из WeakMap удаляется автоматически:

let obj = {};
const wm = new WeakMap();
wm.set(obj, 'данные');
obj = null; // объект и запись в WeakMap собираются GC

Применения

Приватные данные объектов

Хранить данные экземпляра без утечек:

const privateData = new WeakMap();
class User {
  constructor(name) {
    privateData.set(this, { name });
  }
  getName() {
    return privateData.get(this).name;
  }
}

Кеш/мемоизация по объекту

Кеш, привязанный к объекту; чистится при сборке объекта:

const cache = new WeakMap();
function compute(obj) {
  if (!cache.has(obj)) cache.set(obj, expensive(obj));
  return cache.get(obj);
}

Метаданные для DOM-узлов

Данные, связанные с элементами, без утечек при удалении узла.

Ограничения

Не итерируется, нет size, только get/set/has/delete — из-за слабых ссылок содержимое может исчезнуть в любой момент.

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

WeakMap используют для приватных данных объектов, кеша/мемоизации по объекту-ключу и метаданных DOM-узлов — со слабыми ссылками, которые не мешают сборке мусора (запись удаляется, когда объект-ключ собран). Не итерируется, нет size. Предотвращает утечки памяти при привязке данных к объектам.

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