在JavaScript中使用Splat运算符,相当于Python中的* args和** kwargs?
我使用Python很多,而且我现在正在快速学习JavaScript(或者我应该说重新学习)。 所以,我想问一下,JavaScript中的*args
和**kwargs
相当于什么?
*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]);
由于JS没有关键字参数,所以**kwargs
实际上没有类似的解决scheme。 相反,只要让调用者将可选参数作为对象传递即可:
function myfunc (a, b, starstar_kwargs) { console.log (a, b, starstar_kwargs.x); } myfunc (1, 2, {x:3});
ES6更新
为了完整性,让我补充一点,ES6解决了这个问题,其余的参数function。 请参阅http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html 。
我在这里find了一个很好的解决scheme: http : //readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-into-a-list-of-arguments/
基本上,使用function.apply(obj, [args])
而不是function.call
。 应用需要一个数组作为第二个参数,并为你“splats”。
ES6为JavaScript添加了一个扩展运算符。 有些浏览器已经实现了。 以下代码在Firefox 35上进行了testing。
function choose(choice, ...availableChoices) { return availableChoices[choice]; } choose(2, "one", "two", "three", "four"); // returns "three"
最接近的等价forms是arguments
pseudo-array 。
ECMAScript 6将具有与splat操作符相同的其他参数 。