В чем разница между 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 — любые ключи, сильные ссылки, итерируем.