【js篇】对 Rest 参数的理解

177 阅读2分钟

在 JavaScript 中,Rest 参数(Rest Parameters) 是 ES6 引入的一项重要特性,它允许我们将多个独立的参数收集为一个数组。这在处理参数个数不确定的函数时非常有用,可以替代传统的 arguments 对象,使代码更简洁、更易读。


✅ 一句话总结

Rest 参数使用 ... 语法,将函数调用时传入的多个参数“收拢”为一个数组,适用于参数个数不确定或需要处理剩余参数的场景。


✅ 一、基本用法

function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3)); // 6
console.log(sum(4, 5));    // 9
console.log(sum());        // 0

📌 特点:

  • ...numbers 会将所有传入的参数收集为一个数组;
  • 如果没有传参,numbers 是一个空数组;

✅ 二、与 arguments 的对比

特性argumentsRest 参数(...args
类型伪数组(类数组对象)真正的数组
可用方法不能直接使用数组方法(如 mapfilter可直接使用数组方法
箭头函数支持arguments 在箭头函数中不能使用Rest 参数可以在箭头函数中使用
是否必须是最后一个参数❌ 不是必须的✅ 必须是最后一个参数

✅ 三、Rest 参数的使用场景

场景 1️⃣:处理不定数量的参数

function log(...messages) {
  messages.forEach(msg => console.log(msg));
}

log('Hello', 'World', '!');
// 输出:
// Hello
// World
// !

场景 2️⃣:获取函数的“剩余参数”

function printUser(id, ...rest) {
  console.log('ID:', id);
  console.log('Other Info:', rest);
}

printUser(1, 'Tom', 20); 
// ID: 1
// Other Info: ['Tom', 20]

📌 说明:

  • 第一个参数 id 被单独提取;
  • 剩下的参数被收集到 rest 数组中;

场景 3️⃣:函数参数解构 + Rest

function sort([first, ...rest]) {
  console.log('First:', first);
  console.log('Rest:', rest);
}

sort([10, 20, 30]);
// First: 10
// Rest: [20, 30]

📌 说明:

  • first 提取第一个元素;
  • rest 收集剩余元素;

✅ 四、注意事项

注意点说明
只能有一个 Rest 参数Rest 参数必须是函数参数列表的最后一个
不能用于对象解构对象解构中 ... 是扩展运算符,不是 Rest 参数
与默认值配合使用可以给 Rest 参数设置默认值,但通常不推荐

✅ 五、一句话总结

Rest 参数是 JavaScript 中处理不确定数量参数的强大工具,它使用 ...args 的语法将多个参数合并为一个数组,替代了传统的 arguments,更简洁、更强大,是现代函数定义中不可或缺的一部分。


💡 进阶建议

  • 在 React/Vue 中,Rest 参数常用于提取组件的剩余 props;
  • 结合 TypeScript 可以对 Rest 参数进行类型标注,如 function example(...args: string[])
  • 使用 Lodash 的 rest 函数可以实现更复杂的参数处理;
  • 在函数柯里化、参数代理等高级函数技巧中也常使用 Rest 参数;