JavaScript

Lesezeit: 7 Minuten

JavaScript ist eine interpretierte, dynamisch typisierte und ereignisorientierte Programmiersprache. JavaScript ermöglicht objektorientierte, funktionale und aspektorientierte Programmierung. Der erste Prototyp der Sprache wurde im Mai 1995, damals noch unter dem Namen Mocha, innerhalb von zehn Tagen von Brendan Eich entwickelt.

Brendan Eich wurde in den frühen Tagen des World Wide Web von Netscape beauftragt, eine Sprache zu entwickeln, die dynamisches Verhalten für die bis dato ausschließlich statischen Webseiten ermöglichen sollte. Im September 1995 wurde JavaScript – noch unter dem Namen LiveScript – erstmalig im Netscape Navigator ausgeliefert. Vermeintlich aus Marketinggründen, wegen der wachsenden Popularität der Sprache Java, wurde LiveScript zu JavaScript umbenannt. Bis auf die C-ähnliche Syntax hat JavaScript mit Java allerdings wenig gemeinsam. Vom Funktionsumfang her orientierte sich die Sprache eher an Scheme und setze auf die Prototyp-basierte Objektorientierung von Self.

Seit Juni 1997 wird JavaScript von der Ecma International (European Computer Manufacturers Association) als ECMAScript standardisiert, um die Interoperabilität von JavaScript in Webseiten zwischen verschiedenen Webbrowsern sicherzustellen.

Alleinstellungsmerkmale

JavaScript ist die Sprache des Webs und als clientseitige Skriptsprache in Webbrowsern weitestgehend alternativlos. Konkurrierende Technologien wie Adobe Flash und Java Applets konnten sich nicht dauerhaft durchsetzen und boten darüber hinaus auch keine vergleichbare Integration mit HTML und CSS wie JavaScript.

Neben dem offensichtlichen Einsatz von JavaScript für clientseitige Logik in Webseiten eignet sich JavaScript wegen seines ereignisorientierten Ansatzes auch für Serveranwendungen mit einem hohen Grad an Parallelität und für Echtzeitsysteme.

Einsatzbereiche

JavaScript findet sich auf so gut wie jeder Webseite. Neben klassischen Webseiten existieren JavaScript-Frameworks um sogenannten Single Page Applications (SPA) zu bauen, die aus nur einer einzigen Seite bestehen und durch den Einsatz von JavaScript dynamisch nachgeladen werden, um den Eindruck einer Desktop-Anwendung zu vermitteln. Populäre SPA-Frameworks sind unter anderem Angular, React, Vue.js, Ember.js und Svelte. Paypal, The Guardian und Weather.com setzen unter anderem Angular ein. Facebook, Instagram und Netflix setzen beispielsweise React ein. Alibaba, GitLab und Nintendo setzen auf Vue.js.

Node.js ist eine bekannte Laufzeitumgebung um Serveranwendungen in JavaScript zu schreiben. Unter anderem setzen Ebay, Groupon, LinkedIn, Netflix, Mozilla, Paypal, Uber und Yahoo Node.js ein.

Electron ist ein Framework zum Schreiben von plattformunabhängigen Desktop-Anwendungen in JavaScript. Unter anderem basieren Atom, Discord, Microsoft Teams, Slack und Visual Studio Code auf dem Electron-Framework.

NativeScript und ReactNative sind zwei bekannte Frameworks für die Entwicklung von Mobile-Apps mit JavaScript.

Pros

JavaScript ist eine sehr vielseitig einsetzbare Sprache, wie der Abschnitt Einsatzbereiche belegt. Für JavaScript allgmein sprechen die hohe Verbreitung und das riesige Ökosystem. Außerdem ist JavaScript quasi auf jedem Endgerät vorhanden, auf dem ein Webbrowser installiert ist. Einige Sprachen bieteten Unterstützung für Interoperabilität mit JavaScript. So gibt es in Java mit Rhino, Nashorn und zuletzt GraalVM mittlerweile den dritten Ansatz um JavaScript-Code aus Java heraus ausführbar zu machen. JavaScript ist leichtgewichtig und non-blocking und kann damit eine gute Wahl für einen Microservice sein, oder allgemein für einen Service, bei dem eine hohe Parallelität und die Interaktion mit Ressourcen im Vordergrund stehen.

Die Sprache bietet eine native JSON-Integration. Jedes Objekt kann als JSON dargestellt werden und umgekehrt. JavaScript ist sehr flexibel und bietet viele interessante Sprachfeatures, wie First-Class Functions und Closures, Pfeilfunktionen, die Spread-Syntax, Generatoren, Module und Klassen inklusive statischer Felder und Funktionen.

Als clientseitige Skriptsprache in Webbrowsern kann JavaScript ohne Netzwerklatenz ausgeführt werden und entlastet den Server.

Cons

JavaScript ist aufgrund seiner Ereignisorientierung eher weniger geeignet für klassische prozedurale Programme, in denen Interaktionen mit Ressourcen wie Datenbanken in einer fest vorgegebenen Reihenfolge zu erfolgen haben. In so einem Szenario findet man sich leicht in der Callback Hell wieder. Viele verschachtelte Callbacks wirken sich dabei negativ auf die Lesbarkeit des Codes aus. Die Prototyp-basierte Objektorientierung ist für Entwickler, die aus anderen objektorientierten Sprachen wie Java oder C++ kommen, erstmal ungewöhnlich.

Für CPU-lastige Aufgaben ist JavaScript eher weniger geeignet. Außerdem ist JavaScript single-threaded. Es muss aber angemerkt werden, dass Node.js mittlerweile experimentelle Unterstützung für Multithreading bietet. Alle Zahlen in JavaScript werden als 64bit-Fließkommazahlen betrachtet. Dabei ist JavaScript anfällig für Fließkommazahlenarithmetik-Fehler:

console.log((0.1 + 0.2) === 0.3); // false
console.log((1 + 2) === 3); // true

Bitweise Operationen werden in JavaScript hingegen mit 32bit-Binärzahlen durchgeführt, was zu unnötigem Hin- und Herkonvertieren führt. JavaScript hat eine Vielzahl von Eigenarten, an die man sich gewöhnen muss, z.B.:

console.log("10" - "1"); // 9
console.log("10" + "1"); // 101

Auf wtfjs.com – verlinkt am Ende des Beitrags – werden die diversen Eigenarten der Sprache gesammelt. Verlinkt wird weiter unten auch eine Liste der Sprachen, die nach JavaScript kompilieren. Ob man die lange Liste so interpretieren kann, dass sich viele Entwickler in anderen Sprachen wohler fühlen als in JavaScript, kann jeder für sich selbst entscheiden.

Als clientseitige Skriptsprache in Webbrowsern bringt JavaScript einige Nachteile mit sich. So gibt es trotz ECMAScript-Standardisierung subtile Unterschiede in verschiedenen Webbrowsern bzw. die Problematik der Unterstützung älterer Webbrowser und ECMAScript-Versionen. JavaScript ist im Webbrowser immer direkt sichtbar. Auch wenn viele Webbrowser sehr tolerabel gegenüber Fehlern sind, kann der Einsatz von JavaScript dazu führen, dass im Fehlerfall im Webbrowser nur eine weiße Seite angezeigt wird. Beim Einsatz komplexer JavaScript-Frameworks wie Angular liefert ein solcher Fehler oftmals kaum Hinweise auf die mögliche Ursache, so dass es ratsam ist nicht zu viele Dinge zur gleichen Zeit zu ändern.

Datenblatt

NameJavaScript
Webseitehttps://www.ecma-international.org/
Erscheinungsjahr1995
Aktuellste Version (Stand 25. April 2021)ECMAScript 2020 vom 16. Juni 2020
Typisierungdynamisch
Paradigmenimperativ
ereignisorientiert
objektorientiert
funktional
aspektorientiert
ProsCons
als clientseitige Skriptsprache im Web quasi konkurrenzlosTendenz zur Callback Hell
sehr hohe Verbreitungsingle threaded (Multithreading als experimentelles Feature in Node.js)
riesiges ÖkosystemPrototyp-Ansatz erfordert Umgewöhnung für Entwickler, die von Sprachen wie Java und C++ kommen
vielseitig einsetzbarwenig geeignet für CPU-lastige Aufgaben
gut für parallele, asynchrone Verarbeitungenviele Inkonsistenzen / Eigenarten im Code
non blockingAnfälligkeit für Fließkommazahlarithmetik-Fehler
native JSON-Integrationalle Zahlen sind 64bit-Fließkommazahlen
viele interessante Sprachfeaturesunnötiges Konvertieren bei bitweisen Operationen

virtuallet

virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum JavaScript-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.

- Multithreading in Node.js (experimentell)
- wtf.js - Eigenheiten von JavaScript
- Liste der Sprachen, die nach JavaScript kompilieren