为何在JavaScript代码中需用-1而非0才能正确运行?
问题原因解析
先看两种代码的核心差异:
正常运行的代码逻辑:
let str = "Hello world"; let target = "o"; let pos = -1; while ((pos = str.indexOf(target, pos + 1)) != -1) { console.log( pos ); }
出问题的代码逻辑:
let str = "Hello world"; let target = "o"; let pos = 0; while ((pos = str.indexOf(target, pos)) != -1) { console.log( pos ); }
关键在于indexOf的第二个参数
str.indexOf(searchValue, fromIndex)的第二个参数fromIndex是开始搜索的起始位置:当你从位置n开始搜索时,indexOf会从str[n]开始往后找匹配的字符,包括str[n]本身。
两种情况的执行流程对比
正常情况(pos初始-1,每次+1):
- 第一次循环:
pos+1是0,从位置0开始找"o",找到位置4,pos赋值为4,输出4。 - 第二次循环:
pos+1是5,从位置5开始找"o",找到位置7,pos赋值为7,输出7。 - 第三次循环:
pos+1是8,从位置8开始往后找,再也找不到"o",pos赋值为-1,循环结束。
- 第一次循环:
出问题的情况(pos初始0,无+1):
- 第一次循环:从位置0开始找"o",找到位置4,
pos赋值为4,输出4。 - 第二次循环:从位置4开始找"o"——而
str[4]本身就是"o",所以indexOf直接返回4,pos还是4,输出4。 - 后续循环重复这个过程:每次都从位置4开始找,每次都返回4,
pos永远不等于-1,循环无限执行,一直输出4。
- 第一次循环:从位置0开始找"o",找到位置4,
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

