Memoization 是通过缓存函数结果避免重复计算的优化技术,适用于纯函数;用 Map 缓存、需确保纯性、注意内存清理;示例实现用 JSON.stringify 生成 key。
Memoization 是一种通过缓存函数已计算结果来避免重复执行的优化技术,特别适合纯函数(相同输入总返回相同输出、无副作用)。
函数首次被调用时,把输入参数作为 key,返回值作为 value 存入缓存(通常是 JavaScript 对象或 Map);后续相同输入直接从缓存取值,跳过实际运算。
以下是一个轻量、通用的实现:
function memoize(fn) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args); // 简单序列化(仅适用于可 JSON 化参数)
if (cache.has(key)) {
return cache.get(key);
}
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}
使用示例:
const fibonacci = memoize(n => n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2)); fibonacci(35); // 首次较慢,但后续调用极快
JSON.stringify 无法正确处理函数、undefined、Date、RegExp、循环引用等。生产环境建议:
或 lodash.isEqual 实现深度参数比对(配合自定义 key 生成)不是所有函数都适合加 memo: