Усложнение задачи с memoize: сделать так, чтобы функция memoize вторым аргументом получала время жизни кэша в миллисекундах, после истечения которого кэш инвалидируется.

Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.

Короткий ответ

Что ответить на собеседовании

Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.

Подробный разбор

Ответ с пояснениями

Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.

Пример для чистой синхронной функции одного аргумента; объекты сравниваются по ссылке:

function memoize(fn, ttlMs) {
  if (!Number.isFinite(ttlMs) || ttlMs < 0) throw new RangeError('ttlMs');
  const cache = new Map();
  return function (arg) {
    const hit = cache.get(arg);
    if (hit && Date.now() < hit.expiresAt) return hit.value;
    cache.delete(arg);
    const value = fn(arg);
    cache.set(arg, { value, expiresAt: Date.now() + ttlMs });
    return value;
  };
}

Инвалидация ленивая: просроченная запись удаляется при следующем обращении. Для неограниченного числа ключей отдельно нужна очистка памяти; this, несколько аргументов и Promise требуют расширения контракта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее