it-swarm.com.de

Splat-Operatoren in JavaScript, die * args und ** kwargs in Python entsprechen?

Ich benutze Python viel, und ich lerne gerade schnell JavaScript (oder sollte ich Re-Learning sagen). Also wollte ich fragen, was ist das Äquivalent von *args und **kwargs in JavaScript?

64
Games Brainiac

Die nächste Redewendung für *args wäre

function func (a, b /*, *args*/) {
    var star_args = Array.prototype.slice.call (arguments, func.length);
    /* now star_args[0] is the first undeclared argument */
}

die Tatsache ausnutzen, dass Function.length ist die Anzahl der in der Funktionsdefinition angegebenen Argumente.

Sie könnten dies in eine kleine Hilfsroutine wie packen

function get_star_args (func, args) {
    return Array.prototype.slice.call (args, func.length);
}

und dann tu es

function func (a, b /*, *args*/) {
    var star_args = get_star_args (func, arguments);
    /* now star_args[0] is the first undeclared argument */
}

Wenn Sie Lust auf syntaktischen Zucker haben, schreiben Sie eine Funktion, die eine Funktion in eine andere umwandelt, die mit erforderlichen und optionalen Argumenten aufgerufen wird, und übergibt die erforderlichen Argumente zusammen mit zusätzlichen optionalen Argumenten als Array an die endgültige Position:

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);
    };
}

Verwenden Sie dies wie folgt:

// 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);

Andererseits können Sie all diesen Hokuspokus einfach überspringen, wenn Sie den Aufrufer bitten möchten, die optionalen Argumente als Array zu übergeben, um mit Folgendem zu beginnen:

myfunc (1, 2, [3]);

Es gibt wirklich keine analoge Lösung für **kwargs, da JS keine Schlüsselwortargumente hat. Bitten Sie stattdessen den Aufrufer, die optionalen Argumente als Objekt zu übergeben:

function myfunc (a, b, starstar_kwargs) {
    console.log (a, b, starstar_kwargs.x);
}

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

ES6-Update

Der Vollständigkeit halber möchte ich hinzufügen, dass ES6 dieses Problem mit der Restparameterfunktion löst. Siehe http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html .

38
user663031

ES6 hat JavaScript einen Spread-Operator hinzugefügt.

function choose(choice, ...availableChoices) {
    return availableChoices[choice];
}

choose(2, "one", "two", "three", "four");
// returns "three"
27
Helio Santos

Ich habe hier eine gute Lösung gefunden: http://readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-into-a-list-of-arguments/

Verwenden Sie grundsätzlich function.apply(obj, [args]) anstelle von function.call. apply nimmt ein Array als zweites Argument und 'plätschert' es für Sie.

17
Luke W

Das nächste Äquivalent ist das arguments Pseudo-Array .

8
NPE

ECMAScript 6 verfügt über Rest-Parameter , die dasselbe tun wie der Splat-Operator.

1
Cameron Martin