在 JavaScript 中,判断一个值是否为 NaN(Not a Number)是一个常见的需求。但你可能会发现,JavaScript 提供了两个看似相似的函数:
- 全局函数
isNaN() Number.isNaN()方法
虽然它们都用于判断 NaN,但在行为和使用场景上存在显著差异。
本文将系统讲解:
- 两者的定义与语法;
- 行为差异(是否进行类型转换);
- 使用场景推荐;
- 实际开发中的最佳实践;
- 如何选择更安全、更准确的 NaN 判断方式。
一、基本用法对比
| 方法 | 语法 | 返回值 |
|---|---|---|
isNaN(value) | isNaN("123") | 如果值不能被转换为数字,返回 true |
Number.isNaN(value) | Number.isNaN(NaN) | 仅当值是 NaN 时返回 true |
二、核心区别对比表
| 特性 | isNaN(value) | Number.isNaN(value) |
|---|---|---|
| 是否进行类型转换 | ✅ 是 | ❌ 否 |
| 对非数字值的处理 | 转换后再判断 | 直接返回 false |
对 "abc" 的判断 | true(误判) | false |
对 undefined 的判断 | true(误判) | false |
对 NaN 的判断 | true | true |
| ES 版本支持 | ES1(很早) | ES6(推荐) |
三、详细行为分析
🔹 示例 1:对字符串的判断
isNaN("abc"); // true
Number.isNaN("abc"); // false
📌 说明:
isNaN("abc")会尝试将其转为数字,失败后返回true;Number.isNaN("abc")不做转换,直接返回false;
🔹 示例 2:对 undefined 的判断
let x;
isNaN(x); // true
Number.isNaN(x); // false
📌 说明:
isNaN(undefined)也会返回true,因为Number(undefined)是NaN;Number.isNaN(undefined)更加严谨,不进行转换,返回false;
🔹 示例 3:对真正的 NaN 值的判断
const val = Math.sqrt(-1);
isNaN(val); // true
Number.isNaN(val); // true
📌 说明:
- 两者都能正确识别真正的
NaN; - 但
Number.isNaN更加“纯粹”地判断,避免了误判;
四、一句话总结
isNaN()会先尝试将参数转换为数字,再判断是否为NaN,容易产生误判;而Number.isNaN()不进行类型转换,只有当传入的是真正的NaN时才返回true。因此,在现代开发中应优先使用Number.isNaN()。
五、如何选择?
| 场景 | 推荐方法 | 理由 |
|---|---|---|
判断原始值是否是 NaN | ✅ Number.isNaN() | 更精确、不转换、不误判 |
| 需要兼容老旧浏览器或环境 | ⚠️ isNaN() | 支持性更好 |
| 判断用户输入是否合法数字 | ❌ 都不太合适 | 应结合 typeof 和 !isNaN() 判断 |
需要严格区分 NaN 和其他无效值 | ✅ Number.isNaN() | 更加语义明确 |
六、进阶建议
- 使用 TypeScript 可以提前规避
NaN类型问题; - 使用
Optional Chaining(?.)和Nullish Coalescing(??)提高代码健壮性; - 在 Vue / React 状态管理中合理处理无效数据;
- 使用 ESLint 规则禁止直接使用全局
isNaN();