当前位置: 首页 > 面试题库 >

JavaScript中的Splat运算符是否等效于Python中的* args和** kwargs?

乜璞瑜
2023-03-14
问题内容

我经常使用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参数功能解决了此问题。



 类似资料:
  • 问题内容: 在C#中,有一个null-coalescing运算符(写为),允许在赋值期间进行简单(简短)的null检查: 有python等效项吗? 我知道我可以做到: 但是,还有没有更短的方法(我不需要重复)? 问题答案: 好的,必须澄清操作员的工作方式。它是一个布尔运算符,因此可以在布尔上下文中工作。如果值不是布尔值,则出于运算符的目的,它们将转换为布尔值。 请注意,运算符不会仅返回或。相反,如

  • 问题内容: 是否可以在Java中执行类似于以下代码的操作 问题答案: 可悲的是没有。您能做的最接近的是: 当然,如果您有需要的话,可以将其包装在库方法中(不太可能减少长度),但是在语法级别上没有更简洁的方法了。

  • 问题内容: 在JavaScript中: C#应用程序是否等效?为了转义HTML字符,我使用了: 但是我不确定如何将匹配项转换为JS使用的正确十六进制格式。例如此代码: 返回“ 的,而不是它看起来像我需要了分割字符串为字节或东西。 编辑:这是一个Windows应用程序中,唯一可用的项目有:,,和。 问题答案: 或者是转义旨在成为URL一部分的字符串的正确方法。 以字符串为例: -> -> ->也编码

  • 问题内容: 我试图在SQL中找到与\ 等效的ElasticSearch查询。 我知道我们可以使用带有多个OR的QueryString查询来获得相同的答案,但这最终导致很多OR。 谁能分享这个例子? 问题答案: 与克里斯建议的评论类似,类似的替换是 过滤器 (查询暗示得分,这可能会改善返回的订单)。 等效的Elasticsearch 1.x过滤器为: 等效的Elasticsearch 2.x +过滤

  • 问题内容: 当我从解释器编写Python代码时,我可以键入要在当前作用域中定义的名称列表。当我使用交互式控制台(如Firebug,Chrome控制台等)从浏览器开发Javascript代码时,如何以编程方式实现具有相同的信息? 问题答案: 在ChatZilla的代码中,有几个功能可以执行此操作,您必须正确检查许可证以查看是否可以将其撕下来并在任何地方使用。 相关功能可以在 http://hg.mo

  • 本文向大家介绍Ruby数组和splat(*)运算符,包括了Ruby数组和splat(*)运算符的使用技巧和注意事项,需要的朋友参考一下 示例 的*操作者可用于解压缩变量和数组,使得它们可以作为一个独立的参数的方法进行传递。 如果尚未将单个对象包装在Array中,则可以使用它: 在上面的示例中,该wrap_in_array方法接受一个参数value。 如果value为Array,则将其元素解压缩,并