ECMAScript 2025: spannende neue JavaScript-Features im Überblick
Von Promise.try() bis Pattern Matching – die wichtigsten Neuerungen für moderne JavaScript-Entwicklung
ECMAScript definiert offiziell, wie JavaScript funktioniert – von Syntax bis Verhalten. Jedes Jahr im Juni bringt das TC39-Komitee neue Funktionen. 2025 stehen viele interessante Erweiterungen an – von besserer Asynchronität bis zu besseren Modulen, neuen Datentypen und Lesbarkeitsverbesserungen.
Promise.try()
Mit Promise.try() startet jede Funktion, ob sie einen Promise zurückgibt oder nicht, gleichgültig async. Damit vermeiden Sie if/else oder Promise.resolve()-Konstrukte – besonders praktisch in gemischten Codebasen mit Legacy-APIs.
const result = await Promise.try(() => maybeAsyncCall());
Neue Set-Methoden
Sieben neue Methoden auf Set.prototype erlauben mathematische Operationen:
intersection,union,difference,symmetricDifferenceisSubsetOf,isSupersetOf,isDisjointFrom
Ideal, um Mengen wie aktive/nicht aktive Nutzer klar und selbstbeschreibend zu vergleichen – weniger Filterchaos in Arrays!
const a = new Set([1, 2, 3]);
const b = new Set([3, 4, 5]);
console.log(a.union(b)); // Set {1, 2, 3, 4, 5}
console.log(a.intersection(b)); // Set {3}
console.log(a.difference(b)); // Set {1, 2}
Regex-Verbesserungen
Drei Verbesserungen für reguläre Ausdrücke:
- RegExp.escape(): escaped sicher Nutzereingaben – ideal bei dynamisch erzeugten Patterns
- Inline Modifier:
(?i:...)erlaubt lokale Flag-Änderung (z. B. nur Case-Insensitive für einen Teil) - Duplicate Named Groups: dieselben Group-Namen in alternativen Pfaden erlaubt
const escaped = RegExp.escape("user.name");
const re = new RegExp(`^${escaped}$`);
// Inline Modifier
const pattern = /(?i:hello) world/; // nur "hello" case-insensitive
Import Attributes & JSON/CSS Module
Die neue Import-Syntax erlaubt den Import verschiedener Formate mit Attributen:
import config from "./config.json" with { type: "json" };
Und experimentell:
import styles from "./button.css" with { type: "css" };
Das bringt native Modularisierung – ohne Bundler.
Iterator Helpers
Generatoren erhalten Methoden wie:
map(), filter(), take(), drop(), flatMap(), reduce(), toArray()
Ideal zur lazy Verarbeitung großer Datenmengen – ähnlich wie Array.prototype, aber speicherschonend und nativ.
function* numbers() {
yield* [1, 2, 3, 4, 5, 6];
}
const evenSquares = numbers()
.filter(n => n % 2 === 0)
.map(n => n ** 2)
.toArray(); // [4, 16, 36]
Float16Array & DataView Methods
Neu sind 16-Bit Fließkommazahlen:
Float16ArrayDataView.getFloat16()/setFloat16()Math.f16round()
Wichtig für GPU-optimierten Code, KI-Anwendungen oder WebGL.
const buffer = new ArrayBuffer(2);
const view = new DataView(buffer);
view.setFloat16(0, 3.14159);
console.log(view.getFloat16(0)); // ~3.14
String.prototype.isWellFormed() & toWellFormed()
Mit diesen Methoden können Sie String-Validität nach Unicode prüfen und korrigieren:
const broken = "\uD800"; // unvollständiges Surrogat
console.log(broken.isWellFormed()); // false
console.log(broken.toWellFormed()); // ersetzt durch U+FFFD
Nützlich beim Umgang mit JSON, Datenimport oder UI-Rendering.
Atomics.waitAsync()
SharedArrayBuffer kann jetzt non-blocking synchronisiert werden – z. B. für WebWorker oder WebAssembly mit Nebenläufigkeit.
await Atomics.waitAsync(typedArray, 0, 0).value;
Keine Blockade mehr im Main Thread.
Generator-Abbrüche mit Signal
Async-Generatoren können jetzt kontrolliert mit einem AbortSignal abgebrochen werden – ideal für UI-Interaktionen oder lang laufende Streams.
async function* fetchPages(signal) {
while (!signal.aborted) {
yield await getPage();
}
}
Neue Features zusätzlich in ES2025
Hier sind weitere Features, die 2025 voraussichtlich standardisiert werden oder sich in fortgeschrittener Phase befinden:
Immutable Records & Tuples
Immutable Objekte und Arrays – tief eingefroren und mit Wertgleichheit (=== bei gleichem Inhalt):
const rec = #{ name: "Alice", age: 30 };
const tup = #[1, 2, 3];
Pattern Matching (Match Expressions)
Ein Match-Statement ersetzt komplexe switch oder if-Kaskaden:
const res = match (user) {
{ role: "admin" } => "Vollzugriff",
{ role: "guest" } => "Leserechte",
_ => "Keine Rechte"
};
Pipeline Operator |>
Leserliche Funktionsketten – deklarativ statt verschachtelt:
const result = user
|> normalize
|> enrich
|> saveToDB;
DurationFormat (Intl)
Zeiträume lokalisieren – als Ergänzung zu Intl.DateTimeFormat:
const fmt = new Intl.DurationFormat("de-DE");
console.log(fmt.format({ hours: 2, minutes: 30 })); // "2 Std. 30 Min."
Type Annotations (experimentell)
Optional typisierte Syntax – mit späterem Nutzen durch Linter oder Tools, aber kein neues Type-System:
function greet(name: string): string {
return `Hallo, ${name}`;
}
Observables (Stage 1+)
Reaktive Streams – mit nativem Observer/Subscription-Pattern ähnlich RxJS:
const stream = new Observable(subscriber => {
subscriber.next("Hello");
subscriber.complete();
});
Schlussgedanke
ECMAScript 2025 bringt gezielt Verbesserungen für:
- Async/Lazy-Arbeit:
Promise.try(), Iterator Helpers,waitAsync(), Generator-Signals - Modularität & Serialisierung: Import Attributes, JSON/CSS, DurationFormat
- Lesbaren & wartbaren Code: Set-Methoden, Regex-Verbesserungen, Pattern Matching
- Leistungsoptimierung & Datenverarbeitung: Float16, Observables, Records & Tuples
- Künftige Typsicherheit: Type Annotations
Diese Features zeigen, dass JavaScript weiterhin in Richtung einer mächtigeren, aber gleichzeitig eleganteren Sprache entwickelt wird. Besonders die Kombination aus Performance-Optimierungen und verbesserter Entwicklererfahrung macht 2025 zu einem spannenden Jahr für die JavaScript-Community.