搜索
您的当前位置:首页正文

模拟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));

因篇幅问题不能全部显示,请点此查看更多更全内容

Top