nan不会触发函数参数默认值,因为es6默认值仅在参数严格等于undefined时生效;传入nan、null、0、空字符串或false均跳过默认值,需在函数体内手动校验处理。

NaN 不会触发函数参数的默认值。JavaScript 的缺省参数机制只认 undefined,不认 NaN、null、0、空字符串或 false。
默认值生效的唯一条件是参数值为 undefined
ES6 的参数默认值不是“判断是否为空”,而是严格比对是否等于 undefined。只要实参被显式传入(哪怕值是 NaN),就不会回退到默认值。
- 调用
fn(NaN)→ 参数接收 NaN,不使用默认值 - 调用
fn()或fn(undefined)→ 参数为 undefined,启用默认值 - 传
null、''、0、false都同理:默认值被跳过
NaN 常见于参数误用场景
当本该传数字却传了无效值(如字符串 'abc'、未定义变量、null)并参与运算时,容易在函数内部生成 NaN,但这发生在默认值已确定之后,不影响缺省逻辑本身。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
function calc(x = 10) { return x * 2; } -
calc('abc')→'abc' * 2得NaN,但 x 已被赋值为'abc',默认值没机会介入 - 真正想防 NaN,应在函数体内做校验,而非依赖参数默认值
如何让 NaN 也走默认逻辑?需手动处理
如果业务上希望 NaN、null、空值等都视为“无效输入”而采用默认值,必须在函数体中显式判断,不能靠参数默认值自动实现。
- 用
Number.isNaN(x)单独检测 NaN(注意不用isNaN(),它会强制转换) - 结合 null/undefined 判断:
if (x === null || x === undefined || Number.isNaN(x)) x = 10; - 或更简洁地用空值合并:
x = x ?? 10;(只处理 null/undefined,不处理 NaN) - 若要统一兜底,推荐:
x = Number.isNaN(x) ? 10 : x;
别混淆:NaN 是计算结果,不是“未传参”
参数默认值解决的是“调用时没给值”的问题;NaN 是“给了值,但这个值参与运算后失效了”。两者属于不同阶段、不同语义的问题。
- 未传参 → 参数为 undefined → 触发默认值
- 传了非法数字 → 运算得 NaN → 默认值早已跳过,此时需运行时校验
- 把 NaN 当作“空”来处理,是业务逻辑,不是语言机制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










