博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lodash源码分析之缓存使用方式的进一步封装
阅读量:5838 次
发布时间:2019-06-18

本文共 1701 字,大约阅读时间需要 5 分钟。

在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点。

——卢梭《社会与契约论》

本文为读 lodash 源码的第九篇,后续文章会更新到这个仓库中,欢迎 star:

gitbook也会同步仓库的更新,gitbook地址:

前言

在之前的《》和《》介绍过 lodash 的两种缓存方式,在《》中介绍过这两种缓存方式和 Map 的封装,lodash 会根据缓存类型来选择最优的缓存方式。

但是在 MapCache 类中,要初始化缓存和设置缓存都需要提供 keyvalue 组成的二维数组,因此在 SetCache 类中,lodash 提供了一种更方便的缓存设置方式,只需要提供缓存的值即可。

依赖

import MapCache from './MapCache.js'复制代码

源码分析

const HASH_UNDEFINED = '__lodash_hash_undefined__'class SetCache {  constructor(values) {    let index = -1    const length = values == null ? 0 : values.length    this.__data__ = new MapCache    while (++index < length) {      this.add(values[index])    }  }  add(value) {    this.__data__.set(value, HASH_UNDEFINED)    return this  }  has(value) {    return this.__data__.has(value)  }}SetCache.prototype.push = SetCache.prototype.add复制代码

总体思路

从源码中可以看到,SetCache 其实调用的是 MapCache 类,使用缓存的值作为 key ,所有的 key 对应的值都是 lodash 定义的标准 undefinedHASH_UNDEFINED ,正如之前文章中论述过的,这个值用于 Hash 缓存时,避免判断是缓存是否存在时出错。

判断缓存是否存在,只需要判断 MapCache 是否存在对应的 key

constructor

constructor(values) {  let index = -1  const length = values == null ? 0 : values.length  this.__data__ = new MapCache  while (++index < length) {    this.add(values[index])  }}复制代码

这里构造函数不需要再传入 key-value 的二维数组了,只需要传入包含所有缓存值的数组即可。

__data__ 属性保存的其实是 MapCache 的实例。

初始化时只需要遍历需要缓存的数组 values ,然后调用 add 方法,设置缓存即可。

add

add(value) {  this.__data__.set(value, HASH_UNDEFINED)  return this}复制代码

add 方法用来设置缓存。

其实调用的是 MapCahce 实例的 set 方法,使用缓存值 value 作为 key ,用 HASH_UNDEFINED 作为缓存值。

has

has(value) {  return this.__data__.has(value)}复制代码

has 方法用于判断缓存是否存在。

只需要调用 MapCache 实例的 has 方法即可。

push

SetCache.prototype.push = SetCache.prototype.add复制代码

push 方法只是 add 方法的别名。

License

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面

转载地址:http://rmjcx.baihongyu.com/

你可能感兴趣的文章
Python基础班---第一部分(基础)---Python基础知识---认识Python
查看>>
JAVA MAC 配置
查看>>
1134 最长上升子序列 (序列型 DP)
查看>>
js冒泡排序
查看>>
第一次作业 4班卢炳武
查看>>
const int * 与 int *const
查看>>
抽象类的调用
查看>>
使用硬盘,安装双系统,Win7+CentOS
查看>>
Javascript学习总结
查看>>
JS 操作Excel格式
查看>>
php 用正则替换中文字符一系列问题解决
查看>>
ActiveMQ应用笔记一:基本概念&安装
查看>>
SAE+Java+jetty
查看>>
大话数据结构之四(串)
查看>>
加热炉简是新来的整个系统的板
查看>>
Mockito使用注意事项
查看>>
[LeetCode] Palindrome Linked List 回文链表
查看>>
UVA - 825Walking on the Safe Side(dp)
查看>>
android大概是通过logcat拦截Log
查看>>
android HDMI 清晰度 分辨率
查看>>