Dies funktioniert nur für das traditionelle JavaScript function, nicht für ES2015 + Fettpfeilfunktionen =>. Für diese möchten Sie ...argsin der Funktionsdefinition wie folgt verwenden : (...args) => console.log(args).
function testArguments ()// <-- notice no arguments specified{
console.log(arguments);// outputs the arguments to the consolevar htmlOutput ="";for(var i=0; i < arguments.length; i++){
htmlOutput +='<li>'+ arguments[i]+'</li>';}
document.write('<ul>'+ htmlOutput +'</ul>');}
Dies ist viel besser als die akzeptierte Antwort, da sie ein funktionierendes Code-Snippet enthält und die Ausgabe anzeigt. Die akzeptierte Antwort ist zu spärlich.
Mac
Gute Antwort ... wäre eine großartige Antwort mit der Erweiterung auf "kein tatsächliches Array"
terpinmd
Ich habe einen Link zu einer einfachen Beschreibung hinzugefügt: Ein "Array-ähnliches Objekt" ist nur ein "Objekt mit einer Längeneigenschaft einer nicht negativen Ganzzahl und normalerweise einigen indizierten Eigenschaften". Aus dem Mozilla-Link: "Es ähnelt einem Array, hat jedoch keine Array-Eigenschaften außer der Länge."
Luke
31
ES6 ermöglicht ein Konstrukt, bei dem ein Funktionsargument mit der Notation "..." angegeben wird, z
function testArgs (...args){// Where you can test picking the first element
console.log(args[0]);}
Dies scheint der einzige Weg zu sein, wenn die Pfeilfunktion verwendet wird. a = () => {console.log(arguments);}; a('foo');gibt -- Uncaught ReferenceError: arguments is not defined jedoch a = (...args) => {console.log(args);}; a('foo');gibt["foo"]
David Baucum
1
@ DavidBaucum das ist richtig. Da die Pfeilfunktion keinen neuen Bereich erstellt und "Argumente" aus dem Bereich erfasst werden. Das Worst-Case-Szenario ist jedoch kein ReferenceError. Es ist so, dass "Argumente" aus einem äußeren Bereich gesammelt werden. Dann erhalten Sie keine Ausnahme und möglicherweise seltsame Fehler in Ihrer Anwendung.
Im argumentsObjekt werden die Funktionsargumente gespeichert.
Das Argumentobjekt verhält sich und sieht aus wie ein Array. Es verfügt im Grunde genommen nicht über die Methoden, die Arrays ausführen, zum Beispiel:
Danke für das Update. Verwenden Sie alternativ JSON.stringify und JSON.parse: function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } Wenn anstelle der Stringifizierung eine Aufbewahrung erforderlich ist, verwenden Sie den internen strukturierten Klonalgorithmus . Wenn DOM-Knoten übergeben werden, verwenden Sie XMLSerializer wie in einer nicht verwandten Frage . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Paul Sweatte
7
argumentsEnthält, wie viele andere betonten, alle an eine Funktion übergebenen Argumente.
Wenn Sie eine andere Funktion mit denselben Argumenten aufrufen möchten, verwenden Sie apply
Beispiel:
var is_debug =true;var debug =function(){if(is_debug){
console.log.apply(console, arguments);}}
debug("message","another argument")
Ähnliche Antwort zu Gunnar mit vollständigerem Beispiel: Sie können das Ganze sogar transparent zurückgeben:
function dumpArguments(...args){for(var i =0; i < args.length; i++)
console.log(args[i]);return args;}
dumpArguments("foo","bar",true,42,["yes","no"],{'banana':true});
Ja, wenn Sie keine Ahnung haben, wie viele Argumente zum Zeitpunkt der Funktionsdeklaration möglich sind, können Sie die Funktion ohne Parameter deklarieren und über das Argumentarray, das zum Zeitpunkt des Funktionsaufrufs übergeben wird, auf alle Variablen zugreifen.
Wenn Sie als Lesezeichen ausgeführt werden, müssen Sie möglicherweise jedes Argument für strukturierte Daten in einen Fehlerkonstruktor einschließen, damit JSON.stringifyes ordnungsgemäß funktioniert.
Erstens: Dadurch werden alle übergebenen Objekte geklont. Zweitens: Nicht alles kann mit JSON verknüpft werden. Nämlich: Funktionen, DOM-Objekte, besagte Daten werden als Zeichenfolgen stringifiziert ...
John Dvorak
@JanDvorak Können Sie meine Antwort mit einer Funktion bearbeiten, die DOM-Objekte, -Funktionen und -Daten verarbeitet?
Paul Sweatte
1
+1 Wenn Sie versuchen, die Argumente für die Fehlerberichterstattung als Zeichenfolge zu übergeben, wird das Objekt als Zeichenfolge '[Objektargumente]' angezeigt. Wenn Sie dies an der Konsole protokollieren, werden die Werte nicht angezeigt. Obwohl es das OP nicht zu beantworten scheint, beantwortet es meine Frage, danke!
function
, nicht für ES2015 + Fettpfeilfunktionen=>
. Für diese möchten Sie...args
in der Funktionsdefinition wie folgt verwenden :(...args) => console.log(args)
.Die Argumente sind ein Array-ähnliches Objekt (kein tatsächliches Array). Beispielfunktion ...
Versuch es...
Die vollständigen Details: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
quelle
ES6 ermöglicht ein Konstrukt, bei dem ein Funktionsargument mit der Notation "..." angegeben wird, z
quelle
a = () => {console.log(arguments);}; a('foo');
gibt-- Uncaught ReferenceError: arguments is not defined
jedocha = (...args) => {console.log(args);}; a('foo');
gibt["foo"]
Im
arguments
Objekt werden die Funktionsargumente gespeichert.Das Argumentobjekt verhält sich und sieht aus wie ein Array. Es verfügt im Grunde genommen nicht über die Methoden, die Arrays ausführen, zum Beispiel:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.slice(begin[, end])
Array.indexOf(searchElement[, fromIndex])
Ich denke, der beste Weg, ein
arguments
Objekt in ein echtes Array zu konvertieren, ist folgender:Das macht es zu einem Array;
wiederverwendbar:
Ergebnis:
quelle
[].slice.apply(arguments);
kann nicht der beste Weg sein, weil es eine unnötige leere Array-Zuordnung verursacht.Sie können es auch in ein Array konvertieren, wenn Sie dies bevorzugen. Wenn Array-Generika verfügbar sind:
Andernfalls:
von Mozilla MDN :
quelle
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
Wenn anstelle der Stringifizierung eine Aufbewahrung erforderlich ist, verwenden Sie den internen strukturierten Klonalgorithmus . Wenn DOM-Knoten übergeben werden, verwenden Sie XMLSerializer wie in einer nicht verwandten Frage .with (new XMLSerializer()) {serializeToString(document.documentElement) }
arguments
Enthält, wie viele andere betonten, alle an eine Funktion übergebenen Argumente.Wenn Sie eine andere Funktion mit denselben Argumenten aufrufen möchten, verwenden Sie
apply
Beispiel:
quelle
Ähnliche Antwort zu Gunnar mit vollständigerem Beispiel: Sie können das Ganze sogar transparent zurückgeben:
Ausgabe:
https://codepen.io/fnocke/pen/mmoxOr?editors=0010
quelle
Ja, wenn Sie keine Ahnung haben, wie viele Argumente zum Zeitpunkt der Funktionsdeklaration möglich sind, können Sie die Funktion ohne Parameter deklarieren und über das Argumentarray, das zum Zeitpunkt des Funktionsaufrufs übergeben wird, auf alle Variablen zugreifen.
quelle
In ES6 können Sie Folgendes tun:
quelle
Verwenden Sie in ES6
Array.from
:Verwenden Sie für Nicht-ES6-Code JSON.stringify und JSON.parse:
Wenn anstelle einer Stringifizierung eine Aufbewahrung erforderlich ist, verwenden Sie den internen strukturierten Klonierungsalgorithmus .
Wenn DOM-Knoten übergeben werden, verwenden Sie XMLSerializer wie in einer nicht verwandten Frage .
Wenn Sie als Lesezeichen ausgeführt werden, müssen Sie möglicherweise jedes Argument für strukturierte Daten in einen Fehlerkonstruktor einschließen, damit
JSON.stringify
es ordnungsgemäß funktioniert.Verweise
Strukturklon CommonJS-Modul
JS-Objektklon
MDN: Array.from ()
quelle