首页 > web前端 > js教程 > string.indexOf() 底层

string.indexOf() 底层

DDD
发布: 2025-01-17 08:27:08
原创
117 人浏览过

string.indexOf() under the hood

大家好,开发者们!

今天,我尝试从零开始实现indexOf()方法。到目前为止,我发现以下内容:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    // 调整起始索引,如果它是负数
    if (start < 0) {
        start = string.length + start;
    }

    // 确保起始索引在字符串长度范围内
    if (start < 0) {
        start = 0;
    } else if (start >= string.length) {
        return -1; // 目标索引超出字符串范围
    }

    // 循环遍历字符串
    for (let i = start; i <= string.length - l; i++) {
        if (string.substring(i, i + l) === target) {
            return i; // 找到目标子串
        }
    }

    return -1; // 未找到目标子串
}</code>
登录后复制

代码解释:

indexOf()方法接受三个参数:

  1. string:要搜索的字符串。
  2. target:要查找的子字符串。
  3. start:搜索将开始的索引(默认为0)。

我的第一次尝试:

我最初的想法很简单:循环遍历字符串,当我找到string[i] === target时,返回i。如果循环结束时没有找到匹配项,则返回-1。代码如下:

<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
登录后复制

然而,这种方法只在target是单个字符时有效,因为我们是逐个字符进行比较。

我的第二次尝试:

然后我意识到,如果target的长度超过一个字符,我需要比较子字符串。我使用substr()方法来比较与target长度相同的子字符串。循环调整为当字符串中剩余的字符足够进行比较时停止:

<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
登录后复制

我的第三次尝试:

接下来,我需要处理start参数,它可以是负数。内置的indexOf()方法在start为负数时从string.length start开始搜索。例如,如果字符串长度为10,start为-4,则搜索将从索引6(即10 - 4)开始。

为了解决这个问题,我更新了代码以处理负的start值:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    if (start < 0) {
        start = string.length + start;
    }

    // ... (其余代码与第二次尝试相同)
}</code>
登录后复制

最终版本:

出于好奇,我想处理大于字符串长度的start值,我决定修改函数,以便如果start超过字符串长度,则继续“环绕”字符串。这样,函数将在环绕后从适当的索引继续搜索。最终的解决方案使用此公式来调整起始索引:

<code class="language-javascript">start = (string.length + start) % string.length;</code>
登录后复制

工作原理:

  • 模运算符start % string.length确保start在-string.lengthstring.length的范围内。
  • 添加string.length确保任何负结果都变成正数。
  • 最终的模运算确保start的值被环绕并落在有效的索引边界内。

接下来我想使用二分查找而不是线性查找,您觉得怎么样?

以上是string.indexOf() 底层的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板