JS · Visuelle Erklärung

JavaScript – verstehen, nicht nur benutzen

Vom ersten let bis zur Event Loop: Typen und Gleichheit, Scope und Closures,this, Prototypen, Promises und async/await – interaktiv, Schritt für Schritt, auf dem Stand von ECMAScript 2026.

🗺️Kapitel

Du kannst der Reihe nach vorgehen oder direkt springen. Jede Seite enthält Visualisierungen zum Anklicken und Durchsteppen.

🧠Wie JavaScript läuft – das Modell in einem Bild

Die Engine (z. B. V8, SpiderMonkey, JavaScriptCore) führt Code auf genau einem Call Stack aus. Alles Asynchrone erledigt die Umgebung (Browser oder Node.js) und meldet sich über Warteschlangen zurück.
┌──────────── JavaScript-Engine ────────────┐   ┌──── Umgebung (Browser/Node) ────┐
│  Heap (Objekte)        Call Stack         │   │  Timer · fetch · DOM-Events     │
│  ┌─────────────┐       ┌──────────────┐   │   │  (Web-APIs bzw. libuv)          │
│  │ {…}  [ … ]  │       │ innen()      │   │   └───────────────┬─────────────────┘
│  │   ƒ   "…"   │       │ aussen()     │   │                   │ fertig → Callback
│  └─────────────┘       │ Skript       │   │                   ▼
│                        └──────▲───────┘   │   ┌─ Microtask-Queue ─┐ ┌─ Task-Queue ──┐
└───────────────────────────────┼───────────┘   │ then · await ·    │ │ setTimeout ·  │
                                │               │ queueMicrotask    │ │ Events · I/O  │
                                └── Event Loop ─┴───── zuerst ──────┴─┴── danach ─────┘

1. Synchroner Code läuft komplett durch – nichts unterbricht ihn.

2. Ist der Call Stack leer, leert die Event Loop die Microtask-Queue vollständig.

3. Dann holt sie einen Task (z. B. einen abgelaufenen Timer) – und danach wieder alle Microtasks.

4. Im Browser wird zwischendurch gerendert. Ein langer synchroner Block friert deshalb die Seite ein.

Im Debugger ansehen →

🆕Neu in ECMAScript 2025 und 2026

Jedes Jahr im Juni verabschiedet Ecma eine neue Ausgabe. Aufgenommen wird, was im TC39-Prozess Stufe 4 erreicht hat. Ob dein Browser die Funktion schon kann, wird live geprüft.

RegExp.escape

nicht prüfbar

Text sicher in einen regulären Ausdruck einbauen – Sonderzeichen werden maskiert.

1RegExp.escape("1.5 + 2");
Ergebnis: "\\x31\\.5\\x20\\+\\x202"

Array.fromAsync

nicht prüfbar

Wie Array.from, aber für asynchrone Iterables – liefert ein Promise auf das Array.

1async function* quelle() { yield 1; yield 2; }
2await Array.fromAsync(quelle());
Ergebnis: [1, 2]

Error.isError

nicht prüfbar

Erkennt echte Error-Objekte zuverlässig – auch aus anderen Realms (iframes), anders als instanceof.

1Error.isError(new TypeError());
2Error.isError({ message: "x" });
Ergebnis: true · false

Math.sumPrecise

nicht prüfbar

Summiert ohne Zwischenrundungsfehler.

10.1 + 0.2 + 0.3;
2Math.sumPrecise([0.1, 0.2, 0.3]);
Ergebnis: 0.6000000000000001 · 0.6

Uint8Array ↔ Base64/Hex

nicht prüfbar

Bytes direkt in Base64 bzw. Hex umwandeln und zurück.

1new Uint8Array([72, 97, 108, 108, 111]).toBase64();
2Uint8Array.fromBase64("SGFsbG8=");
Ergebnis: "SGFsbG8=" · Uint8Array [72, 97, 108, 108, 111]

Iterator.concat

nicht prüfbar

Mehrere Iterables hintereinander als einen Iterator durchlaufen.

1[...Iterator.concat([1, 2], [3])];
Ergebnis: [1, 2, 3]

JSON.parse mit Quelltext

nicht prüfbar

Der Reviver bekommt den Original-Text – große Zahlen gehen nicht mehr verloren.

1JSON.parse("12345678901234567890", (k, v, ctx) => ctx.source);
Ergebnis: "12345678901234567890"

Map.prototype.getOrInsert (Upsert)

nicht prüfbar

Wert holen oder – falls noch nicht vorhanden – einfügen, in einem Schritt.

1const m = new Map();
2m.getOrInsert("a", 1);
3m.getOrInsert("a", 2); // bleibt 1
Ergebnis: 1

🕰️Zeitleiste

1995
JavaScript

Brendan Eich entwickelt die Sprache in 10 Tagen für Netscape.

1997
ES1

Erster ECMA-Standard (ECMA-262).

2009
ES5

Strict Mode, JSON, Array-Methoden wie forEach/map/filter.

2015
ES2015 (ES6)

let/const, Arrow-Funktionen, Klassen, Module, Promises, Destructuring, Template-Literals.

2017
ES2017

async/await.

2020
ES2020

Optional Chaining ?., Nullish Coalescing ??, BigInt, Promise.allSettled.

2022
ES2022

Top-level await, private Felder #x, .at().

2023
ES2023

toSorted, toReversed, with, findLast.

2024
ES2024

Object.groupBy, Promise.withResolvers.

2025
ES2025

Iterator-Helfer, Set-Methoden, Promise.try, JSON-Module.

2026
ES2026

RegExp.escape, Array.fromAsync, Error.isError, Math.sumPrecise, Base64.