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
等,是构建更高级功能的基础。