本文为读 lodash 源码的第三百五十四篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
import baseIsEqual from './baseIsEqual.js'
import get from '../get.js'
import hasIn from '../hasIn.js'
import isKey from './isKey.js'
import isStrictComparable from './isStrictComparable.js'
import matchesStrictComparable from './matchesStrictComparable.js'
import toKey from './toKey.js'
《lodash源码分析之isStrictComparable》
《lodash源码分析之matchesStrictComparable》
baseMatchesProperty
会接收一个属性路径 path
和一个值 srcValue
,返回一个函数,这个函数接收一个对象 object
,会检测 object
对应路径上的值和 srcValue
是否相等。
源码如下:
const COMPARE_PARTIAL_FLAG = 1
const COMPARE_UNORDERED_FLAG = 2
function baseMatchesProperty(path, srcValue) {
if (isKey(path) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path), srcValue)
}
return (object) => {
const objValue = get(object, path)
return (objValue === undefined && objValue === srcValue)
? hasIn(object, path)
: baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
}
}
首先判断 path
是否为属性名,如果是,再判断 srcValue
是否可以使用 ===
严格相等比较,如果可以,则使用 matchesStrict Comparable
来生成函数。这样比接下来使用 baseIsEqual
来比较的性能要好。
如果不符合上面的条件,则返回一个接收 object
的函数。
在函数中,首先调用 get
方法,将 object
上对应路径 path
上的值 objValue
取出。
如果 objValue
为 undefined
,并且 objValue
和 srcValue
严格相等,则使用 hasIn
来判断 object
上是否存在 path
路径。因为 object
上 path
路径不存在,取出的 objValue
也是 undefined
。
其它情况,直接调用 baseIsEqual
来进行比较。
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面