Map, Set, WeakMap и WeakSet
Вопрос
Чем отличаются Map, Set, WeakMap и WeakSet? Когда что выбрать вместо обычного объекта и массива?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Map: ключи любого типа, порядок вставки, `size`, итерация
Set: уникальные значения, проверка наличия за O(1), удаление дублей
Weak-версии держат ключи слабо и не мешают сборке мусора
Weak-версии нельзя обходить, нет `size`, ключи только объекты
Сценарии Weak: метаданные объектов, кеш по объекту, пометка обработанных узлов
Объект для фиксированных записей и JSON, массив для упорядоченных списков с дублями
Что могут спросить следом
- Почему WeakMap нельзя итерировать?
- Как сравниваются ключи в Map, равен ли NaN самому себе?
- Какие новые методы появились у Set?
Разбор
Образцовый ответ: «Map это словарь, где ключом может быть что угодно, включая объекты и функции, порядок вставки сохраняется, есть size и итерация. Объекту я его предпочитаю, когда ключи динамические или не строки и когда записи часто добавляются и удаляются. Set хранит уникальные значения: проверка has работает за константное время, а [...new Set(arr)] убирает дубли. С ES2025 у Set есть union, intersection, difference и проверки подмножеств. Ключи сравниваются по SameValueZero, поэтому NaN находит сам себя. WeakMap и WeakSet держат ключи слабо: если на объект больше нет других ссылок, сборщик мусора его удалит вместе с записью. Плата за это: ключи только объекты, нет size и итерации, потому что содержимое зависит от момента сборки мусора. Я использую WeakMap для данных, привязанных к чужим объектам, например к DOM-узлам, и для мемоизации по объекту, чтобы кеш не держал объекты вечно».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.