lodash源码分析之baseConformsTo

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

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

源码分析

baseConformsTo 会对 object 上指定的属性值 props 都做检测,检测函数由 source 提供。

源码如下:

function baseConformsTo(object, source, props) {
  let length = props.length
  if (object == null) {
    return !length
  }
  object = Object(object)
  while (length--) {
    const key = props[length]
    const predicate = source[key]
    const value = object[key]

    if ((value === undefined && !(key in object)) || !predicate(value)) {
      return false
    }
  }
  return true
}

处理null和undefined

let length = props.length
if (object == null) {
  return !length
}

如果传入的 objectnull 或者 undefined ,只要需要检测的属性值 props 长度不为零,得到的结果为 false 。因为 nullundefined 上根本没有属性可以检测。

遍历

先使用 Object 构造函数转换,确保基本类型也要转换成对象,避免出错。

然后遍历 props,分别从 object 中取出值 value ,从 source 中取出断言函数 predicate

如果 valueundefined 并且 object 上(包括原型链)上并不存在属性 key,那根本不需要调用断言函数了,因为要检测的属性在 object 上都不存在,可以直接返回 false,中止循环。

否则,将 value 传给断言函数 predicate ,如果得到假值,表示有属性没有通过断言函数的检测,返回的结果也为 false,中止循环。

如果所有属性都通过了对应断言函数的检测,则得到结果为 true

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

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

作者:对角另一面

results matching ""

    No results matching ""