??仅在左侧为null或undefined时返回右侧默认值,保留0、false、''等合法假值;||则对所有假值(含0、''、false)均触发回退,易误覆盖有效值。

JavaScript 中可以利用逻辑运算符(特别是 || 和 ??)为函数参数提供默认值,但要注意它们的行为差异和适用场景。
用 || 设置默认值(宽松判断)
|| 返回第一个“真值”(truthy)的操作数,因此它会把所有“假值”(falsy)——如 false、0、''(空字符串)、null、undefined、NaN —— 都视为需要替换的“无效输入”。
适合用于:只要参数是 falsy 就希望用默认值的场景(比如不关心具体是 0 还是 undefined,统一兜底)。
示例:
立即学习“Java免费学习笔记(深入)”;
function greet(name) {
name = name || 'Anonymous';
return `Hello, ${name}!`;
}
greet(); // "Hello, Anonymous!"
greet(''); // "Hello, Anonymous!" (空字符串也被覆盖)
greet(0); // "Hello, Anonymous!" (0 也被覆盖)
greet('Alice'); // "Hello, Alice!"
用 ?? 设置默认值(严格判断 null/undefined)
??(空值合并运算符)只在左侧为 null 或 undefined 时才返回右侧默认值,对 0、false、'' 等其他 falsy 值保持原样。
更符合“默认参数”的本意:仅当参数未传或显式传了 null/undefined 时才启用默认值。
示例:
立即学习“Java免费学习笔记(深入)”;
function count(items) {
items = items ?? 1;
return `Found ${items} item(s).`;
}
count(); // "Found 1 item(s)."
count(0); // "Found 0 item(s)." ← 保留 0,合理
count(false); // "Found false item(s)." ← 注意:false 不触发默认
count(''); // "Found item(s)." ← 空字符串也不触发
count(undefined); // "Found 1 item(s)."
count(null); // "Found 1 item(s)."
现代写法:直接在参数列表中使用默认参数语法
ES6+ 支持更清晰、更推荐的默认参数语法,它本质上等价于 ?? 的行为(只对 undefined 生效,null 仍会传入),且语义明确、可读性强。
注意:调用时若显式传入 undefined,仍会触发默认值;但传 null 不会自动替换(需手动处理)。
示例:
立即学习“Java免费学习笔记(深入)”;
function fetchConfig(timeout = 5000, retries = 3) {
console.log(`Timeout: ${timeout}, Retries: ${retries}`);
}
fetchConfig(); // Timeout: 5000, Retries: 3
fetchConfig(3000); // Timeout: 3000, Retries: 3
fetchConfig(undefined, 5); // Timeout: 5000, Retries: 5
fetchConfig(null, 5); // Timeout: null, Retries: 5 ← null 不被替换!
如需对 null 也做处理,可结合 ??:
function fetchConfig(timeout, retries) {
timeout = timeout ?? 5000;
retries = retries ?? 3;
// ...
}
常见误区与建议
- 避免用 || 处理可能合法的 falsy 值(如分页
page=0、开关enabled=false),否则逻辑会被意外覆盖 - 优先使用 ES6 默认参数语法,语义清晰、支持解构、调试友好
- 若需兼容老环境(如 IE),可用 || 或 ??(配合 Babel 转译),但务必确认 falsy 值是否允许被覆盖
- 对于对象参数,常配合解构 + 默认值,例如:
function init({ url = '/', method = 'GET' } = {}) { ... }


















