首页 > 解决方案 > indexOf 空字符串为零。为什么?

问题描述

为什么这发生在javascript中?

'abc'.indexOf('a');        //0
'abc'.indexOf('');         //0

而在其他虚假值中,该值为-1:

'abc'.indexOf();           //-1
'abc'.indexOf(false);      //-1
'abc'.indexOf(undefined);  //-1

我也看到了这些问题:
Q1没有深入理解答案。
Q2在 java 而不是 javascript 中。

标签: javascriptindexof

解决方案


从根本上说,答案是:因为这就是指定函数的行为方式。从某种角度来看,这是有道理的。

当您搜索空字符串时,与返回 0 相关的主要位是:

返回不小于start的最小可能整数k使得k + searchLen不大于len ,并且对于所有小于searchLen的非负整数j , S内索引k + j处的代码单元与索引处的代码单元相同jsearchStr 中;但如果没有这样的整数k,则返回值 -1。

由于搜索字符串的长度为 0,因此“和”的两半都满足k = 0k + searchLen不大于字符串的长度,并且对于小于搜索长度的所有非负整数(有零),代码点匹配。

或者粗略地说,在代码中:

function indexOf(searchString, position = 0) {
    let s = String(this);
    let searchStr = String(searchString);
    let len = s.length;
    let start = Math.min(Math.max(position, 0), len);
    let searchLen = searchStr.length;
    let k = 0;
    while (k + searchLen <= len) {
        if (s.substring(k, k + searchLen) === searchStr) {
            break;
        }
        ++k;
    }
    const found = k + searchLen <= len;
    return found ? k : -1;
}

由于k + searchLen(0) 是<= len(0),k因此返回 (0)`。

现场示例:

function indexOf(searchString, position = 0) {
    let s = String(this);
    let searchStr = String(searchString);
    let len = s.length;
    let start = Math.min(Math.max(position, 0), len);
    let searchLen = searchStr.length;
    let k = 0;
    while (k + searchLen <= len) {
        if (s.substring(k, k + searchLen) === searchStr) {
            break;
        }
        ++k;
    }
    const found = k + searchLen <= len;
    return found ? k : -1;
}

console.log(indexOf.call("abcd", ""));

另一种看待它的方式是这个与Java相关的答案......或一般的生活。


以非字符串形式传递您的问题:第一步是:

searchStr是 ? ToString(搜索字符串)。

...let searchStr = String(searchString);在我上面的粗略代码中。这意味着false成为"false"undefined成为"undefined""abc"不包含"false""undefined"


推荐阅读