JavaScript 性能之缓存
我们尽量在一篇文章中仅仅处理一个问题。这里我们要解决一个问题就是缓存对象。
关于缓存的思考🤔
- 什么样的数据需要缓存?
一般在 JavaScript 中基本数据类型,缓存很容易。缓存的一般是数组和对象,最好是一个能够使用 JSON API 处理的数据(不包括函数)。
实现具有 JSON 数据结构的缓存
我们主要思考的是 JSON 数据结构的缓存:
- 处理基本数据类型:Number、String、Boolean、Null、Undefined
- 处理引用类型数据
- 工具函数 isPrimitive
function isPrimitive (val) {
const toString = Object.prototype.toString
return (
toString.apply(val) === '[object Number]' ||
toString.apply(val) === '[object String]' ||
toString.apply(val) === '[object Boolean]' ||
toString.apply(val) === '[object Null]' ||
toString.apply(val) === '[object Undefined]'
)
}
- jsonSerializer
function jsonSerializer(args) {
// 基本类型直接返回
if (args.length === 1 && isPrimitive(args[0])) {
return args[0];
}
// 引用类型
var _obj = {};
for (var i = 0; i < args.length; i++) {
_obj['key' + i] = args[i];
}
return JSON.stringify(_obj);
}
- memoize
export function memoize(fn) {
var cache = {};
return function () {
var key = jsonSerializer(arguments);
return cache[key] && fn.apply(null, arguments);
};
}