Ответ вслух Middle Современный синтаксис обновлено

Map, Set, WeakMap и WeakSet

Вопрос

Чем отличаются Map, Set, WeakMap и WeakSet? Когда что выбрать вместо обычного объекта и массива?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Map это словарь, где ключом может быть что угодно, включая объекты и функции, порядок вставки сохраняется, есть size и итерация. Объекту я его предпочитаю, когда ключи динамические или не строки и когда записи часто добавляются и удаляются.

Что должно прозвучать в ответе

  • 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 ошибок.

Термины по теме