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 = 0: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...或一般生活有关。
关于传递非字符串的问题:第一步是:
Let searchStr be ? ToString(searchString).
...在我上面的粗略代码中是 let searchStr = String(searchString);
。这意味着 false
变为 "false"
而 undefined
变为 "undefined"
。 "abc"
不包含 "false"
或 "undefined"
。
为什么在 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 = 0: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...或一般生活有关。
关于传递非字符串的问题:第一步是:
Let searchStr be ? ToString(searchString).
...在我上面的粗略代码中是 let searchStr = String(searchString);
。这意味着 false
变为 "false"
而 undefined
变为 "undefined"
。 "abc"
不包含 "false"
或 "undefined"
。