JavaScript缓存函数的核心是用对象或Map缓存参数组合与结果,相同输入直接返回缓存值;适用于纯函数如斐波那契、阶乘等;基础版支持单基本类型参数,增强版用JSON.stringify处理多参但有局限,生产级推荐Map加自定义键生成器,并注意纯函数约束、内存泄漏和异步缓存等问题。

JavaScript中实现缓存函数(即记忆化,Memoization)的核心思路是:**用对象或Map缓存已计算过的参数组合与对应结果,下次遇到相同输入时直接返回缓存值,跳过重复计算**。它特别适合纯函数(相同输入总得相同输出、无副作用),比如斐波那契、阶乘、解析复杂JSON结构等场景。
最简单的情况是函数只接收一个基本类型参数(如 number、string)。这时可直接用参数作键:
function memoize(fn) {
const cache = {};
return function(arg) {
if (arg in cache) {
return cache[arg];
}
const result = fn(arg);
cache[arg] = result;
return result;
};
}
<p>// 使用示例
const fib = memoize(n => n <= 1 ? n : fib(n - 1) + fib(n - 2));
console.log(fib(10)); // 快速返回 55
{a:1} 和 {a:1} 会变成相同字符串 "[object Object]")多个参数时,常用 JSON.stringify([...arguments]) 生成唯一键:
function memoizeMulti(fn) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) {
return cache.get(key);
}
const result = fn(...args);
cache.set(key, result);
return result;
};
}
JSON.stringify 有局限:忽略函数、undefined、Symbol;不区分 {a:1,b:2} 和 {b:2,a:1}(属性顺序影响键);性能开销略大;不能处理循环引用更健壮的做法是用 Map 存储,并为参数设计稳定、可比较的键。常见策略包括:
立即学习“Java免费学习笔记(深入)”;
typeof 判断后分别处理:基本类型直接用,对象用 Object.is 或 === 比较引用,或用弱映射(WeakMap)缓存对象实例lodash.memoize(支持自定义 resolver 函数)简化的安全多参版(适用于无嵌套对象的场景):
function memoizeSafe(fn) {
const cache = new Map();
return function(...args) {
// 用参数类型+值拼接成唯一键(避免 JSON 的坑)
const key = args.map(a =>
typeof a === 'object' && a !== null
? `${typeof a}_${a.constructor.name}_${Object.keys(a).sort().join(',')}`
: `${typeof a}_${String(a)}`
).join('|');
<pre class="brush:php;toolbar:false;">if (cache.has(key)) {
return cache.get(key);
}
const result = fn(...args);
cache.set(key, result);
return result;}; }
记忆化不是万能的,用前需确认:
lru-cache 或自己封装 Map + 链表)基本上就这些。记住核心:缓存是空间换时间,关键在“键要唯一且稳定”,其余都是围绕它做取舍。
以上就是JavaScript中如何实现缓存函数_记忆化技术的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号