JavaScript für Ungeduldige. Cay Horstmann
Чтение книги онлайн.
Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 15
Alle Strings stehen in doppelten Anführungszeichen, nicht in einfachen.
Alle Eigenschaftennamen stehen in doppelten Anführungszeichen.
Es gibt keine nachfolgenden Kommata und es dürfen keine Elemente fehlen.
Eine formale Beschreibung der Notation finden Sie auf www.json.org
.
Das folgende Beispiel zeigt einen JSON-String:
{ "name": "Harry Smith", "age": 42, "lucky numbers": [17, 29], "lucky": false }
Die Methode JSON.stringify wandelt ein JavaScript-Objekt in einen JSON-String um. Umgekehrt analysiert JSON.parse einen JSON-String und gibt ein JavaScript-Objekt zurück. Diese beiden Methoden werden gewöhnlich bei der Kommunikation mit einem Server über HTTP eingesetzt.
Vorsicht
JSON.stringify verwirft Objekteigenschaften mit dem Wert undefined und wandelt Array-Elemente mit dem Wert undefined in null um. So ergibt beispielsweise JSON.stringify({ name: ['Harry', undefined, 'Smith'], age: undefined }) den String '{"name":["Harry",null,"Smith"]}'.
Manche Programmierer verwenden die Methode JSON.stringify zur Protokollierung. Betrachten Sie den folgenden Protokollierungsbefehl:
console.log(`harry=${harry}`)
Dadurch erhalten Sie nur die folgende nutzlose Meldung:
harry=[object Object]
Ein Aufruf von JSON.stringify kann hier Abhilfe schaffen:
console.log(`harry=${JSON.stringify(harry)}`)
Dieses Problem tritt jedoch nur bei Strings auf, die Objekte enthalten. Wenn Sie ein Objekt für sich selbst protokollieren, zeigt die Konsole es korrekt an. Eine einfache Alternative besteht darin, die Namen und Werte separat zu protokollieren:
console.log('harry=', harry, 'sally=', sally)
Noch einfacher ist es, sie in ein Objekt zu packen:
console.log({harry, sally}) // Protokolliert das Objekt { harry: { . . . }, sally: { . . . } }
1.16Destrukturierung
Die Destrukturierung bietet eine komfortable Syntax, um die Elemente eines Arrays oder die Werte eines Objekts abzurufen. Wie die anderen Themen auf mittlerem Niveau in diesem Kapitel können Sie auch dieses zunächst überspringen. In diesem Abschnitt geht es um die grundlegende Syntax. Mit den Einzelheiten beschäftigen wir uns im Anschluss.
Wenden wir uns als Erstes den Arrays zu. Angenommen, wir haben das Array pair mit zwei Elementen. Dabei können wir wie folgt auf die einzelnen Elemente zugreifen:
let first = pair[0]
let second = pair[1]
Durch Destrukturierung wird daraus Folgendes:
let [first, second] = pair
Diese Anweisung deklariert die Variablen first und second und initialisiert sie mit pair[0] und pair[1].
Die linke Seite der Destrukturierungszuweisung ist in Wirklichkeit gar kein Array-Literal, denn schließlich gibt es first und second noch gar nicht. Sie können sich diese linke Seite als Muster vorstellen, das angibt, wie die Variablen der rechten Seite zugewiesen werden sollen.
Betrachten Sie nun den folgenden komplizierteren Fall. Schauen Sie sich dabei an, wie die Variablen den Array-Elementen zugeordnet werden:
let [first, [second, third]] = [1, [2, 3]]
// Setzt first auf 1, second auf 2 und third auf 3
Das Array auf der rechten Seite kann länger sein als das Muster auf der linken. Die Elemente, für die es keine Entsprechung gibt, werden einfach ignoriert:
let [first, second] = [1, 2, 3]
Ist das Array dagegen kürzer, werden die Variablen ohne Entsprechung auf undefined gesetzt:
let [first, second] = [1]
// Setzt first auf 1 und second auf undefined
Wenn die Variablen first und second bereits deklariert sind, können Sie sie mithilfe der Destrukturierung auf neue Werte setzen:
[first, second] = [4, 5]
Tipp
Um die Werte der Variablen x und y zu vertauschen, schreiben Sie einfach Folgendes:
[x, y] = [y, x]
Wenn Sie die Destrukturierung für eine Zuweisung verwenden, muss die linke Seite nicht unbedingt aus Variablen bestehen. Stattdessen können Sie auch L-Werte verwenden, also Ausdrücke, die nur auf der linken Seite einer Anweisung stehen können. Die Destrukturierung im folgenden Beispiel ist daher gültig:
[numbers[0], harry.age] = [13, 42] // Gleichwertig mit numbers[0] = 13;
harry.age = 42
Die Destrukturierung für Objekte erfolgt auf ähnliche Weise, allerdings verwenden Sie dabei Eigenschaftennamen statt Array-Positionen:
let harry = { name: 'Harry', age: 42 }
let { name: harrysName, age: harrysAge} = harry
Dieser Code deklariert die beiden Variablen harrysName und harrysAge und initialisiert sie mit den Werten der Eigenschaften name und age des Objekts auf der rechten Seite. Denken Sie daran, dass die linke Seite kein Objektliteral ist, sondern ein Muster, das angibt, wie die Variablen der rechten Seite zugeordnet werden.
Die Destrukturierung für Objekte ist besonders dann praktisch, wenn die Eigenschaft denselben Namen hat wie die Variable. In einem solchen Fall können Sie den Eigenschaftennamen und den Doppelpunkt weglassen. Die folgende Anweisung deklariert die beiden Variablen name und age und initialisiert sie mit den gleichnamigen Eigenschaften des Objekts auf der rechten Seite:
let { name, age } = harry
Das ist gleichbedeutend mit der folgenden Anweisung:
let { name: name, age: age} = harry
Und