isNaN() 会隐式转换类型后再判断,Number.isNaN() 仅当参数为数字类型且严格等于 NaN 时返回 true;推荐优先使用 Number.isNaN() 确保精确性。

isNaN() 和 Number.isNaN() 都用来判断值是否为 NaN,但行为差异很大——关键在于是否进行**隐式类型转换**。
isNaN() 会先尝试转成数字再判断
它接收任意类型参数,内部会调用 Number() 将参数强制转为数字,再检测结果是否为 NaN。因此很多“看起来不是数字”的值也会返回 true:
-
isNaN("abc")→true("abc"转数字是NaN) -
isNaN("")→false(空字符串转为0) -
isNaN(" ")→false(空白字符串也转为0) -
isNaN({})→true(对象转字符串再转数字,最终NaN) -
isNaN(undefined)→true(undefined转数字是NaN) -
isNaN(null)→false(null转数字是0)
Number.isNaN() 只认真正的 NaN
它要求参数**必须是数字类型且值严格等于 NaN**,不进行任何类型转换。只要不是 number 类型,直接返回 false:
-
Number.isNaN(NaN)→true -
Number.isNaN(0 / 0)→true -
Number.isNaN("NaN")→false(字符串,不是数字) -
Number.isNaN(undefined)→false(不是数字类型) -
Number.isNaN(null)→false -
Number.isNaN({})→false
什么时候该用哪一个?
日常开发中,若目标是确认一个值是否为“无效数值”,推荐优先使用 Number.isNaN(),因为它更精确、不易误判。
立即学习“Java免费学习笔记(深入)”;
- 验证用户输入是否真的计算失败(比如
parseFloat(input)后)→ 用Number.isNaN() - 需要兼容老环境(IE),且能接受宽松判断 → 才考虑
isNaN() - 想明确区分“非数字类型”和“数字类型的 NaN” → 必须用
Number.isNaN()
小技巧:安全检测 NaN 的通用写法
由于 NaN !== NaN 是唯一不等于自身的值,也可以这样判断(不依赖函数):
-
value !== value→ 只有NaN满足,其他值都不成立 - 等价于
Object.is(value, NaN),也是严格、无转换的判断方式


















