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)
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)
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);
}
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.
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];
}
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});
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!
function sumOfAll (var_args) {
return arguments.reduce(function(a, b) {
return a + b;
}, 0);
}
sumOfAll(1,2,3); // returns 6
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
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
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.