isnan会先将参数转为数字再判断是否为nan,number.isnan则仅当参数严格等于nan时返回true;前者易误判undefined、{}等值,后者行为更精准可靠。

isNaN 和 Number.isNaN 都用来判断一个值是否为 NaN,但它们的判断逻辑和适用场景完全不同——关键在于:前者会先尝试把参数转成数字再判断,后者只对严格意义上的 NaN 返回 true。
isNaN 会进行隐式类型转换
isNaN() 是全局函数,它会先调用 Number() 把传入的值转为数字,再检测结果是否为 NaN。这意味着很多非数字值(如空字符串、布尔值、null)也会被“误判”为 NaN:
-
isNaN("abc")→true(字符串无法转成有效数字) -
isNaN("")→false(空字符串转为0,不是NaN) -
isNaN(" ")→false(空白字符串也转为0) -
isNaN(null)→false(null转为0) -
isNaN(undefined)→true(undefined转为NaN) -
isNaN({})→true(对象转字符串再转数字失败)
Number.isNaN 只认真正的 NaN
Number.isNaN() 是 ES6 新增的严格判断方法,它**不进行任何类型转换**,只在参数本身就是 NaN(即 value !== value 成立)时才返回 true:
-
Number.isNaN(NaN)→true -
Number.isNaN("NaN")→false(字符串不是NaN) -
Number.isNaN(0 / 0)→true(结果是原始NaN) -
Number.isNaN(undefined)→false -
Number.isNaN(null)→false
什么时候该用哪一个?
日常开发中推荐优先使用 Number.isNaN,因为它行为确定、不易出错,适合做精确的 NaN 校验。比如检查某个计算结果是否真的失效:
- 验证
parseFloat(input)是否解析失败 → 用Number.isNaN(parseFloat(input)) - 检查
Math.sqrt(-1)结果 → 直接Number.isNaN(Math.sqrt(-1)) - 避免用
isNaN判断用户输入是否“非数字”,因为它对空格、空字符串、false等都可能返回意外结果
一个小技巧:快速识别 NaN 的本质
NaN 是唯一一个不等于自身的值。所以最底层的判断其实是:value !== value。这也是 Number.isNaN 的实现原理。而 isNaN 的等价写法其实是:Number(value) !== Number(value) —— 先转数字,再比是否不等于自己。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











