es6的includes()方法是判断数组是否包含nan最安全直接的方式,因其使用samevaluezero算法使nan===nan为true,而indexof()用严格相等故无法识别nan。

ES6 的 includes() 方法是目前最安全、最直接判断数组是否包含 NaN 的方式——它天然支持 NaN 的正确识别,无需额外处理。
为什么 includes 能准确判断 NaN
includes() 内部使用的是 SameValueZero 算法(不是严格相等 ===),该算法规定 NaN === NaN 为 true。而 indexOf() 用的是严格相等,所以 [NaN].indexOf(NaN) 永远返回 -1,误判为“不存在”。
-
[NaN].includes(NaN)→ true -
[NaN].indexOf(NaN)→ -1(不可靠)
实际使用注意事项
虽然 includes() 对 NaN 安全,但需注意以下几点:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 必须确保目标值确实是
NaN类型,而不是字符串"NaN"或其他假值;['NaN'].includes(NaN)是false - 数组中若存在空槽(如
new Array(3)),includes(undefined)会返回true,因为空槽在includes中被视作undefined;但indexOf(undefined)不会匹配空槽 - 不进行类型转换:
[1, 2, 3].includes('2')返回false,和NaN判断逻辑一致——完全按值和类型匹配
兼容性兜底方案(必要时)
如果需支持老旧环境(如 IE),可手动补丁:
if (!Array.prototype.includes) {
Array.prototype.includes = function(searchElement, fromIndex = 0) {
const len = this.length;
const start = fromIndex >= 0 ? fromIndex : Math.max(len + fromIndex, 0);
for (let i = start; i
<p>其中 <code>Object.is()</code> 是 SameValueZero 的标准实现,能正确处理 <code>NaN</code>、<code>-0</code> 和 <code>+0</code>。</p>
<h3>对比其他方法为什么不推荐用于 NaN 检测</h3>
<p>除 <code>includes()</code> 外,常见替代方法在 <code>NaN</code> 场景下均不可靠:</p>
-
some(v => v === NaN)→ 永远false(因NaN === NaN为false) -
find(v => v === NaN)→ 返回undefined -
some(v => isNaN(v))→ 可能误判(如isNaN('hello')也是true),且无法区分数组中是否真有NaN元素 -
some(v => Object.is(v, NaN))→ 可行,但比原生includes(NaN)冗余,且无起始索引控制能力










