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

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

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

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

前言

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

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

依赖

import MapCache from './MapCache.js'

lodash源码分析之缓存方式的选择

源码分析

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

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

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

作者:对角另一面

lodash源码分析之缓存使用方式的进一步封装的更多相关文章

  1. lodash源码分析之缓存方式的选择

    每个人心里都有一团火,路过的人只看到烟. --<至爱梵高·星空之谜> 本文为读 lodash 源码的第八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitb ...

  2. lodash源码分析之数组的差集

    外部世界那些破旧与贫困的样子,可以使我内心世界得到平衡. --卡尔维诺<烟云> 本文为读 lodash 源码的第十七篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodas ...

  3. lodash源码分析之List缓存

    昨日我沿着河岸/漫步到/芦苇弯腰喝水的地方 顺便请烟囱/在天空为我写一封长长的信 潦是潦草了些/而我的心意/则明亮亦如你窗前的烛光/稍有暧昧之处/势所难免/因为风的缘故 --洛夫<因为风的缘故& ...

  4. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  5. lodash源码分析之自减的两种形式

    这个世界需要一个特定的恶人,可以供人们指名道姓,千夫所指:"全都怪你". --村上春树<当我谈跑步时我谈些什么> 本文为读 lodash 源码的第六篇,后续文章会更新到 ...

  6. lodash源码分析之baseFindIndex中的运算符优先级

    我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...

  7. 【转】MaBatis学习---源码分析MyBatis缓存原理

    [原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...

  8. Spark源码分析:多种部署方式之间的区别与联系(转)

    原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...

  9. lodash源码分析之Hash缓存

    在那小小的梦的暖阁,我为你收藏起整个季节的烟雨. --洛夫<灵河> 本文为读 lodash 源码的第四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash gitbo ...

随机推荐

  1. Centos7上安装使用locate

    centos7上默认没有locate命令,需先安装locate yum install mlocate 注意是mlocate,如果是yum install locate系统会提示没有安装包 安装完成后 ...

  2. Android应用程序启动时发生AndroidRuntime : ClassNotFoundException for Activity class的解决方法

    在android应用程序启动时抛出下面异常导致启动失败:07-09 17:12:35.709: ERROR/AndroidRuntime(3866): Uncaught handler: thread ...

  3. GIT命令一页纸

    ,配置用户名和邮箱 $ git config --global user.name "Your Name" $ git config --global user.email &qu ...

  4. golang map

    Our friend Monk has been made teacher for the day today by his school professors . He is going to te ...

  5. 微信小程序开发之详解生命周期方法

    生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...

  6. 【转载】MySQL事务以及SELECT ... FOR UPDATE的使用

    MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...

  7. MyEclipse过期后怎么破解

    方法一:写一个程序生成Subscriptioncode import java.io.*; public class MyEclipseGen { private static final Strin ...

  8. [转] Web 开发模式演变历史和趋势

    文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...

  9. ETL实践--kettle转到hive

    ETL实践--kettle只做源数据的抽取,其他数据转换转到hive上. 1.用hive代替kettle的数据关联的原因 (1).公司之前的数据ELT大量使用了kettle.用kettle导原始数据速 ...

  10. C#学习笔记-装饰模式

    题目:给顾客打扮,但是需要满足正常的穿衣风格,例如先穿了衬衣再打领带,最后在穿鞋子,这种基本要求. 分析: 现在将具体的衣服裤子和鞋子都分别写在不同的类里面,这样方便以后添加新的衣服,这些全部都属于服 ...