在世界上全部的民族之中,支配着他們的喜怒選擇的並非天性,而是他們的觀點。javascript
——盧梭《社會與契約論》java
本文爲讀 lodash 源碼的第九篇,後續文章會更新到這個倉庫中,歡迎 star:pocket-lodashgit
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodashgithub
在以前的《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(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(value) {
this.__data__.set(value, HASH_UNDEFINED)
return this
}
複製代碼
add
方法用來設置緩存。
其實調用的是 MapCahce
實例的 set
方法,使用緩存值 value
做爲 key
,用 HASH_UNDEFINED
做爲緩存值。
has(value) {
return this.__data__.has(value)
}
複製代碼
has
方法用於判斷緩存是否存在。
只須要調用 MapCache
實例的 has
方法便可。
SetCache.prototype.push = SetCache.prototype.add
複製代碼
push
方法只是 add
方法的別名。
署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最後,全部文章都會同步發送到微信公衆號上,歡迎關注,歡迎提意見:
做者:對角另外一面