Коллекции: Map, Set, WeakMap, WeakSet

Map, Set, WeakMap, WeakSet — чем отличаются от объектов и массивов и когда какую брать.

Map — коллекция пар ключ-значение с ключами любого типа; Set — коллекция уникальных значений.

Map: словарь с ключами любого типа

В обычном объекте ключи — только строки и символы, а порядок и наличие лишних свойств из прототипа создают сюрпризы. Map лишён этих проблем: ключом может быть что угодно (включая объект), порядок вставки сохраняется, размер берётся через .size:

const m = new Map();
m.set("one", 1);
m.set("two", 2);
const keyObj = { id: 42 };
m.set(keyObj, "значение по объекту-ключу");

console.log("размер:", m.size);
console.log("two ->", m.get("two"));
console.log("объект ->", m.get(keyObj));
console.log("есть one?", m.has("one"));
for (const [k, v] of m) {
  if (typeof k === "string") console.log(k + " = " + v);
}

Вывод:

размер: 3
two -> 2
объект -> значение по объекту-ключу
есть one? true
one = 1
two = 2

Set: уникальные значения

Set хранит только уникальные значения — удобный способ убрать дубликаты из массива одной строкой:

const nums = [1, 2, 2, 3, 3, 3, 4];
const unique = new Set(nums);
console.log("уникальные:", [...unique].join(", "));
console.log("размер:", unique.size);
unique.add(5);
unique.delete(1);
console.log("после правок:", [...unique].join(", "));
console.log("есть 3?", unique.has(3));

Вывод:

уникальные: 1, 2, 3, 4
размер: 4
после правок: 2, 3, 4, 5
есть 3? true

WeakMap и WeakSet: слабые ссылки

«Слабые» коллекции хранят ключи (только объекты) по слабой ссылке: если на объект-ключ больше никто не ссылается, сборщик мусора его удалит, а запись из WeakMap исчезнет автоматически. Поэтому они не итерируются и не имеют .size — содержимое непредсказуемо во времени.

Главные применения: приватные данные объектов (как в уроке про замыкания) и кэширование/метаданные, привязанные к объектам, без утечек памяти.

Шпаргалка по выбору

СтруктураКогда брать
Objectфиксированный набор строковых ключей, запись/конфиг, сериализация в JSON
Mapдинамический словарь, ключи не только строки, важен порядок и .size
Setуникальные значения, быстрая проверка «есть ли», устранение дублей
WeakMapметаданные/кэш по объекту с автоочисткой; приватные поля
WeakSetотметить набор объектов («уже обработан») без утечки памяти

Итог

  • Map — словарь с любыми ключами и сохранением порядка; Set — уникальные значения.
  • Weak-версии держат объекты слабо, не мешают сборке мусора, не итерируются.
  • Объект — для конфигов и JSON; Map/Set — для динамических данных и проверок уникальности.
Проверьте себя
1. Чем Map принципиально отличается от обычного объекта?
AMap быстрее всегда
BКлючом Map может быть значение любого типа, включая объект
CMap нельзя сериализовать
DMap не сохраняет порядок
2. Как одной строкой убрать дубликаты из массива nums?
Anums.unique()
B[...new Set(nums)]
CArray.dedupe(nums)
Dnums.filter(Boolean)
3. Почему WeakMap нельзя перебрать и у него нет .size?
AЭто баг спецификации
BКлючи держатся слабо и могут исчезнуть при сборке мусора, содержимое непредсказуемо
CОн хранит только числа
DОн работает только в Node
Поддержать проект