We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点。 ——卢梭《社会与契约论》
在世界上所有的民族之中,支配着他们的喜怒选择的并不是天性,而是他们的观点。
——卢梭《社会与契约论》
本文为读 lodash 源码的第九篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
在之前的《lodash源码分析之Hash缓存》和《lodash源码分析之List缓存》介绍过 lodash 的两种缓存方式,在《lodash源码分析之缓存方式的选择》中介绍过这两种缓存方式和 Map 的封装,lodash 会根据缓存类型来选择最优的缓存方式。
Map
但是在 MapCache 类中,要初始化缓存和设置缓存都需要提供 key 和 value 组成的二维数组,因此在 SetCache 类中,lodash 提供了一种更方便的缓存设置方式,只需要提供缓存的值即可。
MapCache
key
value
SetCache
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 定义的标准 undefined 值 HASH_UNDEFINED ,正如之前文章中论述过的,这个值用于 Hash 缓存时,避免判断是缓存是否存在时出错。
undefined
HASH_UNDEFINED
Hash
判断缓存是否存在,只需要判断 MapCache 是否存在对应的 key 。
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 的二维数组了,只需要传入包含所有缓存值的数组即可。
key-value
__data__ 属性保存的其实是 MapCache 的实例。
__data__
初始化时只需要遍历需要缓存的数组 values ,然后调用 add 方法,设置缓存即可。
values
add
add(value) { this.__data__.set(value, HASH_UNDEFINED) return this }
add 方法用来设置缓存。
其实调用的是 MapCahce 实例的 set 方法,使用缓存值 value 作为 key ,用 HASH_UNDEFINED 作为缓存值。
MapCahce
set
has(value) { return this.__data__.has(value) }
has 方法用于判断缓存是否存在。
has
只需要调用 MapCache 实例的 has 方法即可。
SetCache.prototype.push = SetCache.prototype.add
push 方法只是 add 方法的别名。
push
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面
The text was updated successfully, but these errors were encountered:
No branches or pull requests
本文为读 lodash 源码的第九篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
前言
在之前的《lodash源码分析之Hash缓存》和《lodash源码分析之List缓存》介绍过 lodash 的两种缓存方式,在《lodash源码分析之缓存方式的选择》中介绍过这两种缓存方式和
Map
的封装,lodash 会根据缓存类型来选择最优的缓存方式。但是在
MapCache
类中,要初始化缓存和设置缓存都需要提供key
和value
组成的二维数组,因此在SetCache
类中,lodash 提供了一种更方便的缓存设置方式,只需要提供缓存的值即可。依赖
lodash源码分析之缓存方式的选择
源码分析
总体思路
从源码中可以看到,
SetCache
其实调用的是MapCache
类,使用缓存的值作为key
,所有的key
对应的值都是 lodash 定义的标准undefined
值HASH_UNDEFINED
,正如之前文章中论述过的,这个值用于Hash
缓存时,避免判断是缓存是否存在时出错。判断缓存是否存在,只需要判断
MapCache
是否存在对应的key
。constructor
这里构造函数不需要再传入
key-value
的二维数组了,只需要传入包含所有缓存值的数组即可。__data__
属性保存的其实是MapCache
的实例。初始化时只需要遍历需要缓存的数组
values
,然后调用add
方法,设置缓存即可。add
add
方法用来设置缓存。其实调用的是
MapCahce
实例的set
方法,使用缓存值value
作为key
,用HASH_UNDEFINED
作为缓存值。has
has
方法用于判断缓存是否存在。只需要调用
MapCache
实例的has
方法即可。push
push
方法只是add
方法的别名。License
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面
The text was updated successfully, but these errors were encountered: