lodash源码分析之缓存使用方式的进一步封装

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

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

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

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

前言

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

可是在 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 的实例。this

初始化时只须要遍历须要缓存的数组 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)

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

做者:对角另外一面

相关文章
相关标签/搜索