rest参数必须位于函数参数末尾且仅出现一次,接收真数组;不可与arguments共存,不支持默认值,误用会直接报错。

JavaScript 中的 rest 参数不是要“掌握”的语法糖,而是解决「不确定参数个数」这个具体问题的工具。用错场景、和 arguments 混用、或在非函数最后参数位置使用,都会立刻报错。
rest 参数必须写在函数参数列表末尾
这是硬性限制,不是风格建议。只要它后面还有其他形参,JS 引擎会直接抛出 SyntaxError: Rest parameter must be last formal parameter。
function sum(a, ...nums, b) { // ❌ 报错
return nums.reduce((s, n) => s + n, 0);
}
正确写法只能是:
function sum(a, b, ...nums) { // ✅ nums 接收 a、b 之后的所有实参
return nums.reduce((s, n) => s + n, a + b);
}
-
...nums必须是最后一个参数,且只能出现一次 - 它接收的是一个真正的
Array,不是类数组对象 - 前面的
a、b是独立绑定的,不会被nums覆盖
rest 和 arguments 的关键区别
arguments 是函数内部自动存在的类数组对象,而 rest 是显式声明的真数组。两者不能共存于同一个函数中(箭头函数里根本没 arguments)。
立即学习“Java免费学习笔记(深入)”;
常见错误:想在箭头函数里用 arguments,结果 ReferenceError: arguments is not defined。
-
rest可直接调用.map()、.filter()、展开运算符[...nums] -
arguments需先转成数组:Array.from(arguments)或[...arguments](但仅限普通函数) - 箭头函数中只能用
rest,没有arguments
rest 常见误用:试图解构时混用默认值
rest 本身不支持默认值,但整个参数可以设默认值;不过一旦用了 rest,前面的参数就不能再用默认值“兜底”了。
function log(...msgs = ['no message']) { // ❌ 语法错误:rest 参数不能有默认值
console.log(msgs);
}
正确做法是把默认逻辑放在函数体内:
function log(...msgs) {
if (msgs.length === 0) msgs = ['no message'];
console.log(...msgs);
}
-
...msgs = []是非法语法,ES 规范禁止为 rest 绑定设默认值 - 如果需要默认行为,统一在函数开头判断
msgs.length或用msgs ?? [] - rest 不会自动跳过
undefined或空值,fn(1, undefined, 3)→[1, undefined, 3]
真正卡住人的地方,往往不是 rest 本身,而是它和函数签名设计、参数顺序、以及是否该用它替代 apply 的边界模糊。比如该用 fn(...arr) 还是 fn.apply(null, arr),其实取决于你是否需要显式控制 this —— rest 只管“怎么收”,不管“怎么传”。










