Number.isNaN 是 ES6 引入的严格 NaN 判断方法,不进行隐式类型转换,仅当参数为 number 类型且严格等于 NaN 时返回 true;全局 isNaN() 会先转数字再判断,易误判。

Number.isNaN 是 ES6 引入的更严格、更可靠的 NaN 判断方法,它不会像全局 isNaN() 那样进行隐式类型转换,因此能准确区分“真的是 NaN”和“转成数字后是 NaN”的情况。
为什么需要替代全局 isNaN
全局 isNaN() 会先尝试把参数转为数字再判断,导致很多非数字值(如空字符串、null、true、undefined、对象)也返回 true:
isNaN(''); // false(空字符串转为 0)
isNaN('abc'); // true('abc' → NaN)
isNaN({}); // true({} → NaN)
isNaN(null); // false(null → 0)
isNaN(undefined); // true(undefined → NaN)
isNaN(true); // false(true → 1)
这种行为容易引发误判。而 Number.isNaN() 只对原始值 NaN 返回 true,其他任何值(包括字符串 'NaN'、数字 0/0 以外的值)都返回 false。
Number.isNaN 的正确用法
- 只接受一个参数,且必须是 number 类型;如果不是 number,直接返回 false
- 只有当传入的值严格等于 NaN(即
value !== value成立)时才返回 true - 不进行类型转换,所以
Number.isNaN('NaN')、Number.isNaN(0/0)都是 false?等等——注意:0/0计算结果就是 NaN,所以Number.isNaN(0/0)实际上是 true
常见示例:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Number.isNaN(NaN); // true
Number.isNaN(0/0); // true
Number.isNaN(Number.NaN); // true
Number.isNaN('NaN'); // false(字符串不是 NaN)
Number.isNaN(undefined); // false(不是 number 类型)
Number.isNaN({}); // false
Number.isNaN(123); // false
Number.isNaN('123'); // false(字符串不是 number 类型)
如何安全地检测“可能为 NaN 的值”
如果你不确定输入是否为 number 类型,又想判断它“是否在数值意义上为 NaN”,推荐组合使用 typeof 和 Number.isNaN:
- 先检查是否为
'number'类型 - 再用 Number.isNaN() 判断
封装一个稳妥的判断函数:
function isReallyNaN(value) {
return typeof value === 'number' && Number.isNaN(value);
}
isReallyNaN(NaN); // true
isReallyNaN('NaN'); // false
isReallyNaN(null); // false
isReallyNaN(+'abc'); // true(+'abc' → NaN,且是 number 类型)
兼容性与降级方案
Number.isNaN 在现代浏览器和 Node.js(v0.12+)中均支持。如需兼容老环境(如 IE),可用以下 polyfill:
if (!Number.isNaN) {
Number.isNaN = function(value) {
return typeof value === 'number' && value !== value;
};
}
这个 polyfill 利用了 NaN 唯一的自反性特征:NaN !== NaN 为 true,而其他所有值都满足 x === x。

















