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

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

本文为读 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. Python入门-数据类型之字符串

    字符串详解 没那么多废话,直接介绍字符串使用.继续往下看~~~ 字符串定义: *1.引号包围,不可变(指的是不可以对字符串进行修改)得序列(凡是能够通过索引取值的都是序列). *2.不可变对象(字符串 ...

  2. Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)

    使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和 ...

  3. IBM的websphere MQ的c#使用(一)

    接上篇的MQ配置.利用C#实现MQ消息的收发.源码 1.需要引入的dll是amqmdnet.dll 2.app.config配置 <?xml version="1.0" en ...

  4. 前端js之JavaScript

    知识预览 一小知识 二 JavaScript的基础 BOM对象 DOM对象 实例练习 js拓展 小知识 核心(ECMAScript) 文档对象模型(DOM) Document object model ...

  5. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  6. python科学计算之numpy

    1.np.logspace(start,stop,num): 函数表示的意思是;在(start,stop)间生成等比数列num个 eg: import numpy as np print np.log ...

  7. [翻译]QT core wallet manual 狗狗币核心钱包使用教程

    译注:比特币没赶上可以玩狗狗币啊,水电厂包不起可以用CPU挖啊.为了顺应时代潮流,了解一下区(fa)块(heng)链(cai)和加密货币技术,准备从研究狗狗币开始.网上找了一圈没有看到很好的入门级教程 ...

  8. python网络数据采集(低音曲)

    废话不多说,马上开始. 上次我们说到遍历单个域名,今天我们来写一个爬对应词条的脚本,他会遍历整个网址直到爬完对应词条. 代码: from urllib.request import urlopen f ...

  9. cs231n spring 2017 lecture1 Introduction to Convolutional Neural Networks for Visual Recognition 听课笔记

    1. 生物学家做实验发现脑皮层对简单的结构比如角.边有反应,而通过复杂的神经元传递,这些简单的结构最终帮助生物体有了更复杂的视觉系统.1970年David Marr提出的视觉处理流程遵循这样的原则,拿 ...

  10. 队列的存储结构的实现(C/C++实现)

    存档 #include "iostream.h" #include "stdlib.h" #define max 20 typedef char elemtyp ...