应优先使用 number.isnan() 判断 nan,因其不进行类型转换、语义明确;全局 isnan() 会强制转数字导致误判;兼容旧环境可用 typeof x === 'number' && x !== x。

在 JavaScript 中,判断一个变量是否为 NaN,**不能用 == 或 === 直接比较**,因为 NaN !== NaN 是语言规范定义的(它唯一不等于自身的值)。正确方式是使用内置方法 isNaN() 或更推荐的 Number.isNaN()。
用 Number.isNaN() 判断(推荐)
这是 ES6 引入的严格判断方法,只在参数**确实是 NaN 值且类型为 number**时才返回 true:
-
Number.isNaN(NaN)→true -
Number.isNaN(0 / 0)→true -
Number.isNaN("abc")→false(不是 number 类型,直接返回 false) -
Number.isNaN(undefined)→false -
Number.isNaN(null)→false
它的优势是**不进行类型转换**,避免误判,语义清晰,适合现代开发。
慎用全局 isNaN()
这个老方法会先尝试把参数转成数字,再判断是否为 NaN,容易产生意外结果:
-
isNaN("abc")→true("abc" 转数字为NaN) -
isNaN(" ")→false(空格字符串转为0) -
isNaN({})→true({}转字符串"[object Object]",再转数字为NaN) -
isNaN(null)→false(null转为0)
除非明确需要这种“宽松转换后判断”的逻辑,否则不建议使用。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
其他辅助判断技巧
有时你想确认一个值是数字但又不是有效数值,可组合使用:
- 先用
typeof x === 'number'确保是数字类型 - 再用
!isFinite(x)排除Infinity和-Infinity - 最后用
Number.isNaN(x)精确锁定NaN
例如:typeof x === 'number' && !isFinite(x) && Number.isNaN(x) —— 实际上等价于直接用 Number.isNaN(x),因为只有 NaN 满足 !isFinite(NaN) 且是 number 类型。
小结:优先选 Number.isNaN()
它准确、无副作用、语义明确。遇到需要兼容极老环境(如 IE8)时,可手动模拟:
function isReallyNaN(x) { return typeof x === 'number' && x !== x; }
利用 NaN !== NaN 这一特性,是底层最可靠的判断依据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










