JavaScript默认参数是函数定义时为形参指定的仅在实参为undefined时启用的后备值,支持动态求值、精准语义、与解构结合需防null/undefined报错,且影响length属性。

JavaScript默认参数是什么
JavaScript默认参数是函数定义时为形参指定的后备值,当调用时对应实参为undefined(注意:不是null、false或空字符串),该默认值就会被启用。
它不是“兜底所有假值”,只在参数完全未传或显式传入undefined时触发。比如myFunc()和myFunc(undefined)都会触发默认值;但myFunc(null)、myFunc("")、myFunc(0)都不会。
为什么不能用逻辑或(||)替代默认参数
用a || 'default'在函数体里做兜底,看似简单,实则会误吞所有falsy值——这恰恰破坏了函数对合法输入的容忍度。
-
0、''、false都是有效业务数据,不该被悄悄替换成默认值 - 默认参数机制只响应
undefined,语义更精准 - 默认参数在调用时求值,支持动态表达式(包括函数调用),而
||写在函数体内是运行时才执行
function greet(name = 'Guest', count = getDefaultCount()) {
return `Hello ${name}, you have ${count} messages`;
}
// getDefaultCount() 只在未传 count 且其值为 undefined 时执行
greet('Alice'); // Hello Alice, you have 5 messages(假设 getDefaultCount 返回 5)
greet('Bob', 0); // Hello Bob, you have 0 messages(不会被替换成 5)
默认参数与解构赋值结合时的常见陷阱
当默认参数和对象/数组解构混用,容易误以为“整个解构失败才用默认值”,其实解构本身也会触发默认值逻辑,且层级独立。
立即学习“Java免费学习笔记(深入)”;
- 函数参数的默认值先生效,再进入解构;解构内部还能再设默认值
- 如果传了
null或undefined给解构参数,会直接报Cannot destructure property ... of 'undefined' or 'null' - 安全写法是把解构默认值设在解构表达式里,而不是靠外层参数默认值“兜住”
function connect({ host = 'localhost', port = 3000 } = {}) {
return `${host}:${port}`;
}
connect(); // localhost:3000({} 是外层默认值)
connect({}); // localhost:3000(解构时 host/port 各自取默认)
connect({ port: 80 }); // localhost:80(host 用默认,port 用传入值)
connect(null); // TypeError(= {} 没生效,因为 null !== undefined)
默认参数影响函数的length属性
Function.prototype.length返回的是“第一个有默认值参数之前的形参数量”,这个细节会影响依赖length的工具库(如柯里化、参数校验)。
-
function f(a, b = 1, c) {}的length是1(只有a没默认值) -
function g(a = 1, b) {}的length是0(第一个参数就有默认值) - 这意味着
g.length === 0,某些自动推断参数个数的工具会认为它“不接受任何参数”,导致意外行为
如果你写的函数会被其他框架或高阶函数处理,别只看调用是否正常,还得确认fn.length是否符合预期——尤其在封装通用工具函数时,这点很容易被忽略。










