Реализуйте функцию memoize, которая кэширует результат вызова функции для одинаковых аргументов (примитивов), и добавьте метод clearCache для очистки кэша.

Для чистой функции с примитивными аргументами кэш можно построить как дерево Map; clearCache заменяет его корень.

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

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

Для чистой функции с примитивными аргументами кэш можно построить как дерево Map; clearCache заменяет его корень.

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

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

Для чистой функции с примитивными аргументами кэш можно построить как дерево Map; clearCache заменяет его корень.

Каждый уровень соответствует одному аргументу, поэтому нет коллизий строковой сериализации. Здесь NaN равен NaN, но 0 и -0 различаются; функции, зависящие от this или внешнего состояния, не входят в контракт.

function memoize(fn) {
  const NEGATIVE_ZERO = Symbol();
  const node = () => ({ next: new Map(), ready: false, value: undefined });
  let root = node();
  function memoized(...args) {
    let current = root;
    for (const arg of args) {
      if ((typeof arg === 'object' && arg !== null) || typeof arg === 'function') {
        throw new TypeError('Ожидаются примитивы');
      }
      const key = Object.is(arg, -0) ? NEGATIVE_ZERO : arg;
      if (!current.next.has(key)) current.next.set(key, node());
      current = current.next.get(key);
    }
    if (!current.ready) {
      current.value = fn(...args);
      current.ready = true;
    }
    return current.value;
  }
  memoized.clearCache = () => { root = node(); };
  return memoized;
}

undefined тоже кэшируется. Синхронное исключение не сохраняется; если результат — Promise, кэшируется сам Promise, включая его последующий отказ.

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

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

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

Подробнее