判断 JavaScript 变量是否为 NaN:选 Number.isNaN 还是全局 isNaN?
在日常开发中,我们经常需要判断一个变量是否为 NaN。很多开发者第一反应是写 value === NaN,但这种方式永远不成立,因为 NaN 是 JavaScript 中唯一一个不等于自身的特殊值。因此必须使用专门的方法来判断。那么究竟该使用 Number.isNaN 还是全局的 isNaN?答案很清晰:优先使用 Number.isNaN。它只识别真正的 NaN,不会进行类型转换;而全局 isNaN 会先将参数转为数字再判断,本质上是在问“这个值能否变成有效数字”,语义模糊且容易误判。
Number.isNaN:仅对 number 类型的 NaN 返回 true
它不做任何类型转换或隐式转换,只有参数是 number 类型且严格等于 NaN 时才返回 true。
- Number.isNaN(NaN) → true
- Number.isNaN(0 / 0) → true(结果为 number 类型的 NaN)
- Number.isNaN("NaN") → false(字符串,非 number 类型)
- Number.isNaN(undefined) → false(类型不匹配)
- Number.isNaN(null) → false
- Number.isNaN({}) → false
全局 isNaN:先调用 Number() 转换,再检测是否为 NaN
它的内部机制是先对任意类型尝试调用 Number() 转为数字,然后判断结果是否为 NaN。因此返回 true 并不代表“它是 NaN”,而是“它无法转换为有效数字”。
- isNaN("hello") → true(Number("hello") 等于 NaN)
- isNaN("") → false(Number("") 等于 0)
- isNaN(" ") → false(空格字符串也会转为 0)
- isNaN(null) → false(Number(null) 等于 0)
- isNaN(undefined) → true(Number(undefined) 等于 NaN)
- isNaN({}) → true(Number({}) 等于 NaN)
何时该用哪个?
在实际开发中,绝大多数场景都应该使用 Number.isNaN。它的语义清晰、行为可预测,特别适用于校验计算结果是否真正无效。
- 检查运算结果是否产生 NaN,例如 0 / 0、Math.sqrt(-1)
- 配合 Number() 或 parseFloat() 后做精确判断:const n = Number(input); if (Number.isNaN(n)) { … }
- 当需要区分“非数字类型”与“数字类型但无效”时,必须使用 Number.isNaN
重要提醒:切勿用 === 判断 NaN
最后特别强调:永远不要使用 === 判断 NaN。NaN 是 JavaScript 中唯一不等于自身的值:NaN === NaN 始终为 false。所以切勿写 value === NaN,它永远不成立。必须使用 Number.isNaN() 或 Object.is(value, NaN)(在需要兼容旧环境时)。
