在javascript中,函数默认参数仅对undefined生效,null被视为有效值而不会触发默认值;解构赋值同理,且应按语义区分使用:undefined表“未提供”,null表“有意为空”。

在 JavaScript 中,undefined 和 null 虽然都表示“空值”,但在函数默认参数场景下行为截然不同:只有 undefined 会触发默认值赋值,null 不会。
默认参数只对 undefined 生效
ES6 引入的默认参数机制,其触发条件是形参实际接收的值为 undefined(严格相等),包括未传参、显式传 undefined,或解构失败时的空位。
-
未传参 → 使用默认值:
function fn(x = 'default') { return x; } fn(); // 'default' -
传 undefined → 使用默认值:
fn(undefined); // 'default' -
传 null → 不触发默认值:
fn(null); // null
null 是有效值,会被原样接收
null 是一个明确的原始值,代表“有意为之的空对象引用”。函数将其视为合法输入,不会回退到默认值。
- 常见于 API 返回、用户输入或状态初始化(如
{ user: null }) - 若希望
null也走默认逻辑,需手动判断:function fn(x = 'default') { x = x ?? 'default'; return x; } - 注意:
??(空值合并)和||不同,它只对null或undefined生效
解构赋值中的表现一致
对象/数组解构的默认值规则与函数参数一致,仅 undefined 触发默认值。
const { name = 'guest' } = {}; // name === 'guest'const { name = 'guest' } = { name: null }; // name === nullconst [first = 'a'] = [undefined]; // first === 'a'const [first = 'a'] = [null]; // first === null
实际建议:按语义区分使用
避免混淆的关键是理解两者的语义差异:
- 用
undefined表示“未提供”或“未定义”,适合默认参数自然接管 - 用
null表示“明确为空”,此时应主动处理(如校验、转换、抛错) - 若业务上
null和undefined都算“无值”,统一用??或三元判断处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











