题目链接
思路
题目所提到 === 相等才给出缓存的结果,那么我们用 hash 的想法,给每个参数记录下来
=== 对于简单数据类型 ------ 值相等 ,类型相等即可 对于复杂数据类型 ------ 需要是指向同一个对象
这里采取的 hash 是拿 map 的 size 进行记录到 idPool 这个map里面,表示参数是否已经记录过了
最后 我们给 传递进来的参数 hash 在 代码里面也就是 getId 一下,拼接对应的 id 成一个 字符串即可
题解
javascript
/**
* @param {Function} fn
* @return {Function}
*/
function memoize(fn) {
let cache = new Map()
let idPool = new Map()
function getId(obj) {
if (idPool.has(obj)) {
return idPool.get(obj)
}
let id = idPool.size
idPool.set(obj, id)
return id
}
return function () {
const key = Object.values(arguments).map(getId).join('-')
if (cache.has(key)) {
return cache.get(key)
}
let value = fn.apply(this, Object.values(arguments))
cache.set(key, value)
return value
}
}
/**
* let callCount = 0;
* const memoizedFn = memoize(function (a, b) {
* callCount += 1;
* return a + b;
* })
* memoizedFn(2, 3) // 5
* memoizedFn(2, 3) // 5
* console.log(callCount) // 1
*/