array.indexOf()
和 array.lastIndexOf()
是 JavaScript 中用于查找数组中某个元素位置的两个方法。它们的功能类似,但搜索的方向不同。
1. array.indexOf()
功能:
- 从数组的开头开始搜索,返回第一个匹配到的元素的索引。
- 如果没有找到目标元素,则返回
-1
。
语法:
array.indexOf(searchElement, fromIndex)
searchElement
:要查找的元素。fromIndex
(可选):从哪个索引开始搜索。如果省略,默认从索引0
开始。
示例:
查找元素:
let arr = [1, 2, 3, 4, 3];
console.log(arr.indexOf(3)); // 输出: 2 (第一次出现 3 的索引)
console.log(arr.indexOf(5)); // 输出: -1 (没有找到 5)
使用 fromIndex
参数:
let arr = [1, 2, 3, 4, 3];
console.log(arr.indexOf(3, 3)); // 输出: 4 (从索引 3 开始查找,找到第二个 3)
查找对象或复杂值:
let arr = [{ id: 1 }, { id: 2 }, { id: 3 }];
console.log(arr.indexOf({ id: 2 })); // 输出: -1 (对象是引用类型,不会匹配)
注意:indexOf
使用的是严格相等 (===
) 比较,因此对于对象或复杂值,需要特别注意。
2. array.lastIndexOf()
功能:
- 从数组的末尾开始搜索,返回最后一个匹配到的元素的索引。
- 如果没有找到目标元素,则返回
-1
。
语法:
array.lastIndexOf(searchElement, fromIndex)
searchElement
:要查找的元素。fromIndex
(可选):从哪个索引开始搜索(向左搜索)。如果省略,默认从数组的最后一个元素开始。
示例:
查找元素:
let arr = [1, 2, 3, 4, 3];
console.log(arr.lastIndexOf(3)); // 输出: 4 (最后一次出现 3 的索引)
console.log(arr.lastIndexOf(5)); // 输出: -1 (没有找到 5)
使用 fromIndex
参数:
let arr = [1, 2, 3, 4, 3];
console.log(arr.lastIndexOf(3, 3)); // 输出: 2 (从索引 3 开始向左查找,找到第一个 3)
对象查找:
let arr = [{ id: 1 }, { id: 2 }, { id: 3 }];
console.log(arr.lastIndexOf({ id: 2 })); // 输出: -1 (对象是引用类型,不会匹配)
对比总结:
特性 | array.indexOf() | array.lastIndexOf() |
---|---|---|
搜索方向 | 从数组开头向右搜索 | 从数组末尾向左搜索 |
是否修改原数组 | 否 | 否 |
返回值 | 第一个匹配元素的索引,未找到时返回 -1 | 最后一个匹配元素的索引,未找到时返回 -1 |
语法 | array.indexOf(searchElement, fromIndex) | array.lastIndexOf(searchElement, fromIndex) |
注意事项:
-
严格比较:
indexOf
和lastIndexOf
都使用严格相等 (===
) 进行比较。- 因此,对于对象、数组或函数等引用类型的值,它们不会匹配,除非是同一个引用。
let obj = { id: 1 };
let arr = [obj, { id: 2 }];
console.log(arr.indexOf(obj)); // 输出: 0 (因为引用相同)
console.log(arr.indexOf({ id: 1 })); // 输出: -1 (新创建的对象引用不同)
区分 -0
和 +0
:
- 在 JavaScript 中,
-0
和+0
被视为严格相等,因此indexOf
和lastIndexOf
无法区分它们。
let arr = [-0, +0];
console.log(arr.indexOf(-0)); // 输出: 0 (匹配到第一个 0)
console.log(arr.lastIndexOf(+0)); // 输出: 1 (匹配到最后一个 0)
NaN 的特殊处理:
NaN
不等于自身,因此即使数组中包含NaN
,indexOf
和lastIndexOf
也无法找到它。
let arr = [1, NaN, 3];
console.log(arr.indexOf(NaN)); // 输出: -1
console.log(arr.lastIndexOf(NaN)); // 输出: -1
如果需要查找 NaN
,可以结合 findIndex
方法:
let arr = [1, NaN, 3];
console.log(arr.findIndex(value => Number.isNaN(value))); // 输出: 1
适用场景:
-
array.indexOf()
:- 当你需要找到某个元素在数组中的第一次出现位置时。
-
array.lastIndexOf()
:- 当你需要找到某个元素在数组中的最后一次出现位置时。