剩余参数(...args)是ES6引入的语法,用于接收不定数量实参,是真正的数组且支持解构赋值;必须位于参数列表末尾,可与对象/数组解构嵌套使用以分离确定结构与动态剩余。

剩余参数(...args)是 ES6 引入的关键语法,它让函数能灵活接收不定数量的实参,并天然支持与解构赋值协同工作,从而实现清晰、可读、可维护的参数处理逻辑。
用 ...args 替代 arguments 对象
arguments 是类数组对象,不支持数组方法,且在箭头函数中不可用;而 ...args 是真正的数组,开箱即用。
✅ 正确写法:
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3); // 6
❌ 避免这样写(兼容性差、语义弱):
function sum() {
return Array.from(arguments).reduce(...); // 多余转换
与解构赋值组合:精准提取关键参数
剩余参数可放在解构模式的末尾,把“确定结构”和“动态剩余”分开处理,语义更明确。
例如,定义一个带配置项的工具函数:
function request(url, { method = 'GET', headers = {} }, ...bodyParts) {
console.log('URL:', url);
console.log('Method:', method);
console.log('Body parts:', bodyParts); // 可能是多个字符串或 Buffer 片段
}
调用时自然清晰:
request(
'/api/users',
{ method: 'POST' },
'{"name":', '"Alice"}'
);
嵌套解构 + 剩余参数:处理深层结构化输入
当参数本身是对象或数组,且需提取其中部分字段并收集其余项时,可嵌套使用:
- 从对象中解构前几个已知键,用
...rest收集其他属性 - 从数组中解构前几项,用
...tail收集剩余元素
示例(对象解构 + 剩余):
function createUser({ name, email, ...meta }) {
return {
id: Date.now(),
name,
email,
createdAt: new Date(),
...meta // 如 role、tags、settings 等扩展字段
};
}
createUser({
name: 'Bob',
email: 'bob@example.com',
role: 'admin',
tags: ['vip', 'beta']
});
注意边界:剩余参数必须是最后一个形参
语法强制要求 ...args 必须位于参数列表末尾,否则报错。
✅ 合法:
function fn(a, b, ...rest) {}
❌ 非法(会抛出 SyntaxError):
function fn(...rest, a) {} // 报错
若需“中间收集”,应改用对象解构或显式传入数组:
// 更推荐的方式
function fn({ first, last, ...others }) {
// others 包含除 first/last 外的所有属性
}


















