Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的Splat运算符,相当于Python中的*args和**kwargs?_Javascript_Python - Fatal编程技术网

JavaScript中的Splat运算符,相当于Python中的*args和**kwargs?

JavaScript中的Splat运算符,相当于Python中的*args和**kwargs?,javascript,python,Javascript,Python,我经常使用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 f

我经常使用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]);
对于
**kwargs
,确实没有类似的解决方案,因为JS没有关键字参数。相反,只要求调用方将可选参数作为对象传入:

function myfunc (a, b, starstar_kwargs) {
    console.log (a, b, starstar_kwargs.x);
}

myfunc (1, 2, {x:3});
ES6更新
为了完整起见,让我补充一下,ES6使用rest参数特性解决了这个问题。请参见

我在这里找到了一个很好的解决方案:


基本上,使用
function.apply(obj[args])
而不是
function.call
。apply将数组作为第二个参数,并为您“splats”它。

ECMAScript 6将具有与splat操作符相同的功能。

ES6在JavaScript中添加了一个扩展操作符

function choose(choice, ...availableChoices) {
    return availableChoices[choice];
}

choose(2, "one", "two", "three", "four");
// returns "three"

对于那些可能对*args和**kwargs魔法变量稍感迷茫的人,请阅读

总结: *args和**kwargs只是编写神奇变量的常规方法。你可以说*和**或者*变量和**变量。也就是说,让我们谈谈2019年的JavaScript等价物

*python中的args表示JavaScript数组,例如。[“一”、“二”、“三”]要将其传递到python函数中,您只需将函数定义为def function_name(*args):这意味着该函数接受“数组”或“如果您愿意,请列出”调用,您只需使用函数([“一”、“二”、“三”]):

在JavaScript中,同样的事情也可以通过使用:

function(x,y,z){
  ...
}
let *args = ["one", "two", "three"];

function(...*args)

**or more dynamically as**

 function(inputs<T>:Array){

   for(index in inputs){

      console.log(inputs[index]);
   }
}
let *args = ["one", "two", "three"];

function(*args)

有splatsTry调用
函数。apply(obj,[args])
。每个函数对象都有一个
apply()
方法,该方法使用上下文(即
obj
)和参数数组调用函数。为什么不只传入一个键值对对象呢?您可以在javascript中使用
if(输入obj)
,就像在python中使用kwargs中的
if-arg一样。然后,如果它返回true,您只需使用
obj[key]
即可获得值。对我来说,直接进入CoffeeScript而不是花时间使用javascript会更容易吗?这让我想起有人问我,他们是否应该直接进入FORTRAN而不是花时间使用7090汇编程序。当然,咖啡脚本是一个很好的方法。或者TypeScript,或者Traceur,它为您提供了到ECMAScript 6的迁移路径(顺便说一下,这里的语法是
函数(a,…optionals)
)。这些参数中的任何一个都会为您提供默认参数值,而无需使用POJS使用与我的答案中相同的一些想法将其组合在一起。ES6 link 404找不到当我想将函数和参数传递给回调时,这对我来说是不起作用的。不幸的是,这与
*args
类似,并且无法解压对象,如
**kwargs
解压对象的类似方法是
函数选择({choice,…availableechoices}){/*…*/}
。用法是:
choose({choose'a',a:1,b:2,c:3})该注释确实属于答案
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);