2016-09-29 12 views
4

Objekt Ich kenne einer mit der Funktion (Optimierung/Leistungsprobleme) alle bekannten Nachteile Arguments objectSpread-Operator mit Funktionsargument

Aber gibt es sehr vorsichtig sein, hat das Objekt der Ausbreitung Operator mit den Argumenten zu verwenden? Oder ist das völlig in Ordnung?

Ich möchte ein Array von einer unbekannten Menge von Argumenten an eine Funktion übergeben erstellen:

function Numbers(){ 
    this.numbers = [...arguments]; 
} 

A fiddle can be found here

Es sieht ganz ordentlich, und in der MDN Seite über die Arguments-Objekt ist sogar vorgeschlagen, dass ich Spread-Operator dafür verwenden kann:

Sie können auch die Array.from() Methode oder die s verwenden pread-Operator zum Konvertieren von Argumenten in ein reales Array.

Aber ich würde immer noch gerne sehen, ob andere eine andere Meinung dazu haben.

Antwort

4

Sie können auch rest parameters verwenden:

function Numbers(...numbers){ 
    this.numbers = numbers; 
} 
+1

macht @ T.J.Crowder das gleiche vorgeschlagen. Dachte nicht darüber nach ... – Wilt

2

Es ist völlig in Ordnung, und es gibt keine im Vergleich Nachteile des altmodischen ES5

this.numbers = [].slice.call(arguments); 

einen Spread mit erinnert sich das gleiche Reiniger in ES2015

this.numbers = [...arguments]; 

Nur, dass es gewann‘ t arbeiten in Pfeilfunktionen (keine arguments), und du bist gut. Rest Argumente und Array.from sind andere Optionen, die auch gut sind.

1

Es ist in Ordnung Spread-Notation zu verwenden (es ist kein Operator) mit arguments. Oder zumindest ist es so gut wie immer, arguments zu verwenden. In ES2015 und darüber (z. B. wenn Sie eine Notation verwenden) gibt es einen sehr eingeschränkten Aufruf, arguments zu verwenden.

Und in der Tat gibt es keine Notwendigkeit in Ihrem Beispiel: Verwenden Sie Argumente ruhen:

function Numbers(...args){ 
    this.numbers = args; 
} 

In diesem Beispiel args ist ein Array. Ein echtes Array.

+1

Schön, wusste nicht, ich könnte das auch tun :) – Wilt

0

Ein Volk Grund sagen, nicht die Argumente zu verwenden, das Objekt ist, weil es wie ein Array aussieht, aber es ist nicht:

Das arguments-Objekt ist kein Array. Es ähnelt einem Array, hat jedoch keine Array-Eigenschaften außer der Länge. Zum Beispiel hat es nicht die Pop-Methode. Allerdings kann es zu einem echten Array umgewandelt werden:

Sie gut sind hier um zu gehen, weil, wie Array.from() der Spread Operator eine neue Kopie

+1

Das ist * ein * Grund. Es gibt auch einen Leistungseinfluss im losen Modus, und Pfeilfunktionen haben kein eigenes "Argument" -Objekt. –

Verwandte Themen