Benutzer:Rolf b/ES6
- 10-15min
- mittel
- Kenntnisse in
● JavaScript
Inhaltsverzeichnis
Was ist JavaScript
Bei JavaScript handelt es sich um eine interpretierte Sprache. Der vom Parser eingelesene Programmcode wird in eine Folge von Codebytes übersetzt, die noch kein Maschinencode sind (der vom Computer direkt ausgeführt werden kann), aber eine maschinennahe Darstellung der auszuführenden Aktionen bildet. Diese Vorgehensweise findet man auch bei Sprachen wie Java oder PHP. Der so entstandene Bytecode wird dann von der JavaScript-Engine interpretiert. Moderne JavaScript-Implementierungen übersetzen diesen Bytecode vor der eigentlichen Programmausführung in echten Maschinencode (JIT, oder just-in-time Compilierung), wie es auch Java und PHP tun. Die Flexibilität, die JavaScript im Umgang mit Daten und Objekten anbietet, verhindert allerdings, dass Ausführungsgeschwindigkeiten wie bei C++ erreicht werden.
Außer in Ihrem Browser finden sich JavaScript-Engines auch an anderen Stellen. Beispielsweise enthält der Adobe Acrobat Reader eine solche Engine. Es gibt eine PHP-Extension, die die JavaScript V8-Engine von Google integriert. Und mit node.js wurde V8 in eine vollständige Programmierumgebung integriert, mit der sich Webserver oder Tools für die Softwareentwicklung schreiben lassen.
Die ersten Jahre
JavaScript war ursprünglich eine firmeninterne Angelegenheit von Netscape, und Netscape legte fest, was zum „offiziellen“ Sprachumfang gehörte und was nicht [1]. Microsoft implementierte, um im Browserkrieg mit Netscape nicht zurückzubleiben, eine durch reverse-engineering entstandene Version dieser Sprache als JScript in den Internet Explorer. Andererseits war Netscape auch daran interessiert, eine standardisierte Sprache anbieten zu können und wandte sich zu diesem Zweck an den europäische Computerherstellerverband Ecma International, der 1997 den ersten ECMASCript Sprachstandard (ECMA-262) herausgab. Dieser Standard wurde als JavaScript 1.3 im Netscape Navigator 4.06 und in Internet Explorer 4.0 implementiert.
1999 folgte der zunächst letzte Entwicklungsschritt zu ECMAScript 3 (ES3). Diese Sprachversion führte reguläre Ausdrücke ein, Fehlerbehandlung mit try und catch, JSON-Unterstützung, verbesserte Objektliterale und Funktionsausdrücke. Damit definierte diese Sprachversion für viele Jahre, was JavaScript im Web war, denn der Entwurf der nächsten geplanten Sprachversion ES4 wurde ein Opfer des Browserkriegs und des Niedergangs von Netscape, und wurde abgebrochen.
In dieser Zeit entstanden wichtige JavaScript-Bibliotheken wie jQuery, die die Implementierungsunterschiede von JavaScript und JScript überbrückten. jQuery ist auch heute noch weit verbreitet, auch wenn der Bedarf dafür nicht mehr existiert.
Der Aufstieg von Google und die Entwicklung der V8 Engine führte zu einem neuen Standardisierungsschub, der 2009 zur Veröffentlichung von ECMAScript 5 führte. Die wichtigste Neuerung dieser Version war der strikte Modus, der einige schlecht designte Features von ES3 deaktiviert und Deklaration von Variablen erzwingt. Hinzu kamen Methoden wie trim für Strings, forEach für Arrays, Unterstützung für JSON und eine get/set-Syntax für Eigenschaften in Objektliteralen. Fast unbemerkt blieb die Möglichkeit, auch nach dem letzten Eintrag in einem Array- oder Objektliteral ein Komma setzen zu können. Vorher war das ein Syntaxfehler und bereitete viel Kummer beim Umstellen oder Erweitern von Array- und Objektliteralen.
ECMAScript Harmony
ECMAScript 5 war ein kleiner Schritt, um überhaupt zu einer neuen Version des Standards zu kommen und eine Ausgangsbasis für die weitere Entwicklung zu schaffen.
Viele der in ES4 geplanten Neuerungen, für die keine Einigung erzielt werden konnten, gingen 2008 in das Projekt „ECMAScript Harmony“ ein. Es dauerte bis 2015, bis dieses Projekt das nächste größere Update der Sprache hervorbrachte: ES6, oder ECMAScript 2015. Seitdem ist es gelungen, den Standard jährlich fortzuschreiben, so dass die Sprache nach und nach weiter ausgebaut wird. Die jeweiligen Standardversionen tragen die Jahreszahl ihres Erscheinens im Namen.
ECMAScript 2015
ECMAScript 2015 erschien nach einem längeren Änderungsstau und führte daher viele Neuerungen ein, die vor allem auf die Erstellung von größeren Systemen abzielen. Dazu gehören:
- Passgenauere Variablendeklaration mit const und let
- ein in die Sprache integriertes Modulsystem
- eine neue Syntax zur Deklaration von Klassen, die eine aus anderen Sprachen vertraute Syntax auf das prototypische Vererbungkonzept von JavaScript abbildet
- Syntax zur Implementation von pseudo-nebenläufigen Vorgängen: Iteratoren, Generatoren (yield) und die For...of-Schleife, um iterierbare Objekte durchlaufen zu können
- Funktionen ohne
this
-Bindung: Pfeilfunktionen - Verbessertes Handling von asynchronen Vorgängen mit Promises
- Konstruktion von Zeichenketten mit Template-Literalen.
ECMAScript 2016
- Block-Scope als neue Scope-Ebene
- Spezifikation von tail calls (Endrekursionen) zur besseren Unterstützung funktionaler Programmierung. Bisher wurde dieser Teil der Spezifikation aber nur in Safari umgesetzt
- Destrukturierungsmuster - sehr nützlich beim Auslesen von mehreren Werten aus einem Objekt
- Der Potenzoperator
**
- Syntaxzucker für Promises mit async und await, allerdings noch mit einigen Funktionslücken
ECMAScript 2017
- async-Generatoren - Generatorfunktionen, in denen await verwendet werden kann und deren Iterable-Implementierung Promises auf die Iteratorwerte liefert
- Shared Memory (geteilter Speicher zwischen Web Workern)
- Die Atomics-Klasse mit statischen Methoden zur Threadsynchronisation. Atomics werden benötigt, wenn ein JavaScript-Programm Worker startet und sich mit ihnen Speicher teilt. Der Anwendungsfall für Atomics liegt eher in Serverprozessen (z.B. node.js) als im Browser.
ECMAScript 2018
- Rest und Spread-Operationen mit
...
. Rest und Spread erlaubt das Umdeuten eines Objekts oder Arrays in eine Liste von Werten und umgekehrt. - finally-Callback bei Promises
- Erweiterungen bei RegExp
- Die for await ... of Schleife, um synchrone und asynchrone Iteratoren gleichermaßen verarbeiten zu können
ECMAScript 2019
Die Sprachversion von 2019 brachte nur kleine Änderungen.
- Methoden flat und flatMap für Arrays
- Änderung des Algorithmus von Array.prototype.sort, er garantiert jetzt eine stabile Sortierung (d.h. wenn zwei Arraywerte den gleichen Sortierschlüssel haben, bleibt ihre Reihenfolge garantiert erhalten)
- Die Angabe einer Variablen hinter catch wird optional
ECMAScript 2020
- Einführung des BigInt-Datentyps (Integers beliebiger Länge)
- globalThis
- Verbessertes Handling von Null-Werten durch den nullish-coalescing Operator
??
und das optional chaining mit?.
.
ECMAScript 2021
- replaceAll für Strings
- Promise.any - ein Promise-Kombinator, der erfüllt ist, sobald das erste abhängige Promise sich erfüllt
- AggregateError - um mehrere Error-Bedingungen auf einmal zu repräsentieren
- Logische Operationen mit Zuweisung:
??=
,&&=
und||=
- Schwache Referenzen: die WeakRef Klasse, die ein Objekt referenzieren kann, ohne den Garbage Collector daran zu hindern, das Objekt freizugeben
- Die FinalizationRegistry, womit man Finalisierer für Objekt erzeugen kann, wenn der Garbage Collector sie abräumt
ECMAScript 2022
- Einführung von top-level await in ECMAScript-Modulen, d. h. man kann auch auf oberster Ebene in einem Modul await benutzen und muss den Code nicht in eine async-Funktion einhüllen
- Private Eigenschaften und Methoden von Klassen
- statische Initialisierer
- Abfrage auf die Existenz privater Eigenschaften mit
#x in obj
- die at-Methode für Strings und Arrays, die negative Indizes erlaubt, um relativ zum Ende zu adressieren
- Die Methode
Object.hasOwn
, als Ersatz für Object.prototype.hasOwnProperty
ECMAScript 2023
- Einführung der Methoden toSorted, toReversed, with, findLast, and findLastIndex methods auf Array.prototype and TypedArray.prototype
- Einführung von toSpliced auf Array.prototype;
- Unterstützung von #! Kommentaren (Shebang) am Anfang von JavaScript-Dateien, um unter Linux das direkte Ausführen von JavaScript Programmen mit node.js zu unterstützen
- Die meisten Symbole können als Schlüssel in schwachen Collections verwendet werden
Weblinks
- https://tc39.es/ecma262/multipage/#sec-intro ECMAScript® Language Specification (aktuelle Edition)