前端手写代码面试题
目录

实现一个函数 memoize(fn),对函数进行记忆化处理

· 约 3 分钟读完 · 第 33 / 125 章

推荐答案

本题详细解读

1. 什么是记忆化(Memoization)?

记忆化是一种优化技术,主要用于加速程序执行。通过缓存函数的计算结果,当相同的输入再次出现时,直接返回缓存的结果,而不是重新计算。

2. 代码解析

  • const cache = new Map();: 创建一个 Map 对象 cache,用于存储函数的输入和输出。
  • return function(...args) { ... }: 返回一个新的函数,这个函数接受任意数量的参数(...args)。
  • const key = JSON.stringify(args);: 将参数序列化为字符串,作为缓存的键。JSON.stringify 用于将参数数组转换为字符串,以便在 Map 中作为键使用。
  • if (cache.has(key)) { return cache.get(key); }: 检查缓存中是否已经有这个键对应的结果。如果有,直接返回缓存的结果。
  • const result = fn.apply(this, args);: 如果缓存中没有结果,调用原始函数 fn 并传入参数 args,计算结果。
  • cache.set(key, result);: 将计算结果存入缓存中,以便下次相同的输入可以直接返回结果。
  • return result;: 返回计算结果。

3. 使用示例

4. 注意事项

  • 参数序列化: 使用 JSON.stringify 将参数序列化为字符串作为缓存键,可能会导致某些复杂对象(如函数、循环引用等)无法正确序列化。
  • 内存管理: 如果缓存的数据量过大,可能会导致内存泄漏。可以考虑使用 LRU(Least Recently Used)缓存策略来限制缓存大小。