NaN是JavaScript中表示“非数字”的特殊number类型值,需用Number.isNaN()精确判断,因其不进行类型转换且语义清晰;isNaN()因强制转数字而不可靠,替代方案x !== x虽有效但可读性差。

NaN(Not-a-Number)是JavaScript中一个特殊的数值类型,表示“不是一个合法数字”,但它本身属于number类型。它不会自动抛错,却会静默传播——比如参与任何数学运算后仍得NaN,容易引发隐蔽bug。判断它不能用==或===,因为NaN !== NaN。
NaN常见的产生场景
以下操作都会返回NaN,且多数不易察觉:
- 对非数字字符串调用
Number()或一元加号:Number("abc")、+"foo" - 数学运算失败:
Math.sqrt(-1)、0 / 0、Infinity - Infinity - 解析无效数字:
parseInt("hello")(注意:它返回NaN,但parseFloat("hello")也一样) - 显式赋值:
let a = NaN;(较少见,但合法)
为什么isNaN()不可靠?
全局函数isNaN()会先尝试把参数转成数字再判断,导致误判:
-
isNaN(" ")→false(空格转为0,不是NaN) -
isNaN("123")→false(转成123) -
isNaN({})→true(对象转字符串再转数字失败) -
isNaN("abc")→true(看似正确,但逻辑不纯粹)
它真正检测的是“转成数字后是否为NaN”,而不是“这个值本来是不是NaN”。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
用Number.isNaN()做精确判断
Number.isNaN()不进行类型转换,只当参数**严格等于NaN**时才返回true:
-
Number.isNaN(NaN)→true -
Number.isNaN(0 / 0)→true -
Number.isNaN("abc")→false(字符串不是NaN) -
Number.isNaN(undefined)→false -
Number.isNaN(null)→false
这是ES6引入的标准方法,兼容性良好(IE不支持,但现代项目基本可放心使用)。
其他安全判断NaN的替代方式
如果需兼容极老环境,可用value !== value——因为NaN是唯一一个不等于自身的值:
-
NaN !== NaN→true -
0 !== 0→false -
let x = NaN; x !== x→true
但这种方式可读性差,建议优先用Number.isNaN(),语义清晰、意图明确。

















