剩余参数(Rest Parameters)是JavaScript中用于捕获函数调用时多余实参的语法机制,本质是将不定数量参数收集成真正的Array实例,必须位于形参末尾且唯一,标识符如...args,区别于arguments对象,支持数组方法且在箭头函数中可用。

剩余参数(Rest Parameters)不是“可选参数”,也不是“默认参数”,它是 JavaScript 中专门用来捕获函数调用时**多余实参**的语法机制,本质是把不定数量的参数收集成一个真正的 Array 实例。
rest 参数必须写在形参列表末尾
它用三个点 ... 加一个标识符表示,比如 ...args。这个标识符会成为包含所有剩余实参的数组变量名。如果把它放在中间或开头,语法直接报错:
function bad(a, ...rest, b) { } // SyntaxError: Rest parameter must be last formal parameter
- 只能有一个 rest 参数,且必须是最后一个形参
- 它不占用“已命名参数”的位置 ——
length属性只统计非 rest 的形参数量 - 和
arguments不同,...args是真数组,能直接调用.map()、.reduce()等方法
和 arguments 对象的关键区别
arguments 是类数组对象,没有数组方法,且在箭头函数中不可用;rest 参数补上了这些短板:
-
arguments在严格模式下无法修改 callee / caller,rest 参数无此限制 -
arguments包含所有传入参数(包括已命名的),rest 参数只包含“多出来的”那部分 - 箭头函数没有
arguments,但可以正常使用 rest 参数
例如:const sum = (...nums) => nums.reduce((a, b) => a + b, 0); —— 这比用 Array.from(arguments) 简洁安全得多。
常见误用:混淆 rest 和展开语法
... 在函数定义里是 rest(收集),在函数调用或字面量中是展开(spread)。写错位置就会出问题:
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
-
Math.max(...[1, 2, 3])✅ 正确:展开数组为独立参数 -
Math.max([1, 2, 3])❌ 返回NaN:只传了一个数组参数 -
function f(...a, ...b) { }❌ 语法错误:不允许多个 rest
注意:rest 参数不会自动“过滤 undefined”或跳过空槽位 —— 它忠实反映调用时传了什么,包括 undefined 和 null。
实际场景中怎么安全处理?
多数时候你不需要手动遍历 args,而是结合解构或类型检查来提取关键参数:
- 提取前几个固定参数,其余用 rest 收集:
function log(level, message, ...meta) { console[level](message, ...meta); } - 配合默认值做兜底:
function join(separator = ',', ...parts) { return parts.join(separator); } - 避免直接透传大量参数导致堆栈溢出:rest 参数本身不触发额外开销,但后续操作(如深拷贝)需留意
真正容易被忽略的是:rest 参数对 typeof、instanceof Array 和 Array.isArray() 都返回 true,但它不是 arguments,也不受 caller 限制 —— 这些边界行为在调试和 polyfill 时会突然冒出来。









