Gibt es eine Möglichkeit, eine unbekannte Anzahl von Argumenten zu übergeben, wie:
var print_names = function(names) {
foreach(name in names) console.log(name); // something like this
}
print_names('foo', 'bar', 'baz');
Wie erhalte ich auch die Anzahl der übergebenen Argumente?
javascript
Ajsie
quelle
quelle
.apply
). Die anderen zeigen, wie eine unbekannte Anzahl von Argumenten (aus der Funktion heraus) gelesen wird (mitarguments
).Antworten:
ES3 (oder ES5 oder Oldschool Javascript)
Sie können über das magische
arguments
Objekt, das sich ähnlich wie ein Array verhält, auf die Argumente zugreifen, die an eine beliebige Javascript-Funktion übergeben wurden . Die Verwendungarguments
Ihrer Funktion würde so aussehenvar print_names = function() { for (var i=0; i<arguments.length; i++) console.log(arguments[i]); }
Es ist wichtig zu beachten , dass
arguments
ist nicht ein Array. MDC enthält einige gute Dokumentationen: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_objectWenn Sie möchten , drehen
arguments
in ein Array , so dass Sie Dinge tun können wie.slice()
,.push()
etc, verwenden Sie so etwas wie dieses:var args = Array.prototype.slice.call(arguments);
ES6 / Typoskript
Es gibt einen besseren Weg! Die neue Rest Parameter Funktion hat den Rücken:
var print_names = function(...names) { for (let i=0; i<names.length; i++) console.log(names[i]); }
quelle
spread syntax
ist hier völlig falsch. Das ist einrest parameter
Beispiel, das Sie gegeben haben. Gute Antwort, aber verwirrend, dass es alsspread
Array.prototype.slice.call(arguments)
: medium.com/@andrewsburke/…ES6 / ES2015
Nutzen Sie die Restparametersyntax .
function printNames(...names) { console.log(`number of arguments: ${names.length}`); for (var name of names) { console.log(name); } } printNames('foo', 'bar', 'baz');
Es gibt drei Hauptunterschiede zwischen Ruheparametern und dem Argumentobjekt:
quelle
var print_names = function() { console.log.apply( this, arguments ); }; print_names( 1, 2, 3, 4 );
quelle
function print_args() { for(var i=0; i<arguments.length; i++) console.log(arguments[i]) }
quelle
Es gibt ein verstecktes Objekt, das an jede Funktion in JavaScript übergeben wird
arguments
.Sie würden nur verwenden
arguments.length
, um die Anzahl der an die Funktion übergebenen Argumente abzurufen.Um die Argumente zu durchlaufen, verwenden Sie eine Schleife:
for(var i = arguments.length; i--) { var arg = arguments[i]; }
Beachten Sie, dass dies
arguments
kein echtes Array ist. Wenn Sie es also als Array benötigen, konvertieren Sie es folgendermaßen:var args = Array.prototype.slice.call(arguments);
quelle
var args = Array.prototype.slice.call(arguments);
,var args = Array.apply(null, arguments);
usw. Es gibt viele Möglichkeiten ...arguments.length
. Sie können eine for-Schleife verwenden.(function () { for (var a = [], i = arguments.length; i--;) { a.push(arguments[i]); }; return a; })(1, 2, 3, 4, 5, 6, 7, 8)
quelle
for
Block wird nicht wirklich benötigt, aber ich würde eines am Ende der letzten Zeile hinzufügen.FunctionExpression
vsFunctionDeclaration
, überprüfen Sie diesen Artikel .Viel besser jetzt für ES6
function Example() { return { arguments: (...args) =>{ args.map(a => console.log()); } } } var exmpl = new Example(); exmpl.arguments(1, 2, 3, 'a', 'b', 'c');
ich hoffe das hilft
quelle
Ruheparameter in ES6
const example = (...args) => { for (arg in args) { console.log(arg); } }
Hinweis: Sie können reguläre Parameter vor den restlichen Parametern übergeben
const example = (arg1, ...args) => { console.log(arg1); for (arg in args) { console.log(arg); } }
quelle
Sie können den Spread / Rest-Operator verwenden, um Ihre Parameter in einem Array zu sammeln. Dann entspricht
length
der Wert des Arrays der Anzahl der Parameter, die Sie übergeben haben:function foo(...names) { console.log(names); return names; } console.log(foo(1, 2, 3, 4).length);
Mit BabelJS habe ich die Funktion in oldschool JS konvertiert:
"use strict"; function foo() { for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) { names[_key] = arguments[_key]; } console.log(names); return names; }
quelle
Sie können eine Funktion mit dem Spread / Rest-Operator erstellen und von da an haben Sie Ihr Ziel erreicht. Bitte werfen Sie einen Blick auf den Block unten.
const print_names = (...args) => args.forEach(x => console.log(x));
quelle
let x = function(){ return [].slice.call(arguments); }; console.log(x('a','b','c','d'));
quelle
Ich mache das gerne:
Dies hilft nicht, wenn Sie die Anzahl der Argumente nicht kennen, aber es hilft, wenn Sie sich nicht an die Reihenfolge erinnern möchten.
/** * @param params.one A test parameter * @param params.two Another one **/ function test(params) { var one = params.one; if(typeof(one) == 'undefined') { throw new Error('params.one is undefined'); } var two = params.two; if(typeof(two) == 'undefined') { throw new Error('params.two is undefined'); } }
quelle