为什么indexOf()和findIndex()搭配Number.isNaN处理NaN时表现不一致?
核心差异原因
1. 两个方法的入参逻辑完全不同
findIndex()接收的是判断回调函数,会遍历数组每一项传入回调执行,只要回调返回true就认为匹配成功,返回对应索引。你传入Number.isNaN作为判断逻辑,数组第二项NaN传入Number.isNaN()返回true,所以正确返回索引1,对应示例代码是合法的:
console.log([1, NaN, 3].findIndex(Number.isNaN)); // 输出1
indexOf()接收的是要匹配的具体值,你传入Number.isNaN相当于在数组里找这个函数对象,数组内只有数字值,自然匹配失败返回-1。就算你修正写法传入NaN作为匹配值,还是会匹配失败:
// 修正入参为NaN后依然返回-1 console.log([1, NaN, 3].indexOf(NaN)); // 输出-1
2. 内置相等判断规则的差异
这是即使修正入参后两者表现仍不同的根本原因:
indexOf内部使用**严格相等(===)**做等值判断,而JS中NaN的核心特性就是NaN === NaN永远返回false,所以永远无法匹配到数组里的NaN。findIndex本身不内置固定的相等判断规则,完全由开发者传入的回调函数定义判断逻辑,你使用了专门用来识别NaN的Number.isNaN()方法,自然可以正确匹配到NaN的位置。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

