You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

该函数是否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:32:31