You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:06:02