javascript - indexOf 空字符串为零。为什么?
问题描述
为什么这发生在javascript中?
'abc'.indexOf('a'); //0
'abc'.indexOf(''); //0
而在其他虚假值中,该值为-1:
'abc'.indexOf(); //-1
'abc'.indexOf(false); //-1
'abc'.indexOf(undefined); //-1
解决方案
从根本上说,答案是:因为这就是指定函数的行为方式。从某种角度来看,这是有道理的。
当您搜索空字符串时,与返回 0 相关的主要位是:
返回不小于start的最小可能整数k使得k + searchLen不大于len ,并且对于所有小于searchLen的非负整数j , S内索引k + j处的代码单元与索引处的代码单元相同j在searchStr 中;但如果没有这样的整数k,则返回值 -1。
由于搜索字符串的长度为 0,因此“和”的两半都满足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", ""));
另一种看待它的方式是这个与Java相关的答案......或一般的生活。
以非字符串形式传递您的问题:第一步是:
让searchStr是 ? ToString(搜索字符串)。
...let searchStr = String(searchString);
在我上面的粗略代码中。这意味着false
成为"false"
和undefined
成为"undefined"
。"abc"
不包含"false"
或"undefined"
。
推荐阅读
- html - 如何水平扩展 CSS 家谱?
- javascript - Javascript 或 jQuery 根据值填充数据
- android-volley - RecyclerView 中的 Gson 请求
- python - 如何将前导零填充到时间列?
- javascript - 如何在客户端导入 socket.io - SOCKET.IO + NODE.JS
- firebase - 线程 1:EXC_BAD_ACCESS 尝试将图像上传到 Firebase
- android - Android timepicker - 删除上面和底部的行
- node.js - Azure 错误:SSL 错误:使用猫鼬时的 CERT_UNTRUSTED
- string - Pandas:将字符串转换为浮点数时出现精度错误
- python - 使用 xlrd 模块将 xls 转换为 Python 数组