Start / Cheat Sheets

Cheat Sheet

JavaScript Sprachkern — Cheat Sheet

Stand: · JavaScript Grundlagen & Modernes ECMAScript

JavaScriptECMAScriptDatenstrukturenClosures

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

BegriffBedeutung
ECMAScriptdie Sprachspezifikation
JavaScriptdie Sprache im praktischen Gebrauch
Engineführt den Code aus: V8, JavaScriptCore, SpiderMonkey
LaufzeitumgebungEngine 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üsselwortVerhalten und Empfehlung
constkeine Neuzuweisung — Standardwahl für neuen Code
letNeuzuweisung erlaubt — wenn der Wert sich ändern soll
varursprü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

TypWofür
stringText
numberGanz- und Kommazahlen
bigintGanzzahlen jenseits des sicheren Bereichs
booleantrue oder false
undefinedkein Wert zugewiesen
nullbewusst gesetzte Leere
symboleindeutiger 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

WertAls BooleanEinordnung
nullfalsenullish und falsy
undefinedfalsenullish und falsy
0, 0nfalsenur falsy — oft ein gültiger Wert
""falsenur falsy
falsefalsenur falsy
NaNfalsenur 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

SchreibweiseVerhalten
wert++liefert den alten Wert, erhöht danach
++werterhöht zuerst, liefert den neuen Wert
wert-- / --wertdasselbe 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

FormPassend, wenn …
fordie Anzahl bekannt ist oder ein Index gebraucht wird
whiledie Anzahl vorab offen ist
do…whileder Block mindestens einmal laufen soll
for…ofjeder Wert einer iterierbaren Sammlung dran ist
for…indie 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

StrukturPassend, wenn …
Arraydie Reihenfolge zählt: eine Liste von Werten
Objektbenannte Felder zählen: ein einzelner Datensatz
Mapnach Schlüsseln gesucht wird, Schlüssel jeden Typs
Setjeder 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 OriginalLiefert eine Kopie
sort()toSorted()
reverse()toReversed()
splice()toSpliced()
arr[0] = wertwith(0, wert)
push, pop, unshift, shiftSpread 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

MethodeBeantwortet …
forEachtue etwas mit jedem Eintrag — kein Rückgabewert
mapein Ergebniswert je Eintrag
filteralle Einträge, auf die die Bedingung zutrifft
findder erste Treffer, sonst undefined
sometrifft es auf mindestens einen zu?
everytrifft es auf alle zu?
reducealles 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

EigenschaftVerhalten
Deklarationgehoistet — vor der Definition aufrufbar
Ausdruckfolgt const/let — vorher nicht aufrufbar
beideerzeugen eine ganz normale Funktion
EbeneSichtbar …
globalim gesamten Programm — sparsam verwenden
Modulnur innerhalb der eigenen Moduldatei
Funktionnur innerhalb der Funktion
Blocknur 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ültige 0 und "" — dafür ist ?? da.
  • Zuweisung ist keine Kopie. Zwei Namen zeigen aufs selbe Objekt; Spread kopiert nur die oberste Ebene.
  • typeof null meldet "object", und typeof auf ein Array ebenfalls — dafür gibt es Array.isArray.
  • length ist eine Eigenschaft, keine Methode; bei Sets heißt sie size.
  • replace ersetzt nur den ersten TrefferreplaceAll oder das g-Flag.
  • JSON kennt keine Funktionen und keine Datumsobjekte. Ein Datum kommt als Zeichenkette zurück, undefined und 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…in auf Arrays liefert Indizes als Zeichenketten, nicht die Werte.
  • findIndex liefert -1, wenn nichts passt — ungeprüft wird daraus ein falscher Index.
  • Ein Iterator ist nach dem ersten Durchlauf erschöpft, und ohne toArray gibt 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; number und BigInt lassen sich nicht in einer Rechnung mischen.

Zum Seminar JavaScript Grundlagen & Modernes ECMAScript