Для чистой функции с примитивными аргументами кэш можно построить как дерево Map; clearCache заменяет его корень.
Реализуйте функцию memoize, которая кэширует результат вызова функции для одинаковых аргументов (примитивов), и добавьте метод 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, включая его последующий отказ.