为什么在javascript中会发生这种情况?
this
在其他虚假值中,该值为-1:
'abc'.indexOf('a'); //0
'abc'.indexOf(''); //0
答案 0 :(得分:3)
基本上,答案是:因为这就是函数is specified to behave的方式。从某种角度讲,这是有道理的。
与搜索空字符串时返回0相关的主要位是:
返回不小于 start 的最小可能整数 k ,以使 k + searchLen 不大于 len ,并且对于所有小于 searchLen 的非负整数 j ,位于 S 中索引为 k + j 的代码单元与 searchStr 中索引为 j 的代码单元相同;但是如果没有这样的整数 k ,则返回值-1。
由于搜索字符串的长度为0,因此 k = 0 满足“ and”的两个部分:k + 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 ...或一般生活有关。
通过非字符串传递您的问题:第一步是:
让 searchStr 是? ToString( searchString )。
...在我上面的粗略代码中为let searchStr = String(searchString);
。这意味着false
变成"false"
,而undefined
变成"undefined"
。 "abc"
不包含"false"
或"undefined"
。