645 Stimmen

JavaScript variable Anzahl von Argumenten für die Funktion

Gibt es eine Möglichkeit, "unbegrenzt" vars für eine Funktion in JavaScript zu ermöglichen?

Exemple :

load(var1, var2, var3, var4, var5, etc...)
load(var1)

20voto

Canavar Punkte 46926

Ja, genau so:

function load()
{
  var var0 = arguments[0];
  var var1 = arguments[1];
}

load(1,2);

18voto

Peter Tseng Punkte 12727

Wie bereits erwähnt, können Sie die arguments Objekt, um eine variable Anzahl von Funktionsparametern abzurufen.

Wenn Sie eine andere Funktion mit den gleichen Argumenten aufrufen wollen, verwenden Sie apply . Sie können sogar Argumente hinzufügen oder entfernen, indem Sie die arguments zu einem Array. Zum Beispiel fügt diese Funktion einen Text ein, bevor sie auf der Konsole protokolliert wird:

log() {
    let args = Array.prototype.slice.call(arguments);
    args = ['MyObjectName', this.id_].concat(args);
    console.log.apply(console, args);
}

10voto

mcurland Punkte 121

Obwohl ich im Allgemeinen zustimmen, dass die benannten Argumente Ansatz ist nützlich und flexibel (es sei denn, Sie kümmern sich um die Reihenfolge, in welchem Fall Argumente ist am einfachsten), habe ich Bedenken über die Kosten der mbeasley Ansatz (mit Standardwerten und erweitert). Dies ist eine extreme Menge an Kosten für das Ziehen von Standardwerten zu nehmen. Erstens werden die Standardwerte innerhalb der Funktion definiert, so dass sie bei jedem Aufruf neu geladen werden. Zweitens können Sie die benannten Werte leicht auslesen und gleichzeitig die Standardwerte mit || setzen. Es besteht keine Notwendigkeit, ein weiteres neues Objekt zu erstellen und zusammenzuführen, um diese Informationen zu erhalten.

function load(context) {
   var parameter1 = context.parameter1 || defaultValue1,
       parameter2 = context.parameter2 || defaultValue2;

   // do stuff
}

Dies ist ungefähr die gleiche Menge an Code (vielleicht etwas mehr), sollte aber einen Bruchteil der Laufzeitkosten ausmachen.

10voto

Brian Ellis Punkte 2081

Während @roufamatic die Verwendung des Schlüsselworts arguments gezeigt hat und @Ken ein großartiges Beispiel eines Objekts für die Verwendung gezeigt hat, bin ich der Meinung, dass keiner von beiden wirklich angesprochen hat, was in diesem Fall vor sich geht, und dass dies künftige Leser verwirren oder zu einer schlechten Praxis führen kann, da nicht explizit angegeben wird, dass eine Funktion/Methode eine variable Anzahl von Argumenten/Parametern annehmen soll.

function varyArg () {
    return arguments[0] + arguments[1];
}

Wenn ein anderer Entwickler Ihren Code durchschaut, kann er leicht annehmen, dass diese Funktion keine Parameter benötigt. Besonders wenn dieser Entwickler nicht in die Argumente Stichwort. Aus diesem Grund ist es eine gute Idee, sich an eine Stilrichtlinie zu halten und konsistent zu sein. Ich werde für alle Beispiele die von Google verwenden.

Geben wir ausdrücklich an, dass die gleiche Funktion variable Parameter hat:

function varyArg (var_args) {
    return arguments[0] + arguments[1];
}

Objektparameter VS var_args

Es kann vorkommen, dass ein Objekt benötigt wird, da es die einzige genehmigte und als Best Practice geltende Methode für eine Datenabbildung ist. Assoziative Arrays sind verpönt und werden nicht empfohlen.

SIDENOTE: Das Schlüsselwort arguments gibt eigentlich ein Objekt mit Zahlen als Schlüssel zurück. Die prototypische Vererbung ist auch die Objektfamilie. Siehe Ende der Antwort für die richtige Verwendung von Arrays in JS

In diesem Fall können wir das auch ausdrücklich sagen. Hinweis: Diese Namenskonvention wird nicht von Google vorgegeben, sondern ist ein Beispiel für die explizite Angabe des Typs eines Parameters. Dies ist wichtig, wenn Sie ein strengeres Typisierungsmuster in Ihrem Code erstellen möchten.

function varyArg (args_obj) {
    return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});

Welche soll ich wählen?

Dies hängt von den Bedürfnissen Ihrer Funktion und Ihres Programms ab. Wenn Sie zum Beispiel einfach einen Wert auf der Basis eines iterativen Prozesses über alle übergebenen Argumente zurückgeben wollen, dann bleiben Sie auf jeden Fall bei der Argumente Stichwort. Wenn Sie eine Definition Ihrer Argumente und eine Zuordnung der Daten benötigen, ist die Objektmethode der richtige Weg. Schauen wir uns zwei Beispiele an und dann sind wir fertig!

Argumente Verwendung

function sumOfAll (var_args) {
    return arguments.reduce(function(a, b) {
        return a + b;
    }, 0);
}
sumOfAll(1,2,3); // returns 6

Verwendung von Objekten

function myObjArgs(args_obj) {
    // MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
    if (typeof args_obj !== "object") {
        return "Arguments passed must be in object form!";
    }

    return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old

Zugriff auf ein Array statt auf ein Objekt ("...args" Der Restparameter)

Wie bereits oben in der Antwort erwähnt, ist die Argumente Schlüsselwort tatsächlich ein Objekt zurück. Aus diesem Grund muss jede Methode, die Sie für ein Array verwenden möchten, aufgerufen werden. Ein Beispiel hierfür:

Array.prototype.map.call(arguments, function (val, idx, arr) {});

Um dies zu vermeiden, verwenden Sie den Parameter rest:

function varyArgArr (...var_args) {
    return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5

7voto

nickytonline Punkte 6795

Verwenden Sie die arguments Objekt innerhalb der Funktion, um Zugriff auf alle übergebenen Argumente zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X