Number.isNaN()是最可靠的NaN判断方法,因NaN不等于自身,故value === NaN无效;它仅当参数为number类型且值为NaN时返回true,而全局isNaN()会强制类型转换导致误判。

直接用 Number.isNaN() 是最可靠的方式判断一个值是否为真正的 NaN,它不会像全局 isNaN() 那样做隐式类型转换。
为什么不能用 value === NaN?
NaN 是唯一一个不等于自身的值 —— 即使是 NaN === NaN 也返回 false。所以任何基于相等比较的写法都无效。
Number.isNaN() 的正确用法
它只在参数是 NaN 类型(且类型必须是 number)时才返回 true,否则一律返回 false:
-
Number.isNaN(NaN)→true -
Number.isNaN(0 / 0)→true -
Number.isNaN("abc")→false(字符串不是 number 类型) -
Number.isNaN(undefined)→false -
Number.isNaN(null)→false -
Number.isNaN({})→false
和全局 isNaN() 的关键区别
全局 isNaN() 会先尝试把参数转成数字再判断,容易误判:
-
isNaN("abc")→true(转成数字是NaN) -
isNaN("123")→false(转成数字是123) -
isNaN({})→true({}转数字是NaN) -
isNaN(" ")→false(空格转数字是0)
这种“自动转换”行为往往不符合预期,尤其在处理用户输入或不确定类型的数据时。
实际使用建议
- 想确认某个值是不是 JS 原生的
NaN?用Number.isNaN(x) - 需要先尝试转数字再判断是否无效?可结合
Number():Number.isNaN(Number(x)) - 检查变量是否为有效数字?推荐
typeof x === 'number' && !Number.isNaN(x)











