推荐答案
// www.javascriptcn.com code example
function memoize(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;
};
}本题详细解读
1. 什么是记忆化(Memoization)?
记忆化是一种优化技术,主要用于加速程序执行。通过缓存函数的计算结果,当相同的输入再次出现时,直接返回缓存的结果,而不是重新计算。
2. 代码解析
const cache = new Map();: 创建一个Map对象cache,用于存储函数的输入和输出。return function(...args) { ... }: 返回一个新的函数,这个函数接受任意数量的参数(...args)。const key = JSON.stringify(args);: 将参数序列化为字符串,作为缓存的键。JSON.stringify用于将参数数组转换为字符串,以便在Map中作为键使用。if (cache.has(key)) { return cache.get(key); }: 检查缓存中是否已经有这个键对应的结果。如果有,直接返回缓存的结果。const result = fn.apply(this, args);: 如果缓存中没有结果,调用原始函数fn并传入参数args,计算结果。cache.set(key, result);: 将计算结果存入缓存中,以便下次相同的输入可以直接返回结果。return result;: 返回计算结果。
3. 使用示例
// www.javascriptcn.com code example
function expensiveCalculation(n) {
console.log('Calculating...');
return n * 2;
}
const memoizedCalculation = memoize(expensiveCalculation);
console.log(memoizedCalculation(5)); // 输出: Calculating... 10
console.log(memoizedCalculation(5)); // 输出: 10 (直接从缓存中获取)4. 注意事项
- 参数序列化: 使用
JSON.stringify将参数序列化为字符串作为缓存键,可能会导致某些复杂对象(如函数、循环引用等)无法正确序列化。 - 内存管理: 如果缓存的数据量过大,可能会导致内存泄漏。可以考虑使用 LRU(Least Recently Used)缓存策略来限制缓存大小。