Benutzer:Rolf b/ES6

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche
Die Programmiersprache JavaScript wurde 1995 von Brendan Eich bei der Firma Netscape für ihren Browser Netscape Navigator entwickelt. Sie hieß zuerst Mocha, dann LiveScript, und wurde schließlich in JavaScript umbenannt, um die Popularität der Sprache Java auszunutzen. Aber trotz vieler vordergründiger Ähnlichkeiten gibt es bedeutende Unterschiede zwischen diesen Sprachen.

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:

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

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

  • Webkrauts: Eine kurze Geschichte von JavaScript von Mathias Schäfer (03.12.2015)