在JavaScript的数组操作中,查找特定元素的位置是高频需求,Array.indexOf()作为原生提供的数组方法,能快速实现这个能力,不需要开发者手动编写遍历逻辑。它从数组的第一个元素开始向后检索,返回第一个与指定值相等的元素的索引,如果数组中不存在该元素,则返回-1。

Array.indexOf()的基本语法
该方法接受两个参数,第一个参数是要查找的目标元素,第二个参数是可选的起始查找索引,默认值为0。语法格式如下:
// 语法格式 arr.indexOf(searchElement[, fromIndex])
其中searchElement是必填项,表示需要查找的元素;fromIndex是选填项,如果是负数,会从数组末尾开始计算起始位置,比如-1表示从倒数第一个元素开始查找。
基本使用示例
下面通过几个常见场景展示方法的使用效果:
查找基本数据类型元素
对于数字、字符串、布尔值这类基本数据类型,直接使用方法即可返回正确索引:
const numArr = [10, 20, 30, 20, 40];
// 查找20第一次出现的位置
console.log(numArr.indexOf(20)); // 输出1
// 从索引2开始查找20
console.log(numArr.indexOf(20, 2)); // 输出3
// 查找不存在的元素50
console.log(numArr.indexOf(50)); // 输出-1
const strArr = ['apple', 'banana', 'orange', 'banana'];
console.log(strArr.indexOf('banana')); // 输出1
查找引用类型元素
对于对象、数组这类引用类型,indexOf()会比较引用地址,只有同一个引用才会被判定为相等:
const obj1 = { name: 'test' };
const obj2 = { name: 'test' };
const objArr = [obj1, obj2];
// obj1是数组中的第一个元素,返回0
console.log(objArr.indexOf(obj1)); // 输出0
// obj2和数组中的第二个元素是同一个引用,返回1
console.log(objArr.indexOf(obj2)); // 输出1
// 新创建的对象和obj1内容相同但引用不同,返回-1
console.log(objArr.indexOf({ name: 'test' })); // 输出-1
注意事项
- indexOf()使用严格相等(===)进行比较,不会做类型转换,比如数字1和字符串'1'会被判定为不相等:
const mixedArr = [1, '1', 2];
console.log(mixedArr.indexOf(1)); // 输出0
console.log(mixedArr.indexOf('1')); // 输出1
- 如果fromIndex大于等于数组长度,会直接返回-1,不会再执行查找:
const arr = [1, 2, 3]; console.log(arr.indexOf(2, 5)); // 输出-1
- 如果fromIndex是负数,且绝对值大于数组长度,会从索引0开始查找:
const arr = [1, 2, 3]; // -5的绝对值大于数组长度3,从索引0开始查找 console.log(arr.indexOf(1, -5)); // 输出0
和其他查找方法的区别
JavaScript中还有Array.findIndex()和Array.includes()等查找相关方法,和indexOf()的差异如下:
| 方法 | 返回值 | 适用场景 |
|---|---|---|
| indexOf() | 第一个匹配元素的索引,无匹配返回-1 | 查找基本数据类型,或需要获取索引的场景 |
| findIndex() | 第一个满足条件的元素的索引,无匹配返回-1 | 需要根据自定义条件查找元素的场景 |
| includes() | 布尔值,表示是否存在该元素 | 只需要判断元素是否存在,不需要索引的场景 |
实际业务场景应用
比如在购物车场景中,判断某个商品是否已经在购物车列表里,就可以用indexOf()实现:
// 购物车商品列表,每个商品是包含id的对象
const cartList = [
{ id: 1, name: '商品A', price: 100 },
{ id: 2, name: '商品B', price: 200 }
];
// 要添加的新商品
const newGoods = { id: 2, name: '商品B', price: 200 };
// 提取所有商品id组成数组,查找新商品id的索引
const goodsIdList = cartList.map(item => item.id);
const targetIndex = goodsIdList.indexOf(newGoods.id);
if (targetIndex === -1) {
// 不存在则添加
cartList.push(newGoods);
console.log('商品已添加到购物车');
} else {
console.log('商品已经在购物车中');
}
通过上面的示例可以看出,合理使用Array.indexOf()可以减少手动遍历的代码量,让数组查找逻辑更简洁。只要注意它的比较规则和参数特性,就能在合适的场景中发挥它的作用。
Array_indexOfJavaScript数组元素查找索引定位修改时间:2026-07-12 13:48:29