最接近的成语*args是
function func (a, b ) {
var star_args = Array.prototype.slice.call (arguments, func.length);
}
利用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);
}
如果您想使用语法糖,请编写一个函数,该函数将一个函数转换为另一个函数,该函数使用必需和可选参数调用,并将必需参数以及任何其他可选参数作为数组传递到最终位置:
function argsify(fn){
return function(){
var args_in = Array.prototype.slice.call (arguments);
var required = args_in.slice (0,fn.length-1);
var optional = args_in.slice (fn.length-1);
var args_out = required;
args_out.push (optional);
return fn.apply (0, args_out);
};
}
如下使用:
function myfunc (a, b, star_args) {
console.log (a, b, star_args[0]);
}
var argsified_myfunc = argsify (myfunc);
argsified_myfunc (1, 2, 3);
再说一次,如果您愿意让调用者将可选参数作为数组开头,则可以跳过所有这些巨型菜单:
myfunc (1, 2, [3]);
确实没有类似的解决方案**kwargs,因为JS没有关键字参数。相反,只需要求调用方将可选参数作为对象传递即可:
function myfunc (a, b, starstar_kwargs)
myfunc (1, 2, );
ES6更新
为了完整起见,让我补充一点,ES6使用rest参数功能解决了此问题。参见Javascript-'...'的含义