Skip to content
tutorials

Ihr JavaScript ist veraltet.

Die Sprache entwickelt sich schneller, als Sie denken, und lässt gängige Muster und Workarounds hinter sich. Sie verwenden wahrscheinlich immer noch Hacks für Probleme, die JavaScript bereits vor Jahren – oder sogar Monaten – gelöst hat.

Dani Roth
Ihr JavaScript ist veraltet.

Die neuen Regeln der Array-Immutability

Modernes JavaScript erfordert Unveränderlichkeit (Immutability), insbesondere in Frameworks wie React, die auf stabilen Zustandsreferenzen basieren. Das direkte Mutieren eines Arrays mit Methoden wie sort() oder reverse() bricht diesen Vertrag, was zu unvorhersehbaren UI-Updates und schwer zu debuggenden Seiteneffekten führt. Diese traditionellen Methoden verändern das ursprüngliche Array direkt, was ein kritisches Anti-Pattern für ein robustes und wartbares State-Management darstellt.

Lösen Sie dieses Problem mit neuen unveränderlichen Gegenstücken. ECMAScript 2023 (ES14) führte toSorted() und toReversed() ein, die ein neues Array mit den Änderungen zurückgeben und das Quell-Array unangetastet lassen. Dies eliminiert unbeabsichtigte Seiteneffekte, vereinfacht Zustandsaktualisierungen und stellt vorhersehbare Component-Re-Renders in Ihrer gesamten Anwendung sicher.

Verbessern Sie die Array-Immutability weiter mit with(index, value). Diese Methode ersetzt ein Element an einem bestimmten Index sauber und gibt ein neues Array zurück, ohne das ursprüngliche zu mutieren. Sie bietet eine klare, deklarative Alternative zu umständlichen splice()-Aufrufen oder direkten arr[i] = val-Zuweisungen und fördert einen funktionaleren und weniger fehleranfälligen Programmierstil.

Übernehmen Sie diese unverzichtbaren Methoden jetzt. Sie wurden als Teil von ECMAScript 2023 (ES14) veröffentlicht und werden in modernen Runtimes vollständig unterstützt, einschließlich Chrome 110+, Firefox 115+, Safari 16+ und Node.js 20+. Aktualisieren Sie Ihre Array-Operationen für die moderne JavaScript-Entwicklung.

JSON.stringify ist tot für das Klonen

Geben Sie den JSON.parse(JSON.stringify(obj)) Deep-Cloning-Hack sofort auf. Diese Methode versagt bekanntermaßen bei komplexen Datentypen, konvertiert Date-Objekte in bloße Strings und verwirft Map- und Set-Daten vollständig, wodurch sie als leere Objekte zurückbleiben. Darüber hinaus kann sie nicht mit Funktionen, undefined, Infinity, NaN oder Objekten mit zirkulären Referenzen umgehen, was zu stillem Datenverlust oder Laufzeitfehlern führt.

Verwenden Sie stattdessen structuredClone(), die moderne, integrierte API. Diese definitive Lösung kopiert zuverlässig eine Vielzahl komplexer Datentypen, einschließlich Map, Set, Date, RegExp, ArrayBuffer, Blob und sogar ImageData. Entscheidend ist, dass structuredClone() auch Objekte mit zirkulären Graphen durchläuft und dupliziert, was robuste Deep-Copies ohne externe Bibliotheken oder benutzerdefinierte Serialisierungslogik ermöglicht.

Obwohl leistungsstark, hat structuredClone() geringfügige, spezifische Einschränkungen: Es können keine Funktionen, DOM-Knoten oder Eigenschaften mit benutzerdefinierten Gettern/Settern geklont werden. Für die überwiegende Mehrheit der Anwendungsdaten bietet es jedoch einen vollständigen und typgetreuen Klon. Machen Sie structuredClone() zu Ihrem Standard für 99 % der Deep-Cloning-Anwendungsfälle im modernen JavaScript, um Datenintegrität und einen vorhersehbaren Zustand zu gewährleisten.

Das Promise-Muster, auf das Sie gewartet haben

Lösen Sie Promises aus einem externen Scope ohne Boilerplate auf. Historisch gesehen bedeutete die Verwaltung der Auflösung eines Promise außerhalb seines Konstruktors, dass resolve und reject Variablen im Voraus deklariert werden mussten. Dieses Muster, das externe Variablenzuweisungen erfordert, überlädt den Code und macht die Promise-Steuerung undurchsichtig.

Beachten Sie das gängige Legacy-Muster:

let externalResolve, externalReject;
const externalPromise = new Promise((resolve, reject) => { externalResolve = resolve; externalReject = reject;
});
// Später in Ihrem Code...
externalResolve('Daten empfangen!');

Dieser Ansatz zwingt Sie dazu, interne Promise-Funktionen global oder über einen breiteren Scope hinweg offenzulegen, was das Potenzial für Missbrauch erhöht und den Kontrollfluss schwerer nachvollziehbar macht.

Hier kommt Promise.withResolvers(), eine neue statische Methode, die dies enorm vereinfacht. Eingeführt in ECMAScript 2024, gibt sie ein Objekt zurück, das das Promise, seine resolve-Funktion und seine reject-Funktion enthält. Keine Vorabdeklaration oder Scope-Leckage mehr.

Implementieren Sie Promise.withResolvers():

const { promise, resolve, reject } = Promise.withResolvers();
// ... jetzt kann 'promise' zurückgegeben und 'resolve'/'reject' an anderer Stelle aufgerufen werden.
resolve('Operation abgeschlossen.');

Diese Methode bereinigt asynchrone Muster drastisch, bei denen ein Promise auf einen externen Auslöser warten muss, wie etwa einen Klick auf eine Schaltfläche durch den Benutzer oder eine eingehende WebSocket-Nachricht. Sie ist verfügbar in Chrome 120+, Firefox 121+ und Node.js 21+. Für weitere grundlegende JavaScript-Details und sich entwickelnde Syntax konsultieren Sie Ressourcen wie Lexical grammar - JavaScript - MDN Web Docs. Nutzen Sie modernes JavaScript für eine sauberere, robustere asynchrone Steuerung.

Gefällt Ihnen der Artikel? Erhalten Sie jeden Morgen einen wie diesen per E-Mail.

eine E-Mail pro Tag · Abmeldung mit zwei Klicks · kein Tracking durch Dritte

Syntax-Geheimnisse, die im Verborgenen liegen

Verbessern Sie die Lesbarkeit von Zahlen durch numerische Trennzeichen, ein Feature von ES2021. Klären Sie sofort große Literale wie 1_000_000_000 im Vergleich zu 1000000000. Diese Syntax funktioniert für jede Zahlenbasis – dezimal, binär, oktal, hexadezimal und BigInts – ohne Performance-Einbußen. Unterstriche dürfen nicht am Anfang, am Ende oder neben einem Dezimalpunkt stehen, und zwei dürfen nicht hintereinander stehen. Wichtig: Dies ist eine rein visuelle Trennung im Code; das Parsen von Strings schlägt fehl, da Number('1_000') NaN zurückgibt und parseInt('1_000') 1 ergibt.

Übernehmen Sie mit markierten Anweisungen (labeled statements) die explizite Kontrolle über verschachtelte Schleifen. Deklarieren Sie myLoop: for (...), um einer äußeren Schleife ein Label zuzuweisen. Innerhalb jeder inneren Schleife beendet break myLoop; die gesamte markierte Struktur in einem einzigen, expliziten Schritt. Diese saubere Alternative eliminiert Boilerplate-Flag-Variablen für komplexe Kontrollfluss-Szenarien, verbessert die Code-Klarheit erheblich und reduziert potenzielle Fehler durch vergessene Breaks.

Dies sind keine obskuren Sprach-Eigenheiten für Quiz-Wettbewerbe. Nutzen Sie numerische Trennzeichen und markierte Anweisungen als praktische Werkzeuge, um selbsterklärenden, wartbaren Code zu schreiben. Konzentrieren Sie sich auf Entwickler-Ergonomie und Klarheit, damit Ihre JavaScript-Codebasis sofort verständlicher, robuster und für zukünftige Mitarbeiter leichter nachvollziehbar wird.

Häufig gestellte Fragen

Warum sind unveränderliche (immutable) Array-Methoden wie toSorted() wichtig?

Sie verhindern versehentliche Seiteneffekte, indem sie ein neues Array zurückgeben, anstatt das ursprüngliche zu verändern. Dies ist entscheidend für ein vorhersehbares State-Management in modernen Frameworks wie React, die auf Unveränderlichkeit angewiesen sind, um Änderungen zu erkennen.

Wann sollte ich structuredClone() anstelle des JSON.stringify-Hacks verwenden?

Fast immer. structuredClone() ist eine robuste, native API, die komplexe Datentypen wie Dates, Maps, Sets und sogar zirkuläre Referenzen korrekt verarbeitet. Der JSON-Hack zerstört diese Typen und sollte als veraltetes Anti-Pattern betrachtet werden.

Ist Promise.withResolvers() überall verfügbar?

Nein, es ist ein sehr neues ECMAScript 2024-Feature. Es wird in den neuesten Versionen der gängigen Browser (wie Chrome 119+) und Node.js (v22+) unterstützt. Überprüfen Sie immer Kompatibilitätstabellen, wenn Sie ältere Umgebungen unterstützen müssen.

Können numerische Trennzeichen beim Parsen von Strings verwendet werden?

Nein. Numerische Trennzeichen sind nur ein Feature für Zahlenliterale in Ihrem Quellcode. Der Versuch, einen String mit einem Unterstrich mittels Number('1_000') oder parseInt('1_000') zu parsen, führt zu NaN oder einem falschen Wert.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only