当前位置:首页 > JavaScript

js indexof 实现原理

2026-02-03 07:38:08JavaScript

JavaScript indexOf 的实现原理

JavaScript 的 indexOf 方法用于在字符串或数组中查找指定元素的首次出现位置。其实现原理基于线性搜索(顺序遍历),以下是具体细节:

字符串的 indexOf

字符串的 indexOf 方法会从指定位置开始,逐个字符比较目标子串与源字符串的匹配情况。如果找到匹配的子串,返回起始索引;否则返回 -1

算法步骤:

  1. 检查输入参数是否合法(如 searchValue 是否为字符串)。
  2. fromIndex 指定的位置开始遍历字符串。
  3. 对于每个起始位置,比较目标子串与源字符串的对应字符。
  4. 如果所有字符匹配,返回当前起始索引。
  5. 遍历结束后未找到匹配项,返回 -1

示例代码模拟实现:

function customIndexOf(str, searchValue, fromIndex = 0) {
  if (searchValue === "") return fromIndex >= str.length ? str.length : Math.min(fromIndex, str.length);
  for (let i = fromIndex; i <= str.length - searchValue.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;
}

数组的 indexOf

数组的 indexOf 方法通过严格相等(===)比较元素,返回第一个匹配项的索引。

算法步骤:

  1. fromIndex 开始遍历数组。
  2. 对每个元素使用 === 比较目标值。
  3. 找到匹配项时返回当前索引。
  4. 遍历结束后未找到匹配项,返回 -1

示例代码模拟实现:

js indexof 实现原理

function customArrayIndexOf(arr, searchElement, fromIndex = 0) {
  for (let i = fromIndex; i < arr.length; i++) {
    if (arr[i] === searchElement) return i;
  }
  return -1;
}

性能特点

  • 时间复杂度:最坏情况下为 O(n),需要遍历整个字符串或数组。
  • 优化:现代 JavaScript 引擎(如 V8)会针对长字符串或数组使用更高效的算法(如 Boyer-Moore),但标准实现仍基于线性搜索。

注意事项

  1. 字符串的 indexOf 区分大小写。
  2. 数组的 indexOf 使用严格相等,不适用于深比较或特殊对象。
  3. fromIndex 为负数时,会被视为 length + fromIndex

标签: 原理js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…