Что такое Map и Set в JavaScript
Что проверяют
Знаете ли вы, чем они лучше объекта и массива, и понимаете ли, как в них сравниваются ключи.
Как отвечать
Map это словарь, где ключом может быть что угодно, включая объект и функцию. У объекта ключи только строки и символы, число молча превращается в строку.
const cache = new Map();
cache.set(userObject, "данные"); // ключ по ссылке
cache.get(userObject);Отличия от объекта: сохраняется порядок вставки, размер берётся через size без перебора, нет унаследованных ключей из прототипа, вставка и удаление предсказуемо быстрые. Перебирается напрямую: for (const [k, v] of map).
Set это коллекция уникальных значений. Проверка вхождения через has идёт за постоянное время, а не перебором, как includes у массива. Классическое применение это дедупликация: [...new Set(arr)].
Сравнение ключей и значений идёт по SameValueZero: почти как ===, но NaN равен самому себе. Объекты сравниваются по ссылке, поэтому два одинаковых по содержимому объекта это два разных ключа.
Есть ещё WeakMap и WeakSet: держат только объекты и не мешают сборщику мусора их удалить. Годятся для приватных данных и кэша, привязанного к времени жизни объекта, но не перебираются и не имеют размера.
Где спотыкаются
Используют объект как словарь с числовыми ключами и удивляются строкам на выходе.
Ищут в массиве через includes в цикле и получают квадратичную сложность там, где Set дал бы линейную.
Считают, что Set уберёт дубли объектов по содержимому. Он сравнивает ссылки.
Не знают про WeakMap и держат кэш, который не даёт освободить память.