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
}

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

遍历

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

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

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

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

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

License

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

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

作者:对角另一面

results matching ""

    No results matching ""