Number.isNaN()严格判断不转换类型,仅当参数是number类型且为NaN时返回true;全局isNaN()先转数字再检测,易因隐式转换产生误判,推荐优先使用Number.isNaN()。

JavaScript 中 Number.isNaN() 和全局 isNaN() 都用于判断值是否为 NaN,但行为差异显著——关键在于**是否进行类型转换**。
Number.isNaN():严格判断,不转换类型
Number.isNaN() 只有在参数**本身就是 NaN(且类型为 number)** 时才返回 true。它不会尝试把其他类型转成数字,因此更精确、更可靠。
- 对非数字类型(如字符串、null、undefined、对象)一律返回
false - 对
NaN返回true;对0/0、Math.sqrt(-1)等产生的NaN也返回true - 示例:
Number.isNaN("NaN")→false;Number.isNaN(NaN)→true;Number.isNaN(undefined)→false
全局 isNaN():宽松判断,先转数字再检测
全局 isNaN() 会先调用 Number() 尝试把参数转为数字,再判断结果是否为 NaN。这导致很多意外的 true 返回值。
-
isNaN("hello")→true(因为Number("hello") === NaN) -
isNaN(" ")→false(空格转为0) -
isNaN({})→true(Number({})是NaN) -
isNaN(null)→false(Number(null) === 0) -
isNaN([1, 2])→true(Number([1,2])是NaN)
什么时候该用哪一个?
日常开发中,**优先使用 Number.isNaN()** ——它语义清晰,避免隐式转换带来的陷阱,尤其适合校验计算结果是否真正失效。
立即学习“Java免费学习笔记(深入)”;
- 检查一个变量是否“本就是
NaN”,比如let result = 0 / 0; if (Number.isNaN(result)) { ... } - 配合
Number()或解析函数(如parseInt)后做精准判断:const n = Number(input); if (Number.isNaN(n)) { /* 输入无效 */ } - 若需兼容旧环境(IE),可用
Object.is(value, NaN)替代,效果等价于Number.isNaN()
一个小提醒:别用 == 或 === 判断 NaN
NaN 是唯一一个不等于自身的值:NaN === NaN 为 false。所以永远不要写 value === NaN,它永远是 false。必须用 Number.isNaN() 或 isNaN()(尽管后者不推荐)。










