在JavaScript里,数组是最常用的数据结构之一。当我们需要从一堆数据中找出想要的内容时,find和indexOf是两个很基础也很常用的方法。虽然它们都能完成查找动作,但设计目的和返回结果并不一样。理解清楚两者的差异,能让你在处理数组时少走弯路。

indexOf方法的基本用法
indexOf用于判断数组中是否存在某个值,并返回该值第一次出现的位置下标。它使用严格相等(===)来比较,不会做类型转换。
var fruits = ['apple', 'banana', 'orange'];
var idx = fruits.indexOf('banana');
console.log(idx); // 输出 1
var notFound = fruits.indexOf('pear');
console.log(notFound); // 输出 -1
如果数组里放的是对象,indexOf就不够用了,因为它比较的是引用地址而不是内容。
var users = [{ id: 1 }, { id: 2 }];
console.log(users.indexOf({ id: 1 })); // 输出 -1,因为这是另一个对象
find方法的基本用法
find接收一个回调函数,对数组每一项执行该函数,返回第一个让函数返回真值的元素本身。找不到时返回undefined。
var users = [
{ id: 1, name: 'Tom' },
{ id: 2, name: 'Lucy' }
];
var user = users.find(function (item) {
return item.id === 2;
});
console.log(user); // 输出 { id: 2, name: 'Lucy' }
两者核心区别
| 对比项 | indexOf | find |
|---|---|---|
| 返回值 | 下标数字或-1 | 元素本身或undefined |
| 查找条件 | 只能严格匹配值 | 可写任意逻辑判断 |
| 适用数据 | 基本类型较方便 | 对象数组更合适 |
什么时候用indexOf
- 数组里是字符串、数字等基础类型
- 只关心是否存在以及位置
- 需要兼容非常老的代码环境
什么时候用find
- 数组元素是对象,要按属性找
- 查找规则比较复杂,比如范围判断
- 希望直接拿到元素而不是下标
常见错误写法
有人会在find的回调里直接用indexOf的逻辑,导致语义混乱。下面这种写法虽然能跑,但不如直接用find清晰:
var list = [10, 20, 30];
var result = list.find(function (x) {
return list.indexOf(x) > -1; // 没必要,find本身就在遍历
});
另外要注意,写<input>这类标签名称时在文章里要转义,但在代码里不需要。函数调用如indexOf()就是普通方法调用,不是标签。
小结
简单来说,indexOf适合基础类型的值匹配,find适合灵活条件的元素提取。项目里如果处理的是对象数组,优先考虑find,代码可读性会更好。遇到只需要判断存不存在的简单场景,indexOf依然轻量好用。
JavaScript数组查找find方法indexOf方法数组遍历修改时间:2026-07-24 15:39:35