number.isnan 是 es6 引入的严格判断 nan 的方法,不进行类型转换,仅当参数是原始数值 nan 时返回 true;而全局 isnan() 会先强制转换类型,导致误判。

Number.isNaN 是 ES6 引入的专门用于判断值是否为 NaN 的方法,它比全局函数 isNaN() 更严格、更可靠。
为什么传统 isNaN() 有缺陷?
全局 isNaN() 会先尝试把参数转成数字,再判断结果是否为 NaN。这导致很多“看起来不是数字”的值被误判为 true:
-
isNaN("abc")→true(合理) -
isNaN(" ")→false(空格转为 0,不是 NaN) -
isNaN(undefined)→true(undefined 转为 NaN) -
isNaN({})→true(对象转字符串再转数字失败) -
isNaN(NaN)→true(唯一真正该返回 true 的情况)
问题在于:它判断的是“能否转成有效数字”,而不是“这个值本身是不是 NaN”。
Number.isNaN 的核心优势
Number.isNaN() 不做类型转换,只检查传入的值是否是原始数值类型 NaN:
-
Number.isNaN(NaN)→true -
Number.isNaN(0)→false -
Number.isNaN("abc")→false(字符串不是 NaN) -
Number.isNaN(undefined)→false(undefined 不是 NaN) -
Number.isNaN({})→false(对象不是 NaN) -
Number.isNaN(Number("abc"))→true(显式转出 NaN 后才成立)
它真正回答的问题是:“这个值是不是那个特殊的、唯一的、typeof 为 "number" 却不等于自身的 NaN?”
如何准确判断“非数字值”?
注意:Number.isNaN 只判断 NaN,不判断其他非数字值。要判断一个值是否“不是有效数字”,需组合使用:
- 先用
typeof value === "number"确保是数字类型 - 再用
!Number.isNaN(value)排除 NaN - 合起来就是:
typeof value === "number" && !Number.isNaN(value)→ 表示“是有效数字” - 反过来:
!(typeof value === "number" && !Number.isNaN(value))或更清晰地写成:typeof value !== "number" || Number.isNaN(value)→ 表示“非有效数字”
例如检测用户输入是否可安全参与计算:
function isValidNumber(val) {return typeof val === "number" && !Number.isNaN(val);
}
常见误用提醒
- 不要用
Number.isNaN("123")判断字符串是否为数字——它永远返回false,因为字符串不是NaN - 不要期望它代替
Number()或parseInt()的解析逻辑;它只做身份识别 - 对可能为字符串的输入,应先用
Number(str)转换,再用Number.isNaN()检查结果 -
Object.is(value, NaN)也能准确判断 NaN,但语义不如Number.isNaN直观
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











