JavaScript中使用String.indexOf()搜索空字符串返回异常结果的问题
JavaScript中String.indexOf搜索空字符串的“意外”结果解析
嘿,这个看似不符合预期的结果其实是ECMAScript规范里明确定义的行为,可不是bug哦!先看看你贴出来的代码示例:
console.log('foo'.indexOf('')) // 0 console.log('foo'.indexOf('',2)) // 2 console.log('foo'.indexOf('',3)) // 3 console.log('foo'.indexOf('',4)) // 3 console.log('foo'.indexOf('',100)) // 3
为什么会出现这种情况?
核心原因是空字符串('')被认为在字符串的每个位置都存在匹配——包括字符串开头、每两个字符之间,以及字符串末尾。规范里的判定规则可以简化为:
- 当搜索值是空字符串时,如果传入的
fromIndex小于等于目标字符串的长度,直接返回fromIndex; - 如果
fromIndex大于目标字符串的长度,就返回目标字符串的长度(也就是'foo'.length=3)。
咱们逐个拆解例子:
'foo'.indexOf(''):默认fromIndex为0,0≤3,返回0;'foo'.indexOf('',2):2≤3,返回2;'foo'.indexOf('',3):3等于字符串长度,返回3;'foo'.indexOf('',4)和'foo'.indexOf('',100):4和100都大于3,所以返回字符串长度3。
如何避免这种“意外”?
如果你的业务场景里不需要空字符串的这种匹配逻辑,可以在调用indexOf前先做个判断,比如封装一个安全的工具函数:
function safeIndexOf(str, searchValue) { // 如果搜索值是空字符串,返回你期望的默认值,比如-1 if (searchValue === '') return -1; return str.indexOf(searchValue); } // 测试一下 console.log(safeIndexOf('foo', '')) // -1 console.log(safeIndexOf('foo', 'o')) // 1
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

