应使用 number.isnan() 判断 nan,因其严格只对 number 类型的 nan 返回 true;过滤时优先用 number.isfinite(),可同时排除 nan、infinity 和非数字类型,语义清晰且无隐式转换。

JavaScript 中判断和过滤 NaN,核心在于不依赖相等比较(=== 或 ==),因为 NaN !== NaN 是它最根本的特性。真正可靠的做法是用专门设计的检测方法,并结合数据清洗逻辑。
用 Number.isNaN() 判断是否为 NaN
这是目前最推荐、最安全的方式,ES6 标准引入,行为明确:
- 只对真正是
number类型且值为NaN的值返回true - 对字符串
"abc"、null、undefined、对象、数组等非数字类型一律返回false,不尝试转换 - 不会误判空字符串、
false、0等看似“非数字”但能转成有效数字的值
示例:
Number.isNaN(NaN) → true
Number.isNaN("abc" - 1) → true(计算得 NaN)
Number.isNaN("123") → false
Number.isNaN(undefined) → false
Number.isNaN(0 / 0) → true
别用 isNaN(),除非你清楚它的转换逻辑
isNaN() 是全局函数,会先调用 Number(value) 强制转数字再判断,容易引发意外结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
isNaN("")→false(空字符串转为0) -
isNaN(" ")→false(空白字符串也转为0) -
isNaN("1e2")→false(科学计数法字符串可转) -
isNaN({})→true(对象转数字是NaN,但过程不可控)
这种隐式转换让逻辑难以追踪,现代项目中应避免用于精准判断。
用 Number.isFinite() 一步过滤 NaN 和无穷大
当目标是清洗统计类数值(比如用户时长、价格、评分),真正想要的是合法的有限数字,这时 Number.isFinite() 比单独筛 NaN 更实用:
- 仅对
number类型、且不为NaN、不为Infinity或-Infinity的值返回true - 自动排除
null、undefined、字符串、布尔值等非数字类型(全部返回false) - 不发生任何类型转换,语义清晰,适合数据预处理
示例(过滤无效统计值):
const raw = [120, NaN, 45.5, Infinity, -30, null, 0, "60", undefined];
const valid = raw.filter(Number.isFinite);
// → [120, 45.5, -30, 0]
避免常见误操作
以下写法都不可靠,请直接放弃:
-
value === NaN—— 永远为false,违反基本事实 -
typeof value === "number" && !isFinite(value)—— 可能漏掉Infinity,也可能因isFinite的类型转换出错(应使用Number.isFinite) -
!value或value == null——NaN转布尔是false,但0、""、false同样为false,完全无法区分 -
value !== value—— 虽然技术上成立(NaN是唯一不等于自身的值),但可读性差、意图模糊,不建议在业务代码中使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










