Lodash 源码阅读-baseIndexOf
功能概述
baseIndexOf 是 Lodash 中的一个基础工具函数,它的主要作用是在数组中查找一个值的位置。这个函数特别之处在于它能够处理普通值和 NaN 值两种情况,是 Lodash 中 indexOf 方法的核心实现。
前置学习
在深入理解 baseIndexOf 函数之前,建议先了解以下相关概念:
- 
strictIndexOf 
- 
baseFindIndex 
二、源码实现
            
            
              js
              
              
            
          
          function baseIndexOf(array, value, fromIndex) {
  return value === value
    ? strictIndexOf(array, value, fromIndex)
    : baseFindIndex(array, baseIsNaN, fromIndex);
}相关依赖函数:
            
            
              js
              
              
            
          
          // 判断是否为 NaN
function baseIsNaN(value) {
  return value !== value;
}三、实现原理
1. 整体思路
说人话就是:这个函数主要解决了两个问题:
- 普通值的查找:就是简单地用 ===严格相等来比较,通过调用strictIndexOf实现
- NaN 值的查找:因为 NaN === NaN是false,所以需要特殊处理,通过调用baseFindIndex实现
具体实现思路:
- 先判断要查找的值是不是 NaN(用 value === value判断)
- 如果不是 NaN,就用 strictIndexOf函数进行查找
- 如果是 NaN,就用 baseFindIndex配合baseIsNaN进行查找
2. 参数说明
- array:要搜索的数组
- value:要查找的值
- fromIndex:从哪个位置开始找
3. 逐行解析
            
            
              js
              
              
            
          
          return value === value;- 这行代码是在判断要查找的值是不是 NaN
- 因为只有 NaN 跟自己比较会返回 false
- 所以 value === value为 true 时表示是普通值,为 false 时表示是 NaN
            
            
              js
              
              
            
          
          ? strictIndexOf(array, value, fromIndex)- 如果是普通值,就用 strictIndexOf函数查找
            
            
              js
              
              
            
          
          : baseFindIndex(array, baseIsNaN, fromIndex)- 如果是 NaN 值,就用 baseFindIndex配合baseIsNaN来查找
四、使用示例
            
            
              js
              
              
            
          
          // 1. 查找普通数值
const arr1 = [1, 2, 3, 4, 5];
baseIndexOf(arr1, 3, 0); // => 2
// 2. 从指定位置开始查找
const arr2 = [1, 2, 3, 2, 1];
baseIndexOf(arr2, 2, 3); // => 3 (从索引3开始找2)
// 3. 查找 NaN 值
const arr3 = [1, NaN, 2, NaN, 3];
baseIndexOf(arr3, NaN, 0); // => 1 (找到第一个 NaN)
baseIndexOf(arr3, NaN, 2); // => 3 (从索引2开始找 NaN)
// 4. 找不到的情况
baseIndexOf(arr1, 10, 0); // => -1 (数组中没有10)
baseIndexOf(arr1, 2, 5); // => -1 (从索引5开始找,但数组长度只有5)
// 5. 查找字符串
const arr4 = ["a", "b", "c", "b", "a"];
baseIndexOf(arr4, "b", 0); // => 1五、总结
- 
巧妙的 NaN 检测: jsvalue === value;用一个简单的相等比较就能判断值是否为 NaN,代码简洁优雅 
- 
函数职责分离: js? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex)根据不同情况使用不同的查找函数,每个函数职责单一 
- 
性能优化: - 普通值使用 strictIndexOf,避免了不必要的函数调用
- NaN 值使用专门的查找方法,确保正确性
 
- 普通值使用