Was machen geschweifte Klammern in Funktionsparameterlisten in es6?


120

Ich sehe immer wieder Funktionen, die so aussehen, in einer Codebasis, an der ich arbeite:

const func = ({ param1, param2 }) => {
  //do stuff
}

Was genau macht das? Es fällt mir schwer, es bei Google zu finden, da ich nicht einmal sicher bin, wie das heißt oder wie ich es in einer Google-Suche beschreiben soll.


Antworten:


116

Es ist destrukturierend , aber in den Parametern enthalten. Das Äquivalent ohne die Destrukturierung wäre:

const func = o => {
    var param1 = o.param1;
    var param2 = o.param2;
    //do stuff
}

11
Um sicherzugehen, dass ich alles richtig verstehe, bedeutet dies im Grunde, dass ein Objekt, das diese Eigenschaften enthält, an die Funktion übergeben wird. Innerhalb der Funktion kann dann automatisch auf die Eigenschaften zugegriffen werden, indem nur ihr Name verwendet wird.
Nathan

7
@ Nathan Ja, siehe speziell den Abschnitt über Objektzerstörung . Beachten Sie jedoch, dass Aktualisierungen der Variablen die ursprünglichen Objekteigenschaften nicht aktualisieren. Es ist nicht so, als würde ein Verweis auf den ursprünglichen Wert erstellt.
James Thorpe


11

Dadurch wird ein Objekt als Eigenschaft übergeben.

Es ist im Grunde eine Abkürzung für

let param1 = someObject.param1
let param2 = someObject.param2

Eine andere Möglichkeit, diese Technik ohne Parameter zu verwenden, ist die folgende. Betrachten wir für eine Sekunde, dass someObject diese Eigenschaften enthält.

let {param1, param2} = someObject;

3

Es ist eine Objektzerstörungsaufgabe. Wie ich haben Sie es vielleicht überraschend gefunden, weil die Syntax zur ES6-Objektzerstörung aussieht, sich aber NICHT wie eine Objektliteralkonstruktion verhält.

Es unterstützt die sehr knappe Form, in die Sie geraten sind, sowie das Umbenennen der Felder und Standardargumente:

Im Wesentlichen ist es {oldkeyname: newkeyname = defaultvalue, ...}. ':' ist NICHT das Schlüssel / Wert-Trennzeichen; '=' ist.

Einige Folgen dieser Entscheidung zum Sprachdesign sind, dass Sie möglicherweise Dinge wie tun müssen

; ({a, b} = some_object);

Die zusätzlichen Parens verhindern, dass die linken geschweiften Klammern als Block analysiert werden, und das führende Semikolon verhindert, dass die Parens als Funktionsaufruf für eine Funktion in der vorherigen Zeile analysiert werden.

Weitere Informationen finden Sie unter: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

Beachten Sie, dass Schlüsselfehler während der Objektzerstörungszuweisung NICHT ausgelöst werden. Sie erhalten nur "undefinierte" Werte, unabhängig davon, ob es sich um einen Schlüsselfehler oder einen anderen Fehler handelt, der stillschweigend als "undefiniert" weitergegeben wurde.

> var {rsienstr: foo, q: bar} = {p:1, q:undefined};
undefined
> foo
undefined
> bar
undefined
> 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.