JavaScript 2021: Schwache Referenzen, beliebige Versprechen und neue Zuweisungen

Nach dem jüngsten Meeting des TC39 stehen die ersten fünf Neuerungen für den kommenden Standard ECMAScript 2021 fest.

In Pocket speichern vorlesen Druckansicht 12 Kommentare lesen
JavaScript 2021: Schwache Referenzen, beliebige Versprechen und neue Zuweisungen
Lesezeit: 4 Min.
Inhaltsverzeichnis

Das für die JavaScript-Standardisierung zuständige Technical Committee 39 (TC39) hat auf seinem virtuellen Meeting vom 20. bis 23. Juli vier Neuerungen für den kommenden ECMAScript 2021 festgelegt. Mit einer Ergänzung vom Juni haben fünf Features die vierte Stufe für Proposals erreicht und fließen somit in den kommenden Standard ein.

Die Funktionen finden sich zum Teil bereits in TypeScript und in der V8-Engine. Dass Microsofts Programmiersprache beziehungsweise Googles JavaScript-Engine dem Standard vorausgreifen ist durchaus üblich, zumal die Proposals beim TC39 mehrere Stufen durchlaufen und die Planung somit deutlich vor der Integration in den Standard bekannt ist.

Das Proposal WeakRefs führt allgemeine schwache Referenzen in JavaScript ein. Bisher existieren im Sprachstandard im Gegensatz zu anderen Programmiersprachen wie Python, PHP, Java oder C# keine Weak References, abgesehen von den Collections WeakMap und WeakSet.

Entwickler können Elemente damit als schwach referenziert deklarieren. Üblicherweise gelten alle Referenzen als stark, und jede Strong Reference auf ein Objekt verhindert, dass der Garbage Collector (GC) es aufräumt. Wenn jedoch ausschließlich Weak References auf ein Objekt existieren, darf der GC es entfernen. V8 hatte Anfang Juli in Version 8.4 das Sprachelement WeakRef eingeführt.

Seit diesem Jahr kennt ECMAScript Promise.All(iterable), mit dem sich eine Reihe zu erfüllender Voraussetzungen in asynchronem Code verbinden lassen. Es gilt als erfüllt (fullfilled), wenn alle Versprechen im Iterable-Objekt erfüllt sind, und als abgelehnt (rejected), sobald das erste darin abgelehnt wird.

Das nun auf Stufe 4 gehobene Proposal zu Promise.any(iterable) ist quasi das Gegenstück: Es gilt als erfüllt, sobald das erste der im Iterable-Objekt gegebenen Versprechen erfüllt ist. Sollten alle Promises darin zurückgewiesen werden, kommt das neue error-Objekt AggregateError zum Tragen. Googles V8 kennt das Konstrukt in dem derzeit jüngsten Release 8.5.

Die JavaScript-Engine hat in Version 8.5 mit String.prototype.replaceAll eine weitere Neuerung aus ECMAScript 2021 vorweggenommen. Es bietet einen einfachen Weg, alle Substrings in einer Zeichenkette zu ersetzen, ohne Reguläre Ausdrücke zu verwenden beziehungsweise den String zunächst über split aufzuteilen. Erstere haben den Nachteil, dass einige Zeichen spezielle Escape-Sequenzen erfordern, und letzteres Vorgehen erzeugt einen zusätzlichen Overhead.

// f�r einen String 
const queryString = 'q=query+string+parameters';

// entspricht das neue Vorgehen 
const withSpaces = queryString.replaceAll('+', ' ');

// der RegExp-Variante mit Escape-Zeichen
const withSpaces = queryString.replace(/\+/g, ' ');

// und der split-Variante
const withSpaces = queryString.split('+').join(' ');

Das Proposal für die Logical Assignment Operators kombiniert logische Und- beziehungsweise Oder-Operatoren, also && beziehungsweise || sowie den Nullish-Coalescence-Operator ?? mit einer Zuweisung. Sie entsprechen im Wesentlichen den mathematischen Zuweisungsoperatoren wie +=. Allerdings schlagen sie nur dann zu Buche, wenn die logische Operation tatsächlich den Wert verändert, während mathematische Zuweisungen immer zu einer Berechnung führen.

Relevant ist das Detail für den Fall, dass Getter oder Setter Seiteneffekte haben, die beim Ändern auftreten. Während der Zuweisungsoperator a += b; so arbeitet wie a = a + b;, entspricht a ||= b; einer mit Klammern eingefassten Schreibweise a || (a = b);. Die Logical Assignment Operators sind sowohl Bestandteil von dem derzeit als Beta verfügbaren TypeScript 4.0 als auch von der jüngsten V8-Variante.

Als fünfte Neuerung stehen die beinahe überfälligen Numeric Separators an: Numerische Literale dürfen Unterstriche für eine bessere Lesbarkeit enthalten. Die Syntax kennt V8 bereits seit der im Mai 2019 erschienen Version 7.5. Erlaubt sind die Unterstriche nicht nur für Dezimalzahlen wie 1_234_567, sondern auch für binäre wie 0b1010_0101_0001_1000, hexadezimale wie 0xAB_CD_00 und oktale Literale wie 0o1234_7654. Außerdem dürfen sie auch in BigInt-Literalen stehen.

Wer den Stand der kommenden Funktionen von ECMAScript im Auge behalten will, findet die auf Stufe 4 gehobenen Proposals in einem GitHub-Repository von TC39.

(rme)