> Как реализовать функцию memo для кеширования результатов вызовов по аргументам в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: 1221 Systems

Стек: JavaScript

> Пример ответа

Для реализации функции memo (мемоизации) в JavaScript можно использовать замыкание и объект (или Map) для хранения кеша. Вот пример:

JAVASCRIPT
function memo(fn) {
const cache = new Map(); // или {} для объектов
return function(...args) {
const key = JSON.stringify(args); // сериализуем аргументы в строку
if (cache.has(key)) {
return cache.get(key);
}
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}
// Пример использования:
const expensiveFunction = (a, b) => {
console.log('Вычисление...');
return a + b;
};
const memoizedFn = memo(expensiveFunction);
console.log(memoizedFn(1, 2)); // Вычисление... 3
console.log(memoizedFn(1, 2)); // 3 (из кеша)

Ключевые моменты:

  • Используем Map для кеша - он эффективнее объекта для частых операций.
  • JSON.stringify создаёт ключ на основе аргументов, но не подходит для объектов с циклическими ссылками или функциями.
  • Для простых типов (числа, строки) можно использовать сам аргумент как ключ.
  • Важно учитывать контекст this через apply.

Улучшенная версия с поддержкой сложных аргументов:

JAVASCRIPT
function memo(fn, resolver) {
const cache = new Map();
return function(...args) {
const key = resolver ? resolver(...args) : args[0];
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}

Такой подход позволяет гибко настраивать генерацию ключа через опциональный resolver.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью