indexOf 空字符串为零。为什么?

indexOf empty string is zero. why?

为什么在 java 脚本中发生这种情况?

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

而在其他falsy值中,值为-1:

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

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

从根本上说,答案是:因为函数就是这样 is specified to behave。从某种角度来看,这是有道理的。

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

Return the smallest possible integer k not smaller than start such that k + searchLen is not greater than len, and for all nonnegative integers j less than searchLen, the code unit at index k + j within S is the same as the code unit at index j within searchStr; but if there is no such integer k, return the value -1.

由于搜索字符串的长度为 0,"and" 的两半都满足 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", ""));

另一种看待它的方式是 this answer 与 Java...或一般生活有关。


关于传递非字符串的问题:第一步是:

Let searchStr be ? ToString(searchString).

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