NaN 是 JavaScript 中类型为 "number" 的特殊值,表示“不是一个数字”,因 NaN 不等于自身,需用 Number.isNaN() 严格判断,避免使用易误判的 isNaN()。

NaN 是 JavaScript 中一个特殊的数值,代表“不是一个数字”(Not-a-Number),但它本身的类型是 "number",这容易引发误判。直接用 == 或 === 判断 NaN 都会返回 false(因为 NaN 不等于任何值,包括它自己),所以必须用专门的方法。
为什么 typeof NaN 返回 "number"
NaN 是 IEEE 754 浮点数标准中定义的一个特殊值,属于数值类型范畴。JavaScript 继承了这一设计,因此:
-
typeof NaN→"number" -
NaN === NaN→false -
NaN == NaN→false
这意味着不能靠相等比较或类型判断来识别它。
传统方法:isNaN() 的陷阱
isNaN() 是全局函数,但它会先尝试把参数转成数字再判断,导致意外结果:
立即学习“Java免费学习笔记(深入)”;
-
isNaN("abc")→true(先转成NaN,再判) -
isNaN(" ")→false(空格转为0) -
isNaN({})→true({}转字符串再转数字 →NaN) -
isNaN(undefined)→true(转为NaN)
它检测的是“是否能被转换为有效数字”,而不是“当前值是否就是 NaN”。
推荐方式:Number.isNaN()
Number.isNaN() 是 ES6 引入的严格判断方法,只在参数**本身就是 NaN** 时返回 true,不进行类型转换:
-
Number.isNaN(NaN)→true -
Number.isNaN(Number("abc"))→true -
Number.isNaN("abc")→false(字符串不是NaN) -
Number.isNaN(0 / 0)→true -
Number.isNaN(null)→false
它真正回答的问题是:“这个值是不是 IEEE 754 定义的那个 NaN?”
实际使用建议
日常开发中,优先使用 Number.isNaN();如果需要兼容旧环境(如 IE),可用 polyfill 或简单替代:
- ES6+ 项目:直接写
Number.isNaN(value) - 需兼容老浏览器:可用
value !== value(因为只有NaN满足“不等于自己”) - 避免用
isNaN(value),除非你明确需要它的强制转换逻辑
对可能为 NaN 的计算结果(比如 parseFloat、数学运算失败),建议立即用 Number.isNaN() 校验。


















