*args 最接近的成语是
function func (a, b /*, *args*/) {
var star_args = Array.prototype.slice.call (arguments, func.length);
/* now star_args[0] is the first undeclared argument */
}
利用Function.length 是函数定义中给出的参数数量这一事实。
你可以把它打包成一个小助手例程,比如
function get_star_args (func, args) {
return Array.prototype.slice.call (args, func.length);
}
然后做
function func (a, b /*, *args*/) {
var star_args = get_star_args (func, arguments);
/* now star_args[0] is the first undeclared argument */
}
如果您想使用语法糖,请编写一个函数,将一个函数转换为另一个使用必需和可选参数调用的函数,并将所需参数以及任何其他可选参数作为数组传递给 final位置:
function argsify(fn){
return function(){
var args_in = Array.prototype.slice.call (arguments); //args called with
var required = args_in.slice (0,fn.length-1); //take first n
var optional = args_in.slice (fn.length-1); //take remaining optional
var args_out = required; //args to call with
args_out.push (optional); //with optionals as array
return fn.apply (0, args_out);
};
}
如下使用:
// original function
function myfunc (a, b, star_args) {
console.log (a, b, star_args[0]); // will display 1, 2, 3
}
// argsify it
var argsified_myfunc = argsify (myfunc);
// call argsified function
argsified_myfunc (1, 2, 3);
再一次,如果你愿意让调用者将可选参数作为数组传递,你可以跳过所有这些笨拙的东西:
myfunc (1, 2, [3]);
**kwargs 确实没有类似的解决方案,因为 JS 没有关键字参数。相反,只需要求调用者将可选参数作为对象传递:
function myfunc (a, b, starstar_kwargs) {
console.log (a, b, starstar_kwargs.x);
}
myfunc (1, 2, {x:3});
ES6 更新
为了完整起见,让我补充一点,ES6 用剩余参数特性解决了这个问题。见Javascript - '...' meaning