剩余参数必须放在函数参数列表末尾,以确保解析器能无歧义地切分实参;若不在末尾,引擎无法判断实参归属,导致语法错误;与默认参数共存时也需前置,否则后续参数无法赋值;该设计还为替代arguments、实现显式语义提供支持。

因为语法设计上要求解析器能明确区分“已命名参数”和“被收集的剩余参数”,把剩余参数放在末尾,才能无歧义地切分传入的实参。
解析逻辑需要确定的边界
JavaScript 引擎在调用函数时,会按顺序把实参逐个分配给形参。如果剩余参数不在最后,引擎就无法判断:某个实参该交给前面的形参,还是该归入剩余参数数组。
比如写成 function fn(a, rest, b) { },当调用 fn(1, 2, 3) 时:
- a 显然是 1;
- b 应该是 3 还是 2?
- rest 到底收不收 2?收几个?
这种模糊性会导致语法错误,所以语言强制规定:剩余参数必须收尾,前面所有参数都“各取一个”,剩下的全归它。
与默认参数共存时更需清晰优先级
如果有带默认值的参数,它们也建议(且通常需要)放在剩余参数之前。例如:
function log(level, ...msgs) { } —— level 是必填标识,msgs 收集所有后续内容,语义一目了然。
如果反过来:function log(...msgs, level) { },调用时根本没法指定 level 的值,因为所有实参都会先被 msgs 吃掉,level 永远得不到赋值。
避免和 arguments 机制混淆
ES6 之前靠 arguments 对象模拟可变参数,但它是个类数组、没有原型方法、还不能在箭头函数里用。剩余参数的设计目标之一就是替代它,成为“真数组 + 显式声明”的方案。
显式声明意味着参数意图要直白。放在最后,既是语法硬约束,也是语义提示:它不参与核心逻辑匹配,只负责兜底收集——这个角色天然适合收尾。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











