Number.isNaN 仅对 number 类型的 NaN 返回 true,不进行类型转换;全局 isNaN 先调用 Number() 转换再判断,实为检测“能否转为有效数字”。

Number.isNaN 和全局 isNaN 看起来都在判断“是不是 NaN”,但实际逻辑完全不同:前者只认真正的 NaN,后者其实在问“能不能转成有效数字”。日常开发中,绝大多数情况该用 Number.isNaN。
Number.isNaN:只对数字类型的 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:先转数字,再看是不是 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 —— 它语义明确、行为可预测,适合校验计算结果是否真正失效。
立即学习“Java免费学习笔记(深入)”;
- 验证 parseFloat 或 Number() 的返回值是否无效:const n = Number(input); if (Number.isNaN(n)) { … }
- 检查运算结果(如 0/0、Math.sqrt(-1))是否产生 NaN
- 需要区分“非数字类型”和“数字类型但无效”时,必须用 Number.isNaN
全局 isNaN 仅在极少数场景下仍有价值,比如你想快速筛掉所有无法参与数值运算的输入(含字符串、对象等),但此时它的行为更接近“是否可转为有效数字”,而非“是否为 NaN”。
别用 === 判断 NaN
NaN 是 JavaScript 中唯一一个不等于自身的值:NaN === NaN 永远是 false。因此永远不要写 value === NaN。可靠替代方案有两个:
- Number.isNaN(value)
- value !== value(利用 NaN 唯一的自比较为 false 的特性,效果等价且兼容性更好)


















