该函数是否为memoïze函数?其次它的性能是否高效?
关于你的memoize函数疑问解答
嘿,咱们一步步来拆解你的问题:
1. 这是不是一个memoize函数?
是的,它确实属于memoize函数的范畴——核心逻辑就是缓存func的调用结果,当传入相同的value时,直接返回之前缓存的结果,避免重复执行目标函数。不过它的实现比较基础,还有不少可以优化的空间。
2. 它的性能高效吗?
答案是不够高效,主要问题出在缓存查找环节:
- 你用
array.findIndex()遍历数组匹配value,这个操作的时间复杂度是O(n)——当缓存的结果越来越多时,每次查找的耗时会线性增长。 - 业界常用的memoize实现会用对象或者Map存储缓存,它们的查找操作是O(1)级别的,不管缓存多少项,查找速度都能保持稳定。
3. 如何解决“每次调用存储两个数据项”的冗余问题?
你觉得存{lastValue, lastResult}这种对象多余是完全合理的,其实我们可以直接用键值对的方式存储:把value作为键,对应的result作为值,这样就不用额外包装成对象了。
这里给你两个优化后的实现版本:
版本1:用ES6 Map实现(推荐,支持任意类型的key)
function memoize(func) { const cache = new Map(); return (value) => { if (cache.has(value)) { return cache.get(value); } const result = func(value); cache.set(value, result); return result; }; }
版本2:用普通对象实现(兼容旧环境,注意复杂类型key的处理)
function memoize(func) { const cache = {}; return (value) => { // 注意:如果value是对象/数组等复杂类型,需要序列化避免缓存冲突 const key = JSON.stringify(value); if (cache.hasOwnProperty(key)) { return cache[key]; } const result = func(value); cache[key] = result; return result; }; }
总结一下:你的原始实现是合格的memoize,但性能和简洁性都有提升空间,换成Map/对象存储缓存会更高效也更符合你的需求。
内容的提问来源于stack exchange,提问作者seventeen
相关产品推荐
相关产品推荐

