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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (65)

我使用Python很多,而且我现在正在快速学习JavaScript(或者我应该说重新学习)。所以,我想问,什么是相当于*args**kwargs在JavaScript?

提问于
用户回答回答于

最接近的成语*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通过其余参数功能解决了这个问题。请参阅http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html

用户回答回答于

扫码关注云+社区

领取腾讯云代金券