Lodash 源码阅读-arrayIncludes
概述
arrayIncludes 是 Lodash 内部的一个私有工具函数,用于检查数组中是否包含指定的值。它类似于 JavaScript 原生的 Array.prototype.includes 方法,但具有更完善的 null 和 undefined 处理机制。
前置学习
baseIndexOf- 用于在数组中查找值的基础实现函数strictIndexOf- 使用严格相等(===)进行比较的索引查找函数baseFindIndex- 基础的查找索引实现,支持自定义断言函数baseIsNaN- 检查值是否为NaN的基础实现
源码实现
js
function arrayIncludes(array, value) {
var length = array == null ? 0 : array.length;
return !!length && baseIndexOf(array, value, 0) > -1;
}
实现思路
arrayIncludes 函数的实现非常简洁,主要分为两个步骤:
- 首先检查输入的数组是否为
null/undefined或者空数组,如果是则直接返回false - 使用
baseIndexOf在数组中查找指定值,如果找到(返回值大于 -1)则返回true,否则返回false
源码解析
js
var length = array == null ? 0 : array.length;
这行代码使用了松散相等(==)来同时检查 null 和 undefined。如果数组为 null 或 undefined,则将 length 设为 0;否则,获取数组的长度。
js
return !!length && baseIndexOf(array, value, 0) > -1;
这里使用了逻辑与(&&)运算符的短路特性:
- 首先将
length转为布尔值(!!length),确保数组有长度(不为空) - 如果数组有长度,则调用
baseIndexOf(array, value, 0)从索引 0 开始查找值 - 如果
baseIndexOf返回的索引大于 -1,表示找到了值,整个表达式返回true;否则返回false
baseIndexOf 函数的实现如下:
js
function baseIndexOf(array, value, fromIndex) {
return value === value
? strictIndexOf(array, value, fromIndex)
: baseFindIndex(array, baseIsNaN, fromIndex);
}
这个函数有一个巧妙的设计:
- 通过
value === value判断值是否为NaN(因为NaN是唯一一个不等于自身的值) - 对于普通值,使用
strictIndexOf进行严格相等查找 - 对于
NaN,使用baseFindIndex配合baseIsNaN进行查找
总结
arrayIncludes 虽然是一个简单的内部工具函数,但它体现了 Lodash 库的几个设计特点:
- 空值处理 - 妥善处理
null/undefined等边界情况 - 特殊值处理 - 通过
baseIndexOf的设计,正确处理NaN等特殊值 - 简洁高效 - 使用逻辑操作符的短路特性,代码简洁且高效
这个函数在 Lodash 内部被用于实现多个数组操作方法,如 _.includes、_.intersection 等,是构建更高级功能的基础。