Kurz: Seit ES2015 gibt es kompakte Schreibweisen, um Daten aus Arrays und Objekten zu entpacken und zu verteilen.
Teil des Kurses JavaScript
Kapitel 16 von 40 im Kurs JavaScript. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Seit ES2015 gibt es kompakte Schreibweisen, um Daten aus Arrays und Objekten zu entpacken und zu verteilen.
Array-Destructuring
const [a, b, c] = [10, 20, 30];
console.log(a, b, c);
const [erstes, , drittes] = ["x", "y", "z"]; // Lücke überspringt
console.log(erstes, drittes);
const [kopf, ...rest] = [1, 2, 3, 4];
console.log(kopf, rest);
const [p = 5, q = 6] = [1]; // Standardwerte
console.log(p, q);
let m = 1, n = 2;
[m, n] = [n, m]; // Tauschen
console.log(m, n);Ausgabe:
10 20 30
x z
1 [ 2, 3, 4 ]
1 6
2 1Objekt-Destructuring
const nutzer = { name: "Mia", alter: 17, stadt: "Köln" };
const { name, alter } = nutzer;
console.log(name, alter);
const { stadt: ort, land = "DE" } = nutzer; // umbenennen + Standardwert
console.log(ort, land);
const { name: n1, ...uebrige } = nutzer;
console.log(n1, uebrige);Ausgabe:
Mia 17
Köln DE
Mia { alter: 17, stadt: 'Köln' }Verschachtelt
const antwort = { daten: { nutzer: { id: 7, tags: ["a", "b"] } } };
const { daten: { nutzer: { id, tags: [ersterTag] } } } = antwort;
console.log(id, ersterTag);Ausgabe:
7 aIn Funktionsparametern
function zeige({ name, alter = 0 }, [x, y] = [0, 0]) {
return `${name} (${alter}) bei ${x}/${y}`;
}
console.log(zeige({ name: "Tom" }));
console.log(zeige({ name: "Mia", alter: 17 }, [3, 4]));Ausgabe:
Tom (0) bei 0/0
Mia (17) bei 3/4Spread: Verteilen mit …
const a = [1, 2], b = [3, 4];
console.log([...a, ...b, 5]);
console.log(Math.max(...a, ...b));
const o1 = { x: 1, y: 2 }, o2 = { y: 20, z: 3 };
console.log({ ...o1, ...o2 }); // spätere überschreiben
console.log({ ...o1, y: "neu" });
console.log([..."abc"], [...new Set([1, 1, 2])]);Ausgabe:
[ 1, 2, 3, 4, 5 ]
4
{ x: 1, y: 20, z: 3 }
{ x: 1, y: 'neu' }
[ 'a', 'b', 'c' ] [ 1, 2 ]Rest: Sammeln mit …
Rest sieht gleich aus, steht aber auf der Empfängerseite (Parameterliste oder Destructuring) und sammelt den Rest:
function erster(a, ...andere) { return [a, andere]; }
console.log(erster(1, 2, 3, 4));Ausgabe:
[ 1, [ 2, 3, 4 ] ]Praktische Muster
// Eigenschaft aus Objekt entfernen (ohne es zu verändern)
const { passwort, ...oeffentlich } = { name: "Mia", passwort: "geheim", rolle: "user" };
console.log(oeffentlich);
// Element in Liste ändern, ohne das Original zu verändern
const liste = [1, 2, 3];
const neu = [...liste.slice(0, 1), 99, ...liste.slice(2)];
console.log(liste, neu);
// Mehrere Rückgabewerte
const [min, max] = [Math.min(4, 2, 9), Math.max(4, 2, 9)];
console.log(min, max);
// Über Einträge iterieren
for (const [key, { preis }] of Object.entries({ a: { preis: 3 }, b: { preis: 5 } })) console.log(key, preis);Ausgabe:
{ name: 'Mia', rolle: 'user' }
[ 1, 2, 3 ] [ 1, 99, 3 ]
2 9
a 3
b 5Merke
const [a, b] = arrayundconst { x, y } = objektentpacken Werte- Umbenennen (
x: neu), Standardwerte (x = 1), Rest (...rest) - Spread
...verteilt Arrays/Objekte beim Erzeugen oder Aufrufen - Rest
...sammelt übrige Werte beim Empfangen - Mit Spread änderst du Daten, ohne das Original zu verändern
Übungsaufgabe
Schreibe eine Funktion, die ein Objekt mit x und y per Destructuring annimmt und {x, y} verschoben um ein Offset zurückgibt, ohne das Original zu verändern.
Quiz zur Selbstkontrolle
= [1, 2, 3]; für rest?
- [2, 3] (richtig)
- 2
- [1, 2]
- [3]
Was bewirkt { ...a, x: 1 }?
- Kopiert a und setzt/überschreibt x (richtig)
- Löscht x aus a
- Verändert a direkt
- Erzeugt einen Fehler
Wie benennst du beim Destructuring um?
- const { name: n } = obj (richtig)
- const { name as n } = obj
- const { n = name } = obj
- const { name > n } = obj
Weiter im Kurs
Zurück: Objekte
Weiter: Map, Set und WeakMap
Alle Kapitel: JavaScript im Überblick