应优先使用 Number.isNaN,因其只对 number 类型的 NaN 返回 true 且不转换类型;全局 isNaN 会先调用 Number() 转换再判断,实际检测“能否转为有效数字”,语义模糊易误判。
number.isnan 只认真正的 nan,不转换类型;全局 isnan 先转数字再判断,实际在问“能不能变成有效数字”。日常开发中,绝大多数情况该用 number.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
它内部会把任意类型尝试转成数字,然后看结果是不是 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 是 JavaScript 中唯一一个不等于自身的值:NaN === NaN 永远是 false。所以永远不要写 value === NaN,它永远不成立。必须用 Number.isNaN() 或 Object.is(value, NaN)(兼容旧环境时)。
立即学习“Java免费学习笔记(深入)”;