1. ホーム
  2. javascript

[解決済み] JavaScript の Splat 演算子、Python の *args と **kwargs に相当するもの?

2023-04-27 16:14:02

質問

私は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ではrestパラメータ機能でこの問題を解決していることを付け加えておきます。参照 Javascript - '...' の意味