JavaScript Memoization 是手动实现的缓存策略,通过 Map 存储参数序列化后的输入输出映射,避免重复计算;但需注意对象/数组键处理、适用场景及性能权衡。
JavaScript Memoization 不是语言内置功能,而是一种手动实现的缓存策略:对相同输入反复调用函数时,跳过重复计算,直接返回之前缓存的结果。
核心逻辑很简单:用一个对象(或 Map)存 input → output 映射。每次调用前先查缓存,命中就返回;没命中就执行原函数、存结果、再返回。
常见错误是把对象或数组当 key 直接用 —— 它们会被转成 "[object Object]",导致所有对象输入都撞同一个缓存项。
string、number、boolean、symbol)做简单键生成JSON.stringify(注意:不能处理函数、undefined、循环引用)lodash.memoize 或 fast-memoize,它们已处理了深比较、this 绑定、maxSize 限制等问题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;
};
}
useMemo 和 React.memo 是 React 的优化手段,但和传统 Memoization 有本质区别:
useMemo 只在依赖数组变化时重新计算,不保证「相同输入必得相同输出」—— 它不校验参数值,只看依赖引用是否变React.memo 是对组件的浅层 props 比较,跳过 render,不是函数计算缓存缓存本身有开销:序列化参数、查表、内存占用。如果函数本身极快(如 a + b),或输入几乎从不重复,加 memoize 就是负优化。
真正难的不是写个 memoize,而是判断哪些函数值得缓存、缓存多久、要不要自动失效——这些得结合业务数据特征来定,没法靠工具自动解决。