JavaScript 数组查找元素的方法看似简单,但方法一多就容易让人眼花缭乱。许多初学者最纠结的问题就是:究竟该用 includes、indexOf,还是 find、filter?其实核心关键在于:你希望得到什么结果?是判断元素是否存在、获取索引位置,还是直接拿到匹配的数组元素?选对方法能事半功倍,而选错则可能导致代码冗余甚至出现逻辑错误。

接下来,按实际需求场景,逐一梳理这几种常用方法。
用 includes() 判断是否存在
最直观的布尔型判断,适合“有没有”这类需求。它不关心位置、不返回元素,直接给出 true 或 false。写法简洁,语义清晰明了。
- 对 NaN 友好:
[NaN].includes(NaN)返回 true,而同样用于查找的indexOf则无法做到这一点。 - 但需注意:
includes只能进行严格相等(===)比较,无法传入回调函数处理复杂判断逻辑。 - 不支持对象深度比较:例如
[{a:1}].includes({a:1})返回 false,因为两个对象引用不同。
一句话总结:只需确认元素是否存在,用这个方法准没错。
用 indexOf() 和 lastIndexOf() 查找索引
这两个方法返回匹配项的索引位置,若未找到则返回 -1。适用于后续需要执行 splice 或修改特定位置元素的场景。
indexOf从数组头部开始检索,lastIndexOf则从末尾向前查找。- 同样仅支持严格相等比较,对 NaN 返回 -1,这一点与
includes形成鲜明对比。 - 可指定第二个参数作为起始搜索位置,实现分段查找,灵活性不错。
当需要知道元素处于哪个索引位置时,这两个方法是首选。
用 find() 和 findIndex() 按条件查找
当判断条件不再是简单的相等比较,而是涉及对象属性匹配、范围筛选或复杂逻辑时,find 和 findIndex 便派上用场。它们支持传入回调函数,是日常开发中最常用的组合。
find()返回第一个满足条件的元素值,未找到则返回undefined。findIndex()返回对应索引,未找到返回 -1。- 注意短路行为:一旦遇到第一个满足条件的元素,立即停止遍历,不会执行完整数组,这在性能上具有优势。
- 但有一个小坑:在空数组上调用
find也会返回undefined,因此使用前最好先判空,避免误判。
灵活且高效,适用于绝大多数“查找第一个匹配项”的场景。
用 filter() 找出所有匹配项
当需要的不只是第一个,而是所有符合条件的结果时,应使用 filter。它返回一个新数组,原数组保持不变,符合函数式编程的理念。
- 即使只有一个匹配项,返回的也是数组(而非单个值),使用时需注意解构或取
[0]。 - 它不会短路,始终遍历整个数组,性能上略低于
find,但语义更加清晰——所有人都知道你要的是“所有符合条件的元素”。 - 配合
some()或every()可以快速实现“存在性”或“全量”判断,比直接写循环更优雅。
代码虽然简单,但坑都藏在细节里。选对方法,才能少踩坑,少写冗余逻辑。
