const memorize = function(fn) {
const cache = {} // 存储缓存数据的对象
return function() { //扩展运算符还可以将字符串转为真正的数组。// 这里用到数组的扩展运算符
let args = [...arguments];
let _args=JSON.stringify(args)// 将参数作为cache的key
return cache[_args]||(cache[_args]=fn.apply(fn,args))// 如果已经缓存过,直接取值。否则重新计算并且缓存
}
}
const add = function() {
console.log('开始缓存')
let arr = [...arguments]
return arr.reduce((a,b)=>a+b);
}
const adder = memorize(add)
// 只有第一次会输出‘开始缓存’, 之后只要参数想同,每次取值都会在缓存里取。
// 这里需要注意一下cache不可以是Map数据结构,因为Map的键是使用===比较的,
// [1]!==[1],因此即使传入相同的对象或者数组,那么还是被存为不同的键。
console.log(adder(2, 6)) // 输出结果: 开始缓存 8 // cache: { '[2, 6]': 8 }
console.log(adder(2, 6)) // 输出结果: 8 //cache: { '[2, 6]': 8 }
console.log(adder(10, 10)) // 输出结果: 开始缓存 20 // cache: { '[2, 6]': 8, '[10, 10]': 20 }
JS实现缓存函数
于 2022-05-04 09:08:18 首次发布