Das arguments
Objekt in JavaScript ist eine ungeradeen warzen es wirkt wie ein Array in den meisten Situationen, aber es ist nicht wirklich ein Array - Objekt. Da es sich um etwas wirklich ganz anderes , hat es nicht die nützlichen Funktionen aus Array.prototype
wie forEach
, sort
, filter
, und map
.
Es ist trivial einfach, ein neues Array aus einem Argumentobjekt mit einer einfachen for-Schleife zu erstellen. Diese Funktion sortiert beispielsweise ihre Argumente:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Dies ist jedoch eine ziemlich erbärmliche Sache, um einfach auf die äußerst nützlichen JavaScript-Array-Funktionen zugreifen zu können. Gibt es eine integrierte Möglichkeit, dies mit der Standardbibliothek zu tun?
javascript
arrays
sorting
arguments
variadic-functions
Andrew Coleson
quelle
quelle
Antworten:
ES6 mit Ruheparametern
Wenn Sie ES6 verwenden können, können Sie Folgendes verwenden:
Ruheparameter
Wie Sie im Link lesen können
Wenn Sie neugierig auf die
...
Syntax sind, heißt sie Spread Operator und Sie können hier mehr lesen .ES6 mit Array.from ()
Verwenden von Array.from :
Array.from
Konvertieren Sie einfach Array-ähnliche oder iterierbare Objekte in Array-Instanzen.ES5
Sie können eigentlich nur nutzen
Array
s‘slice
auf Argumente Objektfunktion, und es wird es in eine Standard - JavaScript - Array konvertieren. Sie müssen es nur manuell über den Prototyp von Array referenzieren:Warum funktioniert das? Hier ist ein Auszug aus der ECMAScript 5-Dokumentation selbst :
Funktioniert daher
slice
an allem, was einelength
Eigenschaft hat, wasarguments
bequem ist.Wenn
Array.prototype.slice
Ihnen der Mund voll ist, können Sie ihn mit Array-Literalen leicht abkürzen:Ich habe jedoch das Gefühl, dass die frühere Version expliziter ist, daher würde ich sie stattdessen bevorzugen. Der Missbrauch der wörtlichen Array-Notation fühlt sich hackig an und sieht seltsam aus.
quelle
0
? Da Sie keine Argumente übergeben möchten, warum können Sie diese nicht einfach verwendenvar args = Array.prototype.slice.call(arguments);
? [ Die MDC-Argumentationsseite ] ( developer.mozilla.org/en/JavaScript/Reference/… ) schlägt die Methode ohne das vor0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
von MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Es lohnt sich auch, auf diese Wiki-Seite der Bluebird-Versprechungsbibliothek zu verweisen , die zeigt, wie das
arguments
Objekt in einem Array so verwaltet wird, dass die Funktion unter der V8-JavaScript-Engine optimiert werden kann :Diese Methode wird zugunsten von verwendet
var args = [].slice.call(arguments);
. Der Autor zeigt auch, wie ein Build-Schritt dazu beitragen kann, die Ausführlichkeit zu verringern.quelle
Einige Array-Methoden sind absichtlich so konzipiert, dass das Zielobjekt kein tatsächliches Array sein muss. Sie erfordern nur, dass das Ziel eine Eigenschaft mit dem Namen Länge und Indizes hat (die ganzzahlig Null oder größer sein müssen).
quelle
Verwenden:
Array(arg1, arg2, ...)
kehrt zurück[arg1, arg2, ...]
Array(str1)
kehrt zurück[str1]
Array(num1)
Gibt ein Array mitnum1
Elementen zurückSie müssen die Anzahl der Argumente überprüfen!
Array.slice
Version (langsamer):Array.push
Version (langsamer, schneller als Slice):Version verschieben (langsamer, aber klein ist schneller):
Array.concat
Version (am langsamsten):quelle
Wenn Sie jQuery verwenden, ist Folgendes meiner Meinung nach viel einfacher zu merken:
quelle
In ECMAScript 6 müssen keine hässlichen Hacks wie verwendet werden
Array.prototype.slice()
. Sie können stattdessen die Spread-Syntax (...
) verwenden .Es mag seltsam aussehen, ist aber ziemlich einfach. Es werden nur
arguments
die Elemente extrahiert und wieder in das Array eingefügt. Wenn Sie immer noch nicht verstehen, sehen Sie sich diese Beispiele an:Beachten Sie, dass dies in einigen älteren Browsern wie IE 11 nicht funktioniert. Wenn Sie diese Browser unterstützen möchten, sollten Sie Babel verwenden .
quelle
Hier ist ein Benchmark mehrerer Methoden, die Argumente in Arrays konvertieren.
Für mich ist die beste Lösung für eine kleine Anzahl von Argumenten:
Für andere Fälle:
quelle
sortArgs
in Firefox sechsmal schneller sind, in Chrome jedoch doppelt so langsam wie im neuesten ChromeArray.apply
.Ich empfehle die Verwendung des ECMAScript 6- Spread-Operators , der nachfolgende Parameter an ein Array bindet. Mit dieser Lösung müssen Sie das
arguments
Objekt nicht berühren und Ihr Code wird vereinfacht. Der Nachteil dieser Lösung ist, dass sie in den meisten Browsern nicht funktioniert. Stattdessen müssen Sie einen JS-Compiler wie Babel verwenden. Unter der Haube verwandelt sich Babelarguments
in ein Array mit einer for-Schleife.Wenn Sie kein ECMAScript 6 verwenden können, empfehle ich, einige der anderen Antworten wie @Jonathan Fingland zu lesen
quelle
Lodash:
in Aktion:
produziert:
quelle
_.toArray
?_.toArray
aber angemessener.Verwenden Sie
Array.from()
diese Option, um ein Array-ähnliches Objekt (z. B.arguments
) als Argument zu verwenden und es in ein Array zu konvertieren:Beachten Sie, dass dies in einigen älteren Browsern wie IE 11 nicht funktioniert. Wenn Sie diese Browser unterstützen möchten, sollten Sie Babel verwenden .
quelle
quelle
Eine andere Antwort.
Verwenden Sie Zauber der schwarzen Magie:
Firefox, Chrome, Node.js, IE11 sind in Ordnung.
quelle
__proto__
ist veraltet. Siehe MDN-Dokumente .Versuchen Sie es mit
Object.setPrototypeOf()
Erläuterung: Satz
prototype
vonarguments
bisArray.prototype
Erläuterung: Nehmen Sie jeden Index von
arguments
und platzieren Sie das Element in einem Array am entsprechenden Index des Arrays.könnte alternativ verwenden
Array.prototype.map()
Erläuterung: Nehmen Sie jeden Index von
arguments
und platzieren Sie das Element in einem Array am entsprechenden Index des Arrays.for..of
Schleifeoder
Object.create()
Erläuterung: Objekt erstellen, Eigenschaften des Objekts auf Elemente an jedem Index von setzen
arguments
; Satzprototype
von erstellten Objekten zuArray.prototype
quelle
Object.setPrototypeOf
warnt Ihr Verweis auf das Dokument von , dass es sich um eine "sehr langsame Operation" handelt. Warum um alles in der Welt sollte ich das über verwendenArray.prototype.slice.call
?Hier ist eine saubere und präzise Lösung:
Object.values( )
die Werte eines Objekts als Array zurück, und daarguments
ein Objekt ist, wird es im Wesentlichen wandelnarguments
in ein Array, so dass Sie mit allen eines Arrays Hilfsfunktionen wie die Bereitstellung vonmap
,forEach
,filter
etc.quelle
Benshmarck 3 Methoden:
ERGEBNIS?
Genießen !
quelle
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
zudummyFn(3)
[,,]
dummyFn(3)
was das ist? Diese Funktion existiert nicht ...quelle
Obwohl Ruheparameter gut funktionieren, sollten Sie berücksichtigen, ob Sie sie
arguments
aus irgendeinem Grund weiterhin verwenden möchten[...arguments]
kann als eine Art Alternative zu betrachtet werdenArray.from(arguments)
, die auch perfekt funktioniert.Eine ES7-Alternative ist ein Array-Verständnis:
Dies ist am einfachsten, wenn Sie die Argumente vor dem Sortieren verarbeiten oder filtern möchten:
quelle
Ich habe eine einfache Zerstörungstechnik ausprobiert
quelle
Das Arguments-Objekt ist nur innerhalb eines Funktionskörpers verfügbar. Obwohl Sie das Argumentobjekt wie ein Array indizieren können, handelt es sich nicht um ein Array. Es hat keine anderen Array-Eigenschaften als die Länge.
Obwohl es wie ein Array indiziert werden kann, wie Sie in diesem Beispiel sehen können:
Das Arguments-Objekt ist jedoch kein Array und hat keine anderen Eigenschaften als die Länge.
Sie können das Argumentobjekt in ein Array konvertieren und an diesem Punkt auf das Argumentobjekt zugreifen.
Es gibt viele Möglichkeiten, auf das Argumentobjekt innerhalb eines Funktionskörpers zuzugreifen. Dazu gehören:
Array.prototype.slice.call (Argumente)
[] .slice.call (Argumente).
quelle
Sie können eine wiederverwendbare Funktion erstellen, um dies mit beliebigen Argumenten zu tun. Die einfachste ist ungefähr so:
Die Spread-Syntax kann in ES6 und höher verwendet werden ...
Wenn Sie jedoch etwas verwenden möchten , das mit ES5 und niedriger kompatibel ist , können Sie Folgendes verwenden
Array.prototype.slice.call
, sodass Ihr Code folgendermaßen aussieht:Es gibt auch einige andere Möglichkeiten, dies zu tun, zum Beispiel
Array.from
die Argumente zu verwenden oder zu durchlaufen und sie einem neuen Array zuzuweisen ...quelle
Dies ist eine sehr alte Frage, aber ich glaube, ich habe eine Lösung, die etwas einfacher zu tippen ist als frühere Lösungen und nicht auf externen Bibliotheken basiert:
quelle
Array.apply
funktioniert nicht, wenn Sie nur ein einziges positives Integer-Argument haben. Dies liegt daran, dassnew Array(3)
eine Array-Länge von erstellt wird3
. Genauer gesagt wird das Ergebnis sein[undefined, undefined, undefined]
und nicht[3]
.