模拟Lodash实现自己的memoize记忆函数

分析:
1.这个函数接受一个处理函数作为参数;
2.这个函数返回一个匿名函数;
3.这个函数内部需要创建一个对象(cache)将传入的处理函数的执行结果缓存;
3.1用return出去的匿名函数的参数(arguments)作为这个对象(cache)的键,这个对象(cache)的值是传入的处理函数的执行结果。
3.2通过判断对象(cache)里是否已有return出去的匿名函数的参数(arguments)这个键来做是否要执行处理函数的依据。
3.3若对象(cache)已有return出去的匿名函数的参数(arguments)这个键的话就直接返回对应的缓存值;没有就执行处理函数,并将值做缓存。

// const _ = require("lodash");

function getArea(r) {
  console.log("半径", r);
  return Math.PI * r * r;
}
// Lodash里的记忆函数
// const getMemoizeArea = _.memoize(getArea)
// getMemoizeArea(2)
// getMemoizeArea(2)
// getMemoizeArea(2)
// console.log(getMemoizeArea(null));
// console.log(getMemoizeArea(null));
// console.log(getMemoizeArea(null));
// console.log(getMemoizeArea(undefined));
// console.log(getMemoizeArea(undefined));
// console.log(getMemoizeArea(undefined));

// 记忆函数
function memoize(fn) {
  const cache = {};
  return function () {
    const key = JSON.stringify(arguments);
    // cache[key] = cache[key] || fn.apply(null, arguments); // 存在缓存的值为0时,缓存失效
    // cache[key] = cache[key] ?? fn.apply(null, arguments) // 空值合并运算符,在ES2020才新增的。也存在缓存结果为null或者undefined时,缓存失效问题。
		if (!Object.keys(cache).includes(key)) {
			// console.log('未缓存过')
			cache[key] = fn.apply(null, arguments);
		}
    return cache[key];
  };
}
const myMemoize = memoize(getArea);
console.log(myMemoize(0));
console.log(myMemoize(0));
console.log(myMemoize(0));
console.log(myMemoize(null));
console.log(myMemoize(null));
console.log(myMemoize(null));
console.log(myMemoize(undefined));
console.log(myMemoize(undefined));
console.log(myMemoize(undefined));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值