NaN 不等于自身,应使用 Number.isNaN() 准确检测;按需过滤、替换或标记 NaN;警惕字符串等隐式转换产生的“假 NaN”;性能敏感时可缓存 Number.isNaN 或用 x === x 技巧。

NaN 是 JavaScript 中一个特殊值,它不等于任何值(包括它自己),这使得直接用 === 或 == 判断 NaN 很容易出错。高效处理数组中的 NaN,关键在于选对检测方法、明确处理目标(过滤?替换?统计?),并避免常见陷阱。
用 Number.isNaN() 准确识别 NaN
别再用 arr[i] === NaN —— 它永远返回 false。也慎用全局 isNaN(),它会把非数字值(如字符串 "abc")强制转数字再判断,导致误判。
推荐始终使用 Number.isNaN(),它只在参数严格为 NaN 类型时返回 true:
Number.isNaN(NaN) // trueNumber.isNaN(0/0) // trueNumber.isNaN("abc") // false(不会强制转换)Number.isNaN(undefined) // false
按需选择处理方式:过滤、替换或标记
不同场景适合不同策略,不要一概而论:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
想剔除 NaN(比如准备传给图表库):用
filter+Number.isNaN取反[1, NaN, 2, "a", NaN].filter(x => !Number.isNaN(x)) // [1, 2, "a"] -
想用默认值替换 NaN(比如做数值计算):用
map[1, NaN, 3].map(x => Number.isNaN(x) ? 0 : x) // [1, 0, 3] -
只想知道哪些位置是 NaN:用
map或reduce记录索引[1, NaN, 2, NaN].map((x, i) => Number.isNaN(x) ? i : -1).filter(i => i !== -1) // [1, 3]
警惕隐式类型转换带来的“假 NaN”
有些值看似是 NaN,其实是字符串 "NaN" 或空字符串 "",它们不是真正的 NaN,但参与运算时可能产生 NaN:
-
+"NaN" // NaN(字符串转数字失败) parseInt("abc") // NaN-
[] + [] // "",但+" "是0,+" "也是0,而+"abc"是NaN
如果数据来自用户输入或 API,建议先清洗再处理:统一转数字,再用 Number.isNaN() 检测结果是否有效。
性能敏感时避免重复调用
对大数组频繁操作时,可把 Number.isNaN 提前赋值为变量,减少属性查找开销;或用位运算技巧(仅适用于纯数字数组):
- 简单提速:
const isnan = Number.isNaN; arr.filter(x => !isnan(x)) - 注意:
x !== x在 JS 中只对 NaN 成立,所以arr.filter(x => x === x)也能过滤 NaN(但可读性差,且不适用于undefined或Symbol等)

















