lodash源码剖析之缓存运用体式格局的进一步封装

在世界上一切的民族当中,支配着他们的喜怒挑选的并非天分,而是他们的看法。

——卢梭《社会与左券论》

本文为读 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源码剖析之缓存运用体式格局的进一步封装》

作者:对角另一面

    原文作者:对角另一面
    原文地址: https://segmentfault.com/a/1190000013027498
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞