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

为什么JavaScript中includes()和indexOf()搜索NaN时行为不同?

核心原因是两个方法的内部等值判断规则不同

你观察到的差异是ES规范明确定义的行为:

  1. indexOf是ES5时期引入的方法,内部使用**严格相等运算符(===)**执行匹配判断,而NaN === NaN的返回结果永远是false,所以无法匹配到数组中的NaN,固定返回-1。
  2. includes是ES2016(ES7)新增的方法,设计时专门修复了NaN匹配的问题,内部采用**SameValueZero(同值零)**比较算法,该算法判定NaN和NaN是相等的,因此可以正确识别数组中的NaN。

三种常见等值判断规则的差异对比如下:

  • 严格相等(===):NaN和NaN判定不等,+0和-0判定相等,适用于indexOf、===运算符
  • SameValueZero(同值零):NaN和NaN判定相等,+0和-0判定相等,适用于includes、Set、Map键匹配
  • SameValue(同值):NaN和NaN判定相等,+0和-0判定不等,适用于Object.is()

你测试的比较结果也完全符合上述规则:

// indexOf逻辑
console.log([1, 2, NaN].indexOf(NaN)); // -1

// includes逻辑
console.log([1, 2, NaN].includes(NaN)); // true

// 严格相等运算符
console.log(NaN === NaN); // false

// 抽象相等运算符同样对NaN判定不等
console.log(NaN == NaN); // false

内容的提问来源于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 10:57:08