手写实现一个缓存函数 memoize

发布于 2023-11-24 19:25:39 字数 1517 浏览 35 评论 0

关键词:缓存函数实现、memoize 函数

用于创建一个带有缓存功能的函数。下面是一个简化版本的手写实现,展示了如何自己实现 memoize 函数:

function memoize(func) {
  const cache = {};

  return function (...args) {
    const key = JSON.stringify(args);

    if (cache[key]) {
      return cache[key];
    }

    const result = func.apply(this, args);
    cache[key] = result;

    return result;
  };
}

// 示例用法
const expensiveFunction = memoize(function (n) {
  console.log('Computing...');
  return n * 2;
});

console.log(expensiveFunction(5)); // 第一次调用,输出:Computing... 10
console.log(expensiveFunction(5)); // 第二次调用,直接从缓存中获取结果,输出:10
console.log(expensiveFunction(10)); // 新的参数,再次计算并缓存结果,输出:Computing... 20
console.log(expensiveFunction(10)); // 再次调用,直接从缓存中获取结果,输出:20

上述代码中的 memoize 函数接受一个函数 func 作为参数,并返回一个新的函数。返回的函数具有缓存的能力,即根据参数的不同缓存计算结果。

在返回的函数内部,首先将传入的参数 args 转换成一个唯一的字符串 key ,以便作为缓存对象 cache 然后检查 cache 对象中是否存在对应的缓存结果,如果存在直接返回缓存结果,否则执行原始函数 func 并将结果缓存起来。

通过这种方式,对于相同的参数,后续的调用将直接从缓存中获取结果,而不会再次执行函数。这样可以避免重复计算,提高函数的性能。

在示例中,我们创建了一个名为 expensiveFunction 的函数,并使用 memoize 进行包装。第一次调用时,函数会执行计算,并输出 "Computing..." ,结果为 10。第二次调用时,函数直接从缓存中获取结果,无需再次计算。最后两次调用分别使用了不同的参数,会触发新的计算并缓存结果。

需要注意的是,这个手写的 memoize 函数是一个简化版本,仅适用于参数为基本类型的情况。对于参数为复杂类型(如对象、数组等)的情况,需要使用更复杂的缓存键值生成方法,以确保正确的缓存行为。此外,实际的 Lodash 库中的 memoize 函数还提供了其他选项和功能,例如自定义缓存键生成函数、缓存过期时间等。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

美人迟暮

暂无简介

文章
评论
29 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文