[Medium] 手写函式缓存 (cache function)
2023年1月7日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
在写程式时,如果不想做重复的复杂运算,我们经常会透过缓存 (cache) 来实现。缓存的意思是先把过去已经运算过的输出存起来,如果之后有同样的输入,未来就不用再运算一次,而是直接从缓存拿之前算过的,这能有效省去时间。因为缓存很好用,在实际工作上经常会用到,这也让缓存函式成了常考的面试题目。
手写函式缓存
以下是手写版本的缓存,可以先试着自行理解,往下滑会有注解的版本
function cached(fn) {
const cache = {};
return (...args) => {
const key = JSON.stringify(args);
if (key in cache) {
return cache[key];
} else {
const val = fn(...args);
cache[key] = val;
return val;
}
};
}
如果上面的版本没有很懂,让我们一起来看看解说的版本
function cached(fn) {
// 声明一个 cache 物件,透过 cache 来放缓存的东西
// 因为闭包的缘故,下面回传的函式可以存取到这个 cache 变数
const cache = {};
// 透过扩展运算符,拿到引数
return (...args) => {
// 将引述当作缓存的 key
const key = JSON.stringify(args);
// 查看现在的缓存有没有这个 key,有的话就不用再算,直接回传
if (key in cache) {
return cache[key];
} else {
// 没有的话,就把收到引数带入,运算出结果
const val = fn(...args);
// 把结果放入缓存,下次有同样的 key 就不用重新运算
cache[key] = val;
return val;
}
};
}