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

时间:2013-06-29 12:44:54

标签: javascript python

我经常使用Python,而且我现在正在快速学习JavaScript(或者我应该说重新学习)。所以,我想问一下,JavaScript中*args**kwargs的等价物是什么?

6 个答案:

答案 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更新

为了完整性,让我补充一点,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