indexof()和lastindexof()使用严格相等(===)匹配,基本类型需值与类型均相同,nan例外视为自等,对象仅认引用不认内容,负索引先转正再搜索。

indexOf() 和 lastIndexOf() 都用 严格相等(===) 判断匹配,不是“看起来一样”就算,而是值和类型都必须完全一致,且对象必须是同一引用。
基本类型:值与类型双匹配
数字、字符串、布尔值、null、undefined 这些基本类型,只要值和类型都相同,就匹配成功。
-
[1, '2', true].indexOf(1)→ 返回 0(数字 1 匹配数字 1) -
[1, '2', true].indexOf('1')→ 返回 -1(字符串 '1' ≠ 数字 1) -
[true, false].indexOf(1)→ 返回 -1(true !== 1,不进行类型转换)
NaN 的特殊行为
这是唯一一个违反 === 常规逻辑的例外:NaN 与自身不相等(NaN === NaN 是 false),但 indexOf() 会把它当作相等处理。
-
[NaN, 2, 3].indexOf(NaN)→ 返回 0(正常返回首个位置) -
[2, NaN].lastIndexOf(NaN)→ 返回 1(从右找,仍能命中)
对象和数组:只认引用,不认内容
两个对象哪怕结构一模一样,只要不是同一个内存地址,就判定为不相等。
-
[{id: 1}, {id: 2}].indexOf({id: 2})→ 返回 -1(新对象,引用不同) -
const obj = {id: 2}; [{id: 1}, obj].indexOf(obj)→ 返回 1(引用相同) -
[[1,2], [3,4]].indexOf([1,2])→ 返回 -1(数组也是对象,引用不同)
负数起始索引的转换规则
第二个参数为负数时,并非“倒着数”,而是先转成正向索引再执行搜索方向逻辑:
-
[1,2,3,4,5].indexOf(3, -3)→ 等价于.indexOf(3, 2)→ 从索引 2 开始往后找 → 返回 2 -
[1,2,3,4,5].lastIndexOf(3, -3)→ 等价于.lastIndexOf(3, 2)→ 从索引 2 开始往前找 → 返回 2 -
[1,2,3,4,5].indexOf(1, -10)→ 负数超出范围 → 自动归为 0 → 正常从头找 → 返回 0










