JavaScript的函数参数处理机制在ES6之后得到了很大完善,剩余参数和默认值两个特性让参数处理变得更加灵活。剩余参数可以收集函数中多余的参数,默认值则可以在参数未传递或传递undefined时赋予默认数值,两者结合能覆盖很多复杂的参数处理需求。

基础特性介绍
参数默认值
参数默认值允许我们在定义函数时为参数指定默认值,当调用函数时没有传递该参数,或者传递的参数是undefined时,就会使用默认值。语法是在参数后面用等号赋值默认内容。
// 基础默认值示例
function greet(name = '访客', message = '欢迎访问') {
console.log(`${message},${name}`);
}
greet(); // 输出:欢迎访问,访客
greet('张三'); // 输出:欢迎访问,张三
greet(undefined, '你好'); // 输出:你好,访客
需要注意的是,参数默认值不是赋值语句,而是从左到右解析的,后面的默认值可以引用前面已经定义的参数。
function calculateTotal(price, count = 1, total = price * count) {
return total;
}
console.log(calculateTotal(10)); // 输出:10
console.log(calculateTotal(10, 3)); // 输出:30
剩余参数
剩余参数语法允许我们将一个不定数量的参数表示为一个数组,剩余参数使用三个点...后面跟一个数组名来定义,它只能作为函数的最后一个参数。
// 剩余参数示例
function sum(...numbers) {
return numbers.reduce((acc, cur) => acc + cur, 0);
}
console.log(sum(1, 2, 3)); // 输出:6
console.log(sum(10, 20, 30, 40)); // 输出:100
剩余参数和arguments对象类似,但剩余参数是真正的数组,可以直接使用数组的方法,而arguments是类数组对象,需要先转换为数组才能使用数组方法。
剩余参数与默认值结合使用
剩余参数设置默认值
剩余参数本身也可以设置默认值,当没有传递多余参数时,剩余参数会是一个空数组,如果设置了默认值,就会使用默认值作为初始值。
function collectTags(...tags = ['默认标签']) {
console.log(tags);
}
collectTags(); // 输出:['默认标签']
collectTags('标签1', '标签2'); // 输出:['标签1', '标签2']
普通参数默认值与剩余参数搭配
我们可以给前面的普通参数设置默认值,最后一个参数使用剩余参数,这样既能处理固定参数的默认情况,又能收集额外的可变参数。
// 用户注册函数,前两个参数有默认值,后面的参数是可选扩展信息
function registerUser(username = '匿名用户', age = 0, ...extraInfo) {
const userInfo = {
username,
age
};
if (extraInfo.length > 0) {
userInfo.extra = extraInfo;
}
return userInfo;
}
console.log(registerUser());
// 输出:{ username: '匿名用户', age: 0 }
console.log(registerUser('李四', 25, '男', '北京'));
// 输出:{ username: '李四', age: 25, extra: ['男', '北京'] }
默认值对剩余参数的影响
当参数有默认值时,需要注意默认值不会影响剩余参数的收集,剩余参数只会收集那些没有被前面参数接收的多余参数。
function test(a = 1, b = 2, ...rest) {
console.log(a, b, rest);
}
test(10, 20, 30, 40, 50); // 输出:10 20 [30, 40, 50]
test(undefined, 20, 30); // 输出:1 20 [30]
使用注意事项
- 剩余参数必须是函数的最后一个参数,否则会抛出语法错误。
- 参数默认值表达式中不能使用自身作为参数名,会导致引用错误。
- 剩余参数不会收集那些已经有对应参数名的参数,只会收集多余的参数。
- 如果函数的参数同时有默认值和剩余参数,调用时传递的参数会先匹配前面的普通参数,剩下的才会被剩余参数收集。
常见应用场景
剩余参数和默认值结合非常适合处理那些参数数量不固定,同时又有部分核心参数需要默认值的场景,比如工具函数的封装、事件处理函数的参数处理等。
// 封装一个日志打印函数,第一个参数是日志级别,有默认值,后面的参数是日志内容
function log(level = 'info', ...messages) {
const time = new Date().toLocaleTimeString();
console.log(`[${time}] [${level}]`, ...messages);
}
log(); // 输出:[时间] [info]
log('error', '接口请求失败', '错误码:500');
// 输出:[时间] [error] 接口请求失败 错误码:500
通过合理使用剩余参数和默认值,我们可以减少很多参数判断的冗余代码,让函数的参数定义更加清晰,提升代码的可读性和可维护性。
JavaScript剩余参数参数默认值函数参数处理修改时间:2026-07-06 16:48:26