Map, Set, WeakMap, WeakSet

↑ 2.1 JavaScript: продвинутый · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Когда Map лучше объекта и зачем нужны слабые ссылки.

Объяснение

СтруктураОсобенности
Mapключи любых типов, сохраняет порядок вставки, size, итерация, быстрая частая вставка/удаление
Setуникальные значения, has O(1)
WeakMapключи — только объекты, слабые ссылки (не мешают GC), не итерируется, нет size
WeakSetмножество объектов со слабыми ссылками
Objectключи — строки/символы, прототипные ключи, порядок сложнее
const m = new Map("a", 1);
m.set({ id: 1 }, "obj").get("a"); m.has("a"); m.delete("a"); [...m.entries()];
 
const s = new Set([1, 2, 2, 3]); s.add(4).has(2);
const union = new Set([...a, ...b]);           // + Set.union/intersection/difference (новые версии)
 
// WeakMap: приватные данные и кэш без утечек
const cache = new WeakMap();
function compute(obj) { if (!cache.has(obj)) cache.set(obj, heavy(obj)); return cache.get(obj); }   // запись исчезнет вместе с obj
 
const seen = new WeakSet();   // отметки «уже обработан» для DOM-узлов

Когда Map вместо {}: ключи не строки (объекты, числа), частые добавления/удаления, нужен размер и порядок, нет риска конфликта с прототипом. Когда Object: фиксированная структура, JSON.

Map не сериализуется JSON.stringify напрямую (Object.fromEntries(map)).

Нюансы и подводные камни

  • Ключи Map сравниваются по SameValueZero (NaN равен NaN), объекты — по ссылке.
  • Во Vue reactive(new Map()) поддерживается, но WeakMap не итерируется.
  • WeakMap ключ — только объект (или незарегистрированный символ).
  • Порядок итерации Map — по вставке.
  • Set сравнивает объекты по ссылке — дубликаты «равных» объектов не удаляются.

Практика

  1. Реализуйте LRU-кэш на Map.
  2. Сохраните метаданные DOM-узлов в WeakMap и проверьте отсутствие утечки.
  3. Посчитайте частоты слов через Map.

Вопросы с ответами

Связанные темы