我经常使用Python,而且我现在正在快速学习JavaScript(或者我应该说重新学习)。所以,我想问一下,JavaScript中*args
和**kwargs
的等价物是什么?
答案 0 :(得分:38)
*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);
然后,如果你愿意让调用者将可选参数作为一个数组开始传递,你可以跳过所有这些mumbo jumbo:
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使用rest参数功能解决了这个问题。请参阅http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html。
答案 1 :(得分:25)
ES6在JavaScript中添加了一个扩展运算符。
function choose(choice, ...availableChoices) {
return availableChoices[choice];
}
choose(2, "one", "two", "three", "four");
// returns "three"
答案 2 :(得分:17)
我在这里找到了一个很好的解决方案: http://readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-into-a-list-of-arguments/
基本上,使用function.apply(obj, [args])
代替function.call
。 apply将数组作为第二个arg并为你“splats”。
答案 3 :(得分:8)
最近的等价物是arguments
pseudo-array。
答案 4 :(得分:1)
ECMAScript 6将rest parameters与splat运算符完全相同。
答案 5 :(得分:0)
对于那些可能对* args和** kwargs魔术变量有些失落的人,请阅读http://book.pythontips.com/en/latest/args_and_kwargs.html
摘要: * args和** kwargs只是编写魔术变量的常规方法。您可以只说*和**或* var和** vars。也就是说,让我们来谈谈2019年的JavaScript等效产品。
python中的* args表示一个JavaScript数组,例如[“一个”,“两个”,“三个”]可以将其传递给python函数,您只需将函数定义为def function_name(* args):表示此函数接受“数组”或“如果需要,请列出”来调用只需使用函数function([“ one”,“ Two”,“三个”]):
JavaScript中的相同操作可以通过使用:
const **kwargs = [{"length": 1, "height": 2}, {"length":3, "height": 4}]
function(obj1, obj2){
...
}
function(...**kwargs);
**or more dynamically as:**
const **kwargs = [{"length": 1, "height": 2}, {"length":3, "height": 4}]
function(obj){
for(const [key, value] of Object.entries(obj)){
console.log(key, ": ", value)
}
function(**kwargs);
看看https://codeburst.io/a-simple-guide-to-destructuring-and-es6-spread-operator-e02212af5831
另一方面,** kwargs仅代表一组键值对(对象)。从而 ** kwargs,例如[{“ length”:1,“ height”:2},{“ length”:3,“ height”:4}]
在python中定义一个函数,该函数接受对象数组,您只需说def function_name(** kwargs):然后调用即可执行function_name([{“ length”:1,“ height”:2},{“长度”:3,“高度”:4}]):
与JS类似
3.1.10