JavaScript中undefined作为函数参数默认值仅在参数严格等于undefined时触发,即未传参、显式传undefined或解构失败三种情况;null、0、false、''等假值均不触发,默认值机制严格区分语义:undefined表“未提供”,null表“有意为空”。

JavaScript 中 undefined 作为默认参数,不是“随便填个空就触发”,而是有明确的触发边界:它只在参数值严格等于 undefined 时才启用默认值。这个行为是 ES6 默认参数机制的核心逻辑,也是日常开发中容易误判的关键点。
什么情况下会触发默认值
只有以下三种情况会让形参取到默认值:
- 调用时完全没传该参数:
fn() - 显式传入
undefined:fn(undefined) - 解构赋值失败导致形参为
undefined:fn({})配合function fn({ name } = {}) { ... }
注意:null、0、false、空字符串 '' 都不会触发——它们是合法值,会被原样接收。
为什么 null 不触发默认值
undefined 表示“未提供”或“不存在”,而 null 是开发者主动赋予的“有意为空”。语言设计上刻意区分二者语义:
立即学习“Java免费学习笔记(深入)”;
function greet(name = '游客') { return `你好,${name}`; }-
greet();→"你好,游客"(未传,name === undefined) -
greet(null);→"你好,null"(name被设为null,不走默认)
若业务上希望 null 也兜底,默认值后可加一层空值合并:name = name ?? '游客'。
安全判断 undefined 的推荐方式
手动检查是否为 undefined 时,避免用 !name 或 == undefined,因为它们会把 0、false、'' 也当成“空”:
- ✅ 推荐:
name === undefined(最直接) - ✅ 更稳妥(防未声明变量):
typeof name === 'undefined' - ❌ 避免:
!name(0和false也会进分支) - ❌ 避免:
name == undefined(类型转换易出错)
结合解构与默认值的实用写法
对象/数组解构中的默认值规则和函数参数一致,也只响应 undefined:
function getConfig({ timeout = 5000, retries = 3 } = {}) { ... }-
getConfig({ timeout: 2000 });→timeout=2000,retries=3 -
getConfig({ retries: null });→retries=null(不变成 3)
如需对 null 同样兜底,可在解构后单独处理:retries = retries ?? 3。


















