JavaScript中NaN在数学函数中严格按定义域触发:Math.sqrt()对负数、Math.log()对非正数、Math.acos()/asin()对超界值等均返回NaN,且NaN具污染性,参与运算必得NaN;检测须用Number.isNaN()。

JavaScript 中 NaN 在数学函数运算中不是“偶尔出现”,而是有明确的触发条件和一致的行为模式:只要运算在数学意义上无定义或超出实数范围,相关函数就返回 NaN。
哪些数学函数会返回 NaN
以下函数在输入参数不满足数学定义域时,统一返回 NaN:
-
Math.sqrt():对负数开平方,如
Math.sqrt(-1)、Math.sqrt(-0.5) -
Math.log() / Math.log10() / Math.log2():对零或负数取对数,如
Math.log(0)、Math.log(-1) -
Math.acos() / Math.asin():参数超出 [-1, 1] 区间,如
Math.acos(1.5)、Math.asin(-2) - Math.atan2():本身不会返回 NaN(它能处理所有数字组合),但若任一参数为 NaN,则结果也为 NaN
-
Math.pow():底数为负且指数非整数时,如
Math.pow(-2, 0.5)(即 √-2)
NaN 的传播特性:一旦出现,持续生效
NaN 具有“污染性”——只要参与运算的任意操作数是 NaN,绝大多数数学函数和算术运算都会直接返回 NaN,不再尝试计算:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Math.abs(NaN)→NaN -
Math.max(3, NaN, 7)→NaN(注意:不是 7) -
Math.round(NaN)→NaN -
Math.sin(NaN)→NaN - 甚至
Math.pow(NaN, 0)也返回NaN(不例外)
边界情况:0/0 和 Infinity 运算
虽然不是“函数调用”,但这些基础运算与数学函数行为一致,常作为 NaN 的源头:
立即学习“Java免费学习笔记(深入)”;
-
0 / 0→NaN(唯一返回 NaN 的除法) -
Infinity - Infinity→NaN -
Infinity / Infinity→NaN -
0 * Infinity→NaN -
Math.pow(0, 0)→1(这是特例,ECMAScript 明确规定,不返回 NaN)
如何可靠检测 NaN 结果
不能用 === 或 == 判断,必须使用专用方法:
-
Number.isNaN(value):推荐。只在
value确实是 NaN 类型时返回true,不作类型转换 -
isNaN(value):会先尝试转成数字再判断,可能误判(如
isNaN("abc")返回true,但你可能只想检查数值计算结果) - 避免:
value !== value虽然对 NaN 成立(因为 NaN 是唯一自不等的值),但可读性差、易出错,不建议用于生产

















