在JavaScript的函数使用中,调用方可能只会传递部分参数,未传递的参数默认会是undefined,这时候如果直接处理这些参数很容易出现类型错误或者逻辑异常,因此给函数设置默认参数是非常实用的开发技巧,能有效提升代码的健壮性和可维护性。

传统设置默认参数的方式
在ES6之前,JavaScript没有原生的默认参数语法,开发者通常会在函数内部通过逻辑判断来给参数设置默认值,最常见的是使用逻辑或运算符或者三元运算符进行判断。
使用逻辑或运算符
逻辑或运算符的判断规则是,如果第一个操作数为假值(包括undefined、null、0、空字符串等),就会返回第二个操作数,因此可以用这种方式设置默认参数。
function sum(a, b) {
// 如果a是假值,默认设为0,同理处理b
a = a || 0;
b = b || 0;
return a + b;
}
console.log(sum(1, 2)); // 输出3
console.log(sum(1)); // 输出1,b取默认值0
console.log(sum()); // 输出0,a和b都取默认值0这种方式的问题是,如果调用方传递的参数是0、空字符串这类合法假值,也会被替换成默认值,可能不是我们想要的结果,比如传递0作为第一个参数,sum(0, 2)会返回2而不是2,不符合预期。
使用严格相等判断undefined
为了避免假值被误替换的问题,可以严格判断参数是否等于undefined,只有未传递参数时才会设置默认值。
function sum(a, b) {
// 严格判断a是否为undefined,是的话设置默认值
if (a === undefined) {
a = 0;
}
if (b === undefined) {
b = 0;
}
return a + b;
}
console.log(sum(0, 2)); // 输出2,0不会被替换
console.log(sum(1)); // 输出1
console.log(sum()); // 输出0ES6原生默认参数语法
ES6新增了函数默认参数的原生语法,允许在函数定义的时候直接给参数指定默认值,语法更加简洁,也避免了传统方式的问题。
基础使用方式
只需要在函数参数列表中,给参数赋值即可设置默认值,调用时如果没有传递该参数或者传递的是undefined,就会使用默认值。
function sum(a = 0, b = 0) {
return a + b;
}
console.log(sum(1, 2)); // 输出3
console.log(sum(0, 2)); // 输出2,0是合法参数,不会被替换
console.log(sum(1)); // 输出1
console.log(sum()); // 输出0
console.log(sum(undefined, 5)); // 输出5,undefined会触发默认值默认值的求值时机
需要注意,ES6的默认参数是在函数调用时才会求值的,而不是函数定义的时候,每次调用函数如果用到默认值,都会重新计算默认值表达式。
let defaultNum = 10;
function getNum() {
console.log('计算默认值');
return defaultNum;
}
function sum(a = getNum()) {
return a;
}
sum(5); // 传递了参数,不会调用getNum,不会输出日志
sum(); // 没有传递参数,调用getNum,输出"计算默认值",返回10
defaultNum = 20;
sum(); // 再次调用,默认值重新计算,输出"计算默认值",返回20默认参数可以引用其他参数
默认参数的值可以引用前面已经定义的参数,但是不能引用后面还未定义的参数,否则会报错。
function createUser(name, age, info = `姓名:${name},年龄:${age}`) {
return { name, age, info };
}
console.log(createUser('张三', 18));
// 输出 { name: '张三', age: 18, info: '姓名:张三,年龄:18' }
// 下面的写法会报错,因为age在info后面定义,不能在info的默认值中引用
// function test(a = b, b) {}默认参数的注意事项
使用默认参数时还有一些细节需要注意,避免写出不符合预期的代码。
- 如果传递的参数是null,不会触发默认值,因为null不等于undefined,比如sum(null, 2)会返回NaN,因为null参与加法运算会转换为0吗?不对,null转数字是0,哦这里sum(null,2)会是0+2=2?不对,null在加法运算里会转成0,所以sum(null,2)返回2,但是如果默认参数是a=0,传递null的话a是null,不是undefined,所以不会用默认值,这点要注意。
- 默认参数会影响函数的length属性,函数的length属性返回没有默认值的参数的个数,有默认值的参数不计入length。
function fn1(a, b) {}
console.log(fn1.length); // 输出2
function fn2(a, b = 0) {}
console.log(fn2.length); // 输出1,b有默认值,不计入length
function fn3(a = 0, b) {}
console.log(fn3.length); // 输出0,a有默认值,不计入length掌握JavaScript中设置函数默认参数的方法,能让我们写出更简洁健壮的代码,日常开发中优先使用ES6的原生默认参数语法,就能满足大部分场景的需求,如果有特殊兼容需求,再使用传统的判断方式即可。
JavaScript函数默认参数ES6参数赋值函数定义修改时间:2026-06-03 00:29:25