js indexof的实现
JavaScript indexOf 的实现原理
JavaScript 的 indexOf 方法用于查找字符串或数组中指定元素的首次出现位置。以下是其核心实现逻辑和注意事项:
字符串的 indexOf 实现
字符串的 indexOf 方法用于查找子字符串的起始位置。以下是简化版的实现思路:

function stringIndexOf(str, searchValue, fromIndex = 0) {
if (fromIndex < 0) fromIndex = 0;
if (fromIndex >= str.length) return -1;
for (let i = fromIndex; i < str.length; i++) {
let match = true;
for (let j = 0; j < searchValue.length; j++) {
if (str[i + j] !== searchValue[j]) {
match = false;
break;
}
}
if (match) return i;
}
return -1;
}
关键点:

- 处理负的
fromIndex,将其视为0。 - 双循环嵌套:外层遍历主字符串,内层匹配子字符串。
- 时间复杂度为 O(n*m),其中 n 是主字符串长度,m 是子字符串长度。
数组的 indexOf 实现
数组的 indexOf 方法用于查找元素的首次出现位置。以下是简化实现:
function arrayIndexOf(arr, searchElement, fromIndex = 0) {
if (fromIndex < 0) fromIndex = Math.max(0, arr.length + fromIndex);
for (let i = fromIndex; i < arr.length; i++) {
if (arr[i] === searchElement) return i;
}
return -1;
}
关键点:
- 支持负的
fromIndex,从数组末尾开始计算。 - 使用严格相等(
===)比较元素。 - 时间复杂度为 O(n),n 为数组长度。
边界情况处理
- 未找到时返回
-1:无论是字符串还是数组,未找到目标均返回-1。 - 空字符串/数组:若搜索值为空,字符串返回
fromIndex,数组返回-1。 fromIndex超出范围:字符串和数组均返回-1。
性能优化建议
- 字符串搜索:现代浏览器通常使用 Boyer-Moore 或 KMP 算法优化字符串搜索。
- 数组搜索:对大型数组,可考虑使用
Set或Map提前建立索引。
示例用法
// 字符串示例
const str = "Hello World";
console.log(stringIndexOf(str, "World")); // 输出 6
// 数组示例
const arr = [1, 2, 3, 4];
console.log(arrayIndexOf(arr, 3)); // 输出 2






