首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript中的Splat运算符,相当于Python中的*args和**kwargs?

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

Stack Overflow用户
提问于 2013-06-29 20:44:54
回答 6查看 54.2K关注 0票数 83

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-06-29 22:18:09

*args最接近的习惯用法是

代码语言:javascript
复制
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是函数定义中给定的参数数量这一事实。

您可以将其打包成一个小的助手例程,如下所示

代码语言:javascript
复制
function get_star_args (func, args) {
    return Array.prototype.slice.call (args, func.length);
}

然后做

代码语言:javascript
复制
function func (a, b /*, *args*/) {
    var star_args = get_star_args (func, arguments);
    /* now star_args[0] is the first undeclared argument */
}

如果你想要语法糖,可以编写一个函数,将一个函数转换为另一个函数,该函数使用必需的和可选的参数进行调用,并传递所需的参数,以及任何附加的可选参数作为最终位置的数组:

代码语言:javascript
复制
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);
    };
}

如下所示使用它:

代码语言:javascript
复制
// 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);

同样,如果您愿意要求调用者以数组的形式传递可选参数,那么您可以跳过所有这些胡言乱语:

代码语言:javascript
复制
myfunc (1, 2, [3]);

**kwargs实际上没有类似的解决方案,因为JS没有关键字参数。相反,只需要求调用者将可选参数作为对象传递:

代码语言:javascript
复制
function myfunc (a, b, starstar_kwargs) {
    console.log (a, b, starstar_kwargs.x);
}

myfunc (1, 2, {x:3});

ES6更新

为了完整起见,让我补充一句,ES6使用rest参数特性解决了这个问题。请参阅Javascript - '...' meaning

票数 55
EN

Stack Overflow用户

发布于 2015-02-22 08:24:10

ES6向JavaScript添加了一个扩散运算符。

代码语言:javascript
复制
function choose(choice, ...availableChoices) {
    return availableChoices[choice];
}

choose(2, "one", "two", "three", "four");
// returns "three"
票数 48
EN

Stack Overflow用户

发布于 2013-11-13 03:28:37

我在这里找到了一个很好的解决方案:http://readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-into-a-list-of-arguments/

基本上,使用function.apply(obj, [args])而不是function.call。apply接受一个数组作为第二个参数,并为你“拆分”它。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17380315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档