Выбор ответа Middle Память и сборка мусора обновлено

Map или WeakMap для кеша по объекту

Вопрос

Функция кеширует тяжёлый расчёт для объектов-пользователей. Пользователей постоянно загружают и выбрасывают. Что лучше использовать для кеша?

const cache = new Map();
function getStats(user) {
  if (!cache.has(user)) cache.set(user, computeStats(user));
  return cache.get(user);
}

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: WeakMap: запись исчезнет, когда объект пользователя станет недостижимым. Map держит ключи сильными ссылками: пока объект пользователя лежит ключом в кеше, он и его статистика живут вечно, даже если приложению он больше не нужен.

Варианты ответа

  1. WeakMap: запись исчезнет, когда объект пользователя станет недостижимымправильный ответ
  2. Оставить Map, сборщик мусора сам почистит записи неиспользуемых ключей
  3. Обычный объект {}, где ключом служит сам объект user
  4. WeakSet: он быстрее и тоже отпускает объекты пользователей

Разбор

Map держит ключи сильными ссылками: пока объект пользователя лежит ключом в кеше, он и его статистика живут вечно, даже если приложению он больше не нужен. WeakMap ключи не удерживает, и запись пропадает вместе с объектом. Обычный объект приведёт все ключи-объекты к строке '[object Object]', и кеш сломается. WeakSet хранит только наличие объекта, значений в нём нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.