我经常使用Python,现在我只是在快速学习JavaScript (或者应该说是重新学习)。所以,我想问,在JavaScript中,*args
和**kwargs
的等价物是什么?
发布于 2013-06-29 22:18:09
与*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 */
}
如果你想要语法糖,可以编写一个函数,将一个函数转换为另一个函数,该函数使用必需的和可选的参数进行调用,并传递所需的参数,以及任何附加的可选参数作为最终位置的数组:
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使用rest参数特性解决了这个问题。请参阅Javascript - '...' meaning
发布于 2015-02-22 08:24:10
ES6向JavaScript添加了一个扩散运算符。
function choose(choice, ...availableChoices) {
return availableChoices[choice];
}
choose(2, "one", "two", "three", "four");
// returns "three"
发布于 2013-11-13 03:28:37
我在这里找到了一个很好的解决方案:http://readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-into-a-list-of-arguments/
基本上,使用function.apply(obj, [args])
而不是function.call
。apply接受一个数组作为第二个参数,并为你“拆分”它。
https://stackoverflow.com/questions/17380315
复制相似问题