Выбор ответа 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 держит ключи сильными ссылками: пока объект пользователя лежит ключом в кеше, он и его статистика живут вечно, даже если приложению он больше не нужен.
Варианты ответа
WeakMap: запись исчезнет, когда объект пользователя станет недостижимымправильный ответ- Оставить
Map, сборщик мусора сам почистит записи неиспользуемых ключей - Обычный объект
{}, где ключом служит сам объектuser WeakSet: он быстрее и тоже отпускает объекты пользователей
Разбор
Map держит ключи сильными ссылками: пока объект пользователя лежит ключом в кеше, он и его статистика живут вечно, даже если приложению он больше не нужен. WeakMap ключи не удерживает, и запись пропадает вместе с объектом. Обычный объект приведёт все ключи-объекты к строке '[object Object]', и кеш сломается. WeakSet хранит только наличие объекта, значений в нём нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.