includes()能准确识别nan,因其内部使用samevaluezero算法使nan===nan为true;而===和indexof基于严格相等,故nan===nan恒为false。

直接用 includes() 就行,它原生支持 NaN 判定,无需额外处理。
为什么 includes() 能准确识别 NaN
includes() 内部使用 SameValueZero 算法进行比较,该算法规定 NaN === NaN 为 true;而 JavaScript 原生的严格相等(===)和 indexOf() 都基于 ===,所以 NaN === NaN 恒为 false。
-
[NaN].includes(NaN)→ true -
[NaN].indexOf(NaN)→ -1 -
NaN === NaN→ false
实际写法与常见示例
只要数组中显式存入了 NaN,无论位置在哪,includes() 都能返回正确结果:
-
[1, 2, NaN, 4].includes(NaN)→ true -
[undefined, null, 'a'].includes(NaN)→ false -
[0, -0, NaN].includes(NaN)→ true
需要注意的边界情况
虽简洁可靠,但需避开几个典型误区:
- 只检测数组中显式写入的 NaN,不会把空槽位(empty slot)当作
NaN - 别混淆用途:
Number.isNaN(x)是判断某个值是否为NaN,而arr.includes(NaN)是查NaN是否在数组里 - 切勿写成
arr.includes('NaN')—— 字符串'NaN'和原始值NaN完全不同
对比其他方法:为什么不用 indexOf 或 some()
传统方式容易出错或不够直观:
-
arr.indexOf(NaN) !== -1→ 总是 false,不可靠 -
arr.some(Number.isNaN)→ 可行,但仅适用于检查元素本身是否为NaN,不能指定查找目标(比如你只想确认NaN是否存在,而非泛泛检查“有没有 NaN 元素”) -
arr.findIndex(x => x !== x)→ 虽能利用NaN ≠ NaN的特性,但逻辑绕、可读性差











