Der Spickzettel zum Sprachkern des Seminars JavaScript Grundlagen & Modernes ECMAScript — die Entscheidungsraster, die man im Editor danebenlegt. Für Debugging, Tests, Asynchronität, Module und Datenzugriff gibt es ein zweites Blatt: JavaScript in der Praxis.
Maßgeblich bleiben die MDN Web Docs für Sprachfeatures und die Node.js-Dokumentation für Node-eigene APIs. Dieses Blatt trifft die Auswahl, es ersetzt keine Referenz — und es bringt die Sprache nicht bei.
Begriffe: ECMAScript, Engine, Laufzeitumgebung
| Begriff | Bedeutung |
|---|---|
| ECMAScript | die Sprachspezifikation |
| JavaScript | die Sprache im praktischen Gebrauch |
| Engine | führt den Code aus: V8, JavaScriptCore, SpiderMonkey |
| Laufzeitumgebung | Engine plus zusätzliche APIs, etwa Node.js |
Der Sprachkern ist überall derselbe, die APIs drumherum nicht: Dateisystem gibt
es in Node.js, localStorage im Browser. „Steht im Standard” heißt deshalb noch
lange nicht „läuft überall” — die Verfügbarkeit gehört je Zielumgebung
nachgeschlagen (MDN für Sprache und Browser, caniuse.com für die Verbreitung,
ECMA-262 als letzte, verbindliche Instanz).
Modul: Einstieg in JavaScript & ECMAScript
Deklarationen: const, let, var
| Schlüsselwort | Verhalten und Empfehlung |
|---|---|
const | keine Neuzuweisung — Standardwahl für neuen Code |
let | Neuzuweisung erlaubt — wenn der Wert sich ändern soll |
var | ursprüngliche Form, überraschendes Verhalten — nur lesen, nicht schreiben |
const zuerst, let bei Bedarf, var nur beim Lesen fremden Codes erkennen.
Wichtig: const schützt die Bindung, nicht den Inhalt — der Inhalt eines
Objekts bleibt änderbar.
Modul: Syntax, Variablen und primitive Datentypen
Primitive Typen
| Typ | Wofür |
|---|---|
string | Text |
number | Ganz- und Kommazahlen |
bigint | Ganzzahlen jenseits des sicheren Bereichs |
boolean | true oder false |
undefined | kein Wert zugewiesen |
null | bewusst gesetzte Leere |
symbol | eindeutiger Wert, meist als Objektschlüssel |
Alles andere — Arrays, Maps, Funktionen, Datumswerte — sind Objekte. typeof
ist keine vollständige Typprüfung: Bei null meldet es aus historischen Gründen
"object".
Modul: Syntax, Variablen und primitive Datentypen
Wahrheitswerte: falsy und nullish
| Wert | Als Boolean | Einordnung |
|---|---|---|
null | false | nullish und falsy |
undefined | false | nullish und falsy |
0, 0n | false | nur falsy — oft ein gültiger Wert |
"" | false | nur falsy |
false | false | nur falsy |
NaN | false | nur falsy |
alles andere, auch "false" | true | — |
Daraus folgt die wichtigste Unterscheidung des Alltags: ?? greift nur bei
null und undefined, || bei allen falsy-Werten. Wer || als Fallback
benutzt, überschreibt die gültige 0 und die leere Zeichenkette; dasselbe gilt
für ||= gegenüber ??=. Ein leeres Array ist übrigens truthy.
Modul: Objekte, Typkonvertierung und moderne Syntax
Operatoren und Vergleiche
| Schreibweise | Verhalten |
|---|---|
wert++ | liefert den alten Wert, erhöht danach |
++wert | erhöht zuerst, liefert den neuen Wert |
wert-- / --wert | dasselbe verringernd |
Beim Vergleichen gilt: === statt == — die lose Gleichheit löst eine
Typumwandlung aus, die selten jemand beabsichtigt. Objekte vergleicht === über
die Referenz, nicht über den Inhalt. Und NaN === NaN ergibt false; dafür gibt
es Object.is.
Modul: Ausdrücke, Operatoren und Bedingungen
Welche Schleife wofür
| Form | Passend, wenn … |
|---|---|
for | die Anzahl bekannt ist oder ein Index gebraucht wird |
while | die Anzahl vorab offen ist |
do…while | der Block mindestens einmal laufen soll |
for…of | jeder Wert einer iterierbaren Sammlung dran ist |
for…in | die Schlüssel eines Objekts gefragt sind |
Merksatz: for…of liefert Werte, for…in liefert Schlüssel — auf ein Array
angewendet liefert for…in die Indizes, und zwar als Zeichenketten.
Bei switch wird strikt verglichen, break ist Pflicht, und der
default-Zweig fängt ab, was sonst stillschweigend durchrutscht.
Modul: Verzweigungen, Schleifen und Eingabeprüfung
Welche Datenstruktur wofür
| Struktur | Passend, wenn … |
|---|---|
| Array | die Reihenfolge zählt: eine Liste von Werten |
| Objekt | benannte Felder zählen: ein einzelner Datensatz |
| Map | nach Schlüsseln gesucht wird, Schlüssel jeden Typs |
| Set | jeder Wert nur einmal vorkommen soll |
Das Standardmuster ist die Kombination: ein Array aus Objekten. Ein Set kennt
size, nicht length; eine Map wird über get/set angesprochen, nicht über
die Punktschreibweise. Bei Objekten als Set-Werten zählt die Referenz, nicht die
Inhaltsgleichheit.
Für Mengenvergleiche gibt es union, intersection, difference,
symmetricDifference, isSubsetOf und isDisjointFrom — neuere
Sprachfeatures, deren Verfügbarkeit vor dem Produktiveinsatz zu prüfen ist.
Modul: Arrays, Objekte, Maps und Sets
Mutierend oder Kopie
| Verändert das Original | Liefert eine Kopie |
|---|---|
sort() | toSorted() |
reverse() | toReversed() |
splice() | toSpliced() |
arr[0] = wert | with(0, wert) |
push, pop, unshift, shift | Spread in ein neues Array |
Die rechte Spalte ist in modernem Code die Standardwahl. Der klassische Fehler ist ein geteiltes Array, das an einer Stelle sortiert wird und an einer anderen plötzlich anders aussieht. Und: Spread kopiert flach — verschachtelte Objekte bleiben geteilt.
Modul: Arrays, Objekte, Maps und Sets
Array-Methoden: welche Frage sie beantworten
| Methode | Beantwortet … |
|---|---|
forEach | tue etwas mit jedem Eintrag — kein Rückgabewert |
map | ein Ergebniswert je Eintrag |
filter | alle Einträge, auf die die Bedingung zutrifft |
find | der erste Treffer, sonst undefined |
some | trifft es auf mindestens einen zu? |
every | trifft es auf alle zu? |
reduce | alles zu einem einzigen Wert zusammenfassen |
reduce ist mächtig und schnell unlesbar — passt eine andere Methode, ist sie
die bessere Wahl. Fürs Gruppieren: Object.groupBy bei Zeichenketten-Schlüsseln,
Map.groupBy bei anderen Typen und wenn die Durchlaufreihenfolge zählt,
reduce nur, wenn die Zielumgebung die neuen Methoden nicht kennt.
Module: Funktionale Muster, Rekursion und Lazy Evaluation · Gruppieren, Iterieren und Datenfluss
Funktionen, Gültigkeitsbereich, Closures
| Eigenschaft | Verhalten |
|---|---|
| Deklaration | gehoistet — vor der Definition aufrufbar |
| Ausdruck | folgt const/let — vorher nicht aufrufbar |
| beide | erzeugen eine ganz normale Funktion |
| Ebene | Sichtbar … |
|---|---|
| global | im gesamten Programm — sparsam verwenden |
| Modul | nur innerhalb der eigenen Moduldatei |
| Funktion | nur innerhalb der Funktion |
| Block | nur zwischen den geschweiften Klammern |
Innere Bereiche sehen die äußeren, umgekehrt gilt das nicht. Eine Closure
entsteht, wenn eine Funktion sich Werte aus dem Bereich merkt, in dem sie erzeugt
wurde — auch nachdem die äußere Funktion beendet ist. Pfeilfunktionen binden
this nicht selbst und sind deshalb kein vollwertiger Ersatz für jede Funktion;
ein implizit zurückgegebenes Objektliteral braucht runde Klammern:
(b) => ({ name: b.name }).
Modul: Funktionen, Gültigkeitsbereiche und Closures
Typische Fallen
||als Fallback überschreibt die gültige0und""— dafür ist??da.- Zuweisung ist keine Kopie. Zwei Namen zeigen aufs selbe Objekt; Spread kopiert nur die oberste Ebene.
typeof nullmeldet"object", undtypeofauf ein Array ebenfalls — dafür gibt esArray.isArray.lengthist eine Eigenschaft, keine Methode; bei Sets heißt siesize.replaceersetzt nur den ersten Treffer —replaceAlloder dasg-Flag.- JSON kennt keine Funktionen und keine Datumsobjekte. Ein Datum kommt als
Zeichenkette zurück,
undefinedund Funktionen fallen weg. - Monate zählen ab null. Wer wie im Alltag ab eins zählt, liegt einen Monat daneben.
?.überall setzen schaltet echte Fehler stumm.- Rest gehört an die letzte Stelle — sonst ist es ein Syntaxfehler.
for…inauf Arrays liefert Indizes als Zeichenketten, nicht die Werte.findIndexliefert-1, wenn nichts passt — ungeprüft wird daraus ein falscher Index.- Ein Iterator ist nach dem ersten Durchlauf erschöpft, und ohne
toArraygibt man ihn statt einer Liste weiter. - Der Basisfall der Rekursion fehlt schnell — dann läuft der Aufrufstapel über.
- Kommazahlen für Geldbeträge sammeln Rundungsfehler;
numberundBigIntlassen sich nicht in einer Rechnung mischen.