JS的indexOf用法,这里先看看W3C的介绍:W3C-indexOf​​

JS的字符串/数组使用indexOf()开始位置为-1,查找内容为““,开始位置大于字符串长度_js


官方介绍了常规用法,但是并没有告诉我们fromindex为负数,或者fromindex大于字符串长度,再或者searchvalue为""这些情况的用法!!!

这些非常规情况一般人很难想到这么尝试,当然咯,我也是一般人,所以这中写法并不是我想到的,是一个道友晚上问我,我看了一下,乍一看这不就是indexOf查找么,简单,但是仔细一看,有点想不通,于是就查了一下资料,当场还没查出来,就给了她一个我猜想的答案,但是我知道这个答案有点站不住脚,那晚加班回来也有点累了,还要洗澡,就说明天帮她看看!!!

indexOf-字符串

1.开始位置为负数
这种情况的话这个负数会自动转换为0开始查找
跑两段代码就能提现

var s="0123456789123"
console.log(s.indexOf("3",-1));//3
console.log(s.indexOf("3",-100));//3

2.开始位置大于/等于字符串长度
var s=“0123456789123”
console.log(s.indexOf(“3”,13));//-1
console.log(s.indexOf(“3”,14));//-1
补充一点这里查找的最大范围也就是字符串的长度

3.查找内容为""
这里的话不是很好理解,看一段代码

var s="0123456789123"
console.log(s.indexOf("",-1)); //0
console.log(s.indexOf("",5)); //5
console.log(s.indexOf("",140));//13

底层匹配逻辑步骤
1.得到要匹配的字符串长度,这里的"“长度就是0
2.在原字符串上从fromindex开始截,截取长度为需要匹配的字符串长度,这里也就是indexOf(fromindex,0)
那么这里不管怎么截取,截取到的永远是”",前提是传入需要匹配的字符串也为""
3.将截取到的字符串和需要匹配的字符串对比,这里实际上就是两个"“在对比,当然两个”“坑定也是相等的
4.结论当indexOf传入需要匹配的内容为”",返回开始位置

这里的第一行代码就能验证查找开始位置为负数是默认从0开始,这里的第三行代码也能验证查找的最大范围是字符串的长度

indexOf-数组

数组的非常规操作就和字符串的截然不同
1.开始位置为负数

var arr = [0,1,2,3,4,5,6,5,4,3,2,1,9];
console.log(arr.indexOf(2, -1)); // -1
console.log(arr.indexOf(2, -5)); // 10
console.log(arr.indexOf(9, -1)); // 12
console.log(arr.indexOf(6, -100)); // 6

简单分析第一行输出结果为-1
数组的fromIndex为-1时会开始位置会从后往前1个位置,也就是倒数第1个开始,那么这时是从最后一位9开始找2,这肯定是找不到的返回-1

分析第二行输出结果,套用上面的逻辑
-5从后往前5个位置,也就是定在第二个4的位置,那么从这里开始找,找到的是第二个2,返回第二个2的位置下标为10

验证-1是从数组倒数第一个开始并且包含
第三行代码就能验证这个结论

**注意:**这里也存在像字符串的负值范围,负值大小抵消后的索引值仍小于0,则整个数组都将会被查询。也就是从头开始查。
第四行代码能够验证这个结论

2.开始位置大于/等于字符串长度

var arr = [0,1,2,3,4,5,6,5,4,3,2,1,9];
console.log(arr.indexOf(9, 12)); // 12
console.log(arr.indexOf(9, 13)); // -1

这里和字符串是类似的

3.查找内容为""

console.log(arr.indexOf("", -12)); // -1
console.log(arr.indexOf("", 2)); // -1

这里直接是取出对应的数组下标中的值来和""对比,而不是像字符串一样截取然后对比,所以这里返回-1