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 值使用专门的查找方法,确保正确性
- 普通值使用