Standardparameter für die ES6-Objektzerstörung

73

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, die Objektzerstörung von Standardparametern zu verwenden, ohne sich Gedanken darüber zu machen, dass das Objekt teilweise definiert wird. Folgendes berücksichtigen:

(function test({a, b} = {a: "foo", b: "bar"}) {
  console.log(a + " " + b);
})();

Wenn ich das {a: "qux"}zum Beispiel mit aufrufe, sehe ich qux undefinedin der Konsole, wann ich wirklich will qux bar. Gibt es eine Möglichkeit, dies zu erreichen, ohne alle Eigenschaften des Objekts manuell zu überprüfen?

user3019273
quelle

Antworten:

147

Ja. Sie können "Standardeinstellungen" auch bei der Destrukturierung verwenden:

(function test({a = "foo", b = "bar"} = {}) {
  console.log(a + " " + b);
})();

Dies ist nicht auf Funktionsparameter beschränkt, sondern funktioniert in jedem destrukturierenden Ausdruck.

Bergi
quelle
3
Raffiniert! Es scheint, als würde das Festlegen der Standardeinstellungen auf der Destrukturierungsseite (wie Sie es tun) immer der Standardparameterseite vorgezogen (wie ich es war). Würden Sie dem zustimmen? Können Sie sich etwas vorstellen, auf das Sie achten sollten?
user3019273
2
Ich denke nicht, dass einer dem anderen "vorgezogen" wird. Es macht einfach etwas anderes.
Bergi
1
Dies schützt vor undefined, aber immer noch Fehler, wenn bes nullrichtig ist? Gibt es eine Möglichkeit, sich vor beidem undefinedund nullbei der Destrukturierung zu schützen ? Bsp.: {a: "qux", b: null}Würde immer noch Fehler machen.
Alan Hamlett
2
@AlanHamlett Nein, Destrukturierung befasst sich nur mit undefined- Passing nullmuss explizit erfolgen und führt daher zu einem Fehler. Verwenden Sie den Standard innerhalb der Funktion, um mit beiden nullund umzugehen . undefinedb == null ? "bar" : b
Bergi
2
@ YonggooNoh Siehe hier und hier
Bergi