js indexof 实现
实现 JavaScript 的 indexOf 方法
JavaScript 的 indexOf 方法用于返回指定值在字符串或数组中首次出现的位置。以下是自定义实现方案:
字符串版本的 indexOf 实现
function customIndexOf(str, searchValue, fromIndex = 0) {
if (fromIndex < 0) fromIndex = 0;
if (fromIndex >= str.length) return -1;
for (let i = fromIndex; i < str.length; i++) {
if (str[i] === searchValue[0]) {
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;
}
参数说明:
str: 被搜索的原始字符串searchValue: 需要查找的子字符串fromIndex: 可选参数,指定开始搜索的位置
特性:

- 支持子字符串匹配
- 处理负数的
fromIndex - 返回首次匹配的索引或 -1
数组版本的 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;
}
参数说明:
arr: 被搜索的数组searchElement: 需要查找的元素fromIndex: 可选参数,指定开始搜索的位置
特性:

- 支持负数的
fromIndex(从数组末尾开始计算) - 使用严格相等比较(===)
- 返回首次匹配的索引或 -1
性能优化建议
对于大型字符串或数组,可以考虑以下优化:
// Boyer-Moore 算法的简化版(适用于字符串搜索)
function optimizedIndexOf(str, pattern) {
const badCharTable = {};
for (let i = 0; i < pattern.length; i++) {
badCharTable[pattern[i]] = i;
}
let shift = 0;
while (shift <= str.length - pattern.length) {
let j = pattern.length - 1;
while (j >= 0 && pattern[j] === str[shift + j]) j--;
if (j < 0) return shift;
shift += Math.max(1, j - (badCharTable[str[shift + j]] || -1));
}
return -1;
}
优化点:
- 使用坏字符启发式规则跳过不可能匹配的位置
- 最坏情况下时间复杂度 O(n/m)
- 适合长模式字符串的搜索
边界情况处理
完整实现应考虑以下边界情况:
- 空字符串或空数组的搜索
NaN元素的处理(原生indexOf无法找到NaN)- 稀疏数组的处理
- Unicode 字符的匹配
// 处理NaN的特殊版本
function indexOfWithNaN(arr, element) {
if (Number.isNaN(element)) {
for (let i = 0; i < arr.length; i++) {
if (Number.isNaN(arr[i])) return i;
}
return -1;
}
return arr.indexOf(element);
}
这些实现方案提供了自定义 indexOf 方法的核心功能,可以根据具体需求进行扩展和优化。






