在世界上一切的民族当中,支配着他们的喜怒挑选的并非天分,而是他们的看法。
——卢梭《社会与左券论》
本文为读 lodash 源码的第九篇,后续文章会更新到这个堆栈中,迎接 star:pocket-lodash
gitbook也会同步堆栈的更新,gitbook地点:pocket-lodash
媒介
在之前的《lodash源码剖析之Hash缓存》和《lodash源码剖析之List缓存》引见过 lodash 的两种缓存体式格局,在《lodash源码剖析之缓存体式格局的挑选》中引见过这两种缓存体式格局和 Map
的封装,lodash 会依据缓存范例来挑选最优的缓存体式格局。
但是在 MapCache
类中,要初始化缓存和设置缓存都须要供应 key
和 value
构成的二维数组,因此在 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 定义的规范 undefined
值 HASH_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)
末了,一切文章都邑同步发送到微信民众号上,迎接关注,迎接提意见:
作者:对角另一面