2022-04-19 lodash源码学习 - fromPair

2022-04-20  本文已影响0人  网恋被骗二块二

前情提要:indexOf进入方法体的判断有点理解不能(value === value自身和自身判断基本都是true,如果有知道是FALSE的大佬希望能在评论区指点一下!),基本上都是进入strictIndexOf方法。


function fromPairs(pairs)
反向版 _.toPairs,这个方法返回一个由键值对构成的对象。

@param {Array} pairs The key-value pairs.
键值对 数组

function fromPairs(pairs) {
        //   数组循环起始下标
        var index = -1,
        // 获取数组长度
            length = pairs == null ? 0 : pairs.length,
            // 保存结果的对象
            result = {};
        // 遍历数组
        while (++index < length) {
            // 取出当前项
          var pair = pairs[index];
        //   给对象新增属性和配置属性值
          result[pair[0]] = pair[1];
        }
        // 总结:原理十分简单,键值对都是属性+属性值的形式,所以直接遍历数组,然后将该项的0项作为属性,1项作为属性值
        return result;
      }

function head(array)
获得数组的首个元素

@param {Array} array The array to query.
要检索的数组

function head(array) {
        // 判断数组是否存在(转Boolean为true)并且数组长度存在(因为空数组转boolean也是true)
        // 如果条件满足,则返回数组的第一项,否则返回undefined
        return (array && array.length) ? array[0] : undefined;
      }

function indexOf(array, value, fromIndex)
根据 value 使用 SameValueZero 等值比较返回数组中首次匹配的 index, 如果 fromIndex 为负值,将从数组尾端索引进行匹配,如果将 fromIndex 设置为 true,将使用更快的二进制检索机制。

@param {Array} array The array to inspect.
要检索的数组

@param {*} value The value to search for.
要检索的值

@param {number} [fromIndex=0] The index to search from.
需要检索的起始位置。

function indexOf(array, value, fromIndex) {
        //  获取数组长度
        var length = array == null ? 0 : array.length;
        // 判断长度是否为0
        if (!length) {
            // 若为0说明非数组或空数组,返回-1
          return -1;
        }
        // 数组检索下标,如果没有传递该参数,则默认从第一位开始,若传递参数,则使用toInteger转化为数字
        var index = fromIndex == null ? 0 : toInteger(fromIndex);
        if (index < 0) {
            // 判断转化后起始下标是否小于零?(输入负数表示从数组倒数第几位开始查询,并且需要转换成合法的数组下标)
            // 如果该下标加上数组长度后和0比较,取最大值
          index = nativeMax(length + index, 0);
        }
        // 将该参数传至基础版indexOf
        return baseIndexOf(array, value, index);
      }

接上面

function baseIndexOf(array, value, fromIndex) {
        console.log('-------------')
        console.log('value判断结果:')
        console.log(value === value)
        console.log('-------------')
        // 这一步有点不是很清楚,经过测试,value和value的全等于比较,基本都是true
        // 所以很多时候操作直接进入到了strictIndexOf中
        // 什么时候进入baseFindIndex就不是很清楚了
        // 他是 value 和 value 自身进行判断,所以这个条件恒等于true?我不确定
      return value === value
        ? strictIndexOf(array, value, fromIndex)
        // baseIsNaN
        // 如果“value”为“NaN”则返回“true”,否则返回“false”。
        : baseFindIndex(array, baseIsNaN, fromIndex);
    }

function strictIndexOf(array, value, fromIndex)
参数配置同indexOf
'indexOf'的一个特殊版本,它对值执行严格的相等比较,即 ===

function strictIndexOf(array, value, fromIndex) {
        // 循环起始下标
      var index = fromIndex - 1,
    //  数组长度
          length = array.length;
    //  遍历
      while (++index < length) {
        //   如果数组当前项全等于搜索项时,另外,在上一步操作中,如果传递的是一个对象,很有可能为fasle,引用数据类型的全等于判断和等于不同,这一点需要注意
        if (array[index] === value) {
            // 结束循环,返回当前遍历到的数组下标
          return index;
        }
      }
    //  如果遍历结束后仍未找到该值,则返回 -1 
      return -1;
    }

function baseFindIndex(array, predicate, fromIndex, fromRight)
_.findIndex_.findLastIndex的不支持迭代的简写版。

function baseFindIndex(array, predicate, fromIndex, fromRight) {
        // 在baseIndexOf的调用中,已知传入了数组<array>、baseIsNaN<function>、起始下标<index: number>
        // 这个方法是用作寻找引用数据类型的下标
        // 获取数组长度
      var length = array.length,
        // new一个循环所用的初始值
        // 运算解读:formIndex是起始位置,也就是在indexOf调用时的第三个参数
        // 此时用起始位置index 去 加上 formRight(指定从右到左的迭代),如果formRight有参数,那么+1,否则-1
        // 为什么要+1 或 -1 呢?这应该是lodash开发者自己编程习惯,比如说从0开始循环,他们要给index赋值-1,然后++index<length这样循环
          index = fromIndex + (fromRight ? 1 : -1);
        // 判断fromRigh是否存在,若存在,从数组尾部往前循环,若不存在,从数组头部开始循环
      while ((fromRight ? index-- : ++index < length)) {
        //  baseIsNaN只接收一个参数,而传递的三个参数中,只有 array[index] 能够被识别并使用
        //  baseIsNaN判断该值如果是 NaN,则返回 true,否则返回FALSE,但他是 value !== value 所以不太清楚这到底判断出什么了
        if (predicate(array[index], index, array)) {
          return index;
        }
      }
      return -1;
    }
上一篇下一篇

猜你喜欢

热点阅读