JavaScript für Ungeduldige. Cay Horstmann
Чтение книги онлайн.
Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 16
let age = harry.age
Vorsicht
Wenn Sie die Objektdestrukturierung einsetzen, um vorhandene Variablen zu setzen, müssen Sie den Zuweisungsausdruck in runde Klammern einschließen:
({name, age} = sally)
Anderenfalls würde der Parser die öffnende geschweifte Klammer als den Beginn einer Blockanweisung auffassen.
1.17Destrukturierung für Fortgeschrittene
Im vorangegangenen Abschnitt habe ich mich auf die grundlegenden Aspekte der Destrukturierungssyntax beschränkt. In diesem Abschnitt für Fortgeschrittene sehen wir uns zusätzliche Merkmale an, die zwar sehr praktisch, aber nicht so unmittelbar verständlich sind. Sie können diesen Abschnitt auch gern überspringen und später darauf zurückkommen, wenn Sie die Grundlagen gemeistert haben.
1.17.1Mehr zum Thema Objektstrukturierung
Es ist auch möglich, verschachtelte Objekte zu destrukturieren:
let pat = { name: 'Pat', birthday: { day: 14, month: 3, year: 2000 } }
let { birthday: { year: patsBirthYear } } = pat
// Deklariert die Variable patsBirthYear und initialisiert sie mit 2000
Denken Sie auch hier wieder daran, dass die linke Seite der zweiten Anweisung kein Objekt ist, sondern ein Muster für die Zuordnung der Variablen zur rechten Seite. Diese Anweisung ist gleichbedeutend mit:
let patsBirthYear = pat.birthday.year
Ebenso wie bei Objektliteralen können auch hier berechnete Eigenschaftennamen verwendet werden:
let field = 'Age'
let { [field.toLowerCase()]: harrysAge } = harry
// Setzt value auf harry[field.toLowerCase()]
1.17.2Restdeklarationen
Bei der Destrukturierung eines Arrays können Sie alle übrig gebliebenen Elemente in einem eigenen Array erfassen. Stellen Sie dem betreffenden Variablennamen eine Ellipse (...) voran.
numbers = [1, 7, 2, 9]
let [first, second, ...others] = numbers
// first ist 1, second is 7 und others ist [2, 9]
Wenn das Array auf der rechten Seite über zu wenige Elemente verfügt, ist die Restvariable ein leeres Array:
let [first, second, ...others] = [42]
// first ist 42, second ist undefined und others ist []
Restdeklarationen sind auch bei Objekten möglich:
let { name, ...allButName } = harry
// allButName ist { age: 42 }
Die Variable allButName wird auf ein Objekt gesetzt, das alle Eigenschaften außer derjenigen mit dem Schlüssel name enthält.
1.17.3Standardwerte
Für jede Variable können Sie einen Standardwert festlegen, der verwendet wird, wenn der entsprechende Wert in dem Objekt oder Array nicht vorhanden oder undefined ist. Geben Sie dazu hinter dem Variablennamen mit einem Gleichheitszeichen den gewünschten Ausdruck an:
let [first, second = 0] = [42]
// Setzt first auf 42 und second auf 0, da es auf der rechten Seite kein
// übereinstimmendes Element gibt
let { nickname = 'None' } = harry
// Setzt nickname auf 'None', da harry nicht über die Eigenschaft nickname
// verfügt
Ausdrücke für Standardwerte können auch die zuvor festgelegten Variablen enthalten:
let { name, nickname = name } = harry
// Sowohl name als auch nickname werden auf harry.name gesetzt
Das folgende Beispiel zeigt eine typische Anwendung der Destrukturierung mit Standardwerten. Stellen Sie sich ein Objekt vor, das Angaben zur Verarbeitung enthält, also etwa Formatierungsanweisungen. Wenn darin eine bestimmte Eigenschaft nicht angegeben ist, soll dafür ein Standardwert verwendet werden:
let config = { separator: '; ' }
const { separator = ',', leftDelimiter = '[', rightDelimiter = ']' } = config
Die Variable separator wird hier mit einem benutzerdefinierten Trennzeichen initialisiert. Da in der Konfiguration jedoch keine Begrenzungszeichen angegeben sind, werden die Standardzeichen für diesen Zweck verwendet. Mit der Destrukturierungssyntax fällt der Code viel knapper aus, als wenn Sie jede Eigenschaft einzeln nachschlagen, prüfen, ob sie definiert ist, und ggf. einen Standardwert dafür vorgeben.
In Kapitel 3 sehen wir uns eine ähnliche Anwendung der Destrukturierung für Funktionsparameter an.
1.18Übungen
1 Was geschieht jeweils, wenn Sie 0 zu den Werten NaN, Infinity, false, true, null und undefined addieren? Was geschieht jeweils, wenn Sie einen leeren String mit NaN, Infinity, false, true, null und undefined verketten? Raten Sie zuerst und probieren Sie es dann aus.
2 Was ergibt [] + [], {} + [], [] + {}, {} + {} und [] - {}? Werten Sie diese Ausdrücke einmal an der Befehlszeile aus und weisen Sie sie einmal einer Variablen zu. Vergleichen Sie die Ergebnisse und erklären Sie das Ergebnis.
3 Wie in Java und C++ (aber anders als in Python, das sich auf viele Jahrhunderte mathematischer Erfahrung stützt) wird n % 2 zu -1 ausgewertet, wenn n ein negativer Integer ist. Untersuchen Sie das Verhalten des Operators % für negative Operanden. Berücksichtigen Sie dabei sowohl Integer als auch Fließkommazahlen.
4 Nehmen