Woher hat JavaScript seinen schlechten Ruf und inwiefern sind diese Vorurteile zutreffend?
Ich mach’s kurz: die Tatsache, dass man so etwas wie Typescript und Flow erfinden musste (die sich beide ziemlich großer Beliebtheit erfreuen) zeigt die zugrundeliegende Problematik.
Es gibt ein Paar Programmiermythen, auf die sich - überwiegend - Menschen aus dem akademischen Umfeld und Anfänger berufen. Die zwei hartnäckigsten:
Kürzer ist besser
Festes Typing ist doof
Zum Punkt 1: wenn die länge der Syntax der größte Kritikpunkt an einer Sprache ist, hat man den falschen Beruf gewählt. Es gibt objektiv gesehen deutlich wichtigere Sachen als Eleganz.
Zum Punkt 2: denkt mal ganz scharf darüber nach, was die Konsequenzen daraus sind. Es gibt eigentlich nur drei Fälle:
2.1: man benutzt dynamisch typisierte Dinge, um immer den gleichen Typ von Wert zuzuweisen. Damit ist es eigentlich egal, ob die Syntax drum rum dynamisch ist und wir kommen wieder bei punkt 1 an: “var s ist kürzer als String s” - Kindergarten.
2.2: man weist einer Variable verschiedene Typen zu. Das wiederum ist in der Praxis ganz oft eine sehr blöde Idee. Warum? Weil man ständig und überall prüfen muss, was denn nun für ein Wert drin ist. Ist es ein Objekt? Ist es eine Zahl? Ist es ein String? Ich wünschte ich würde jedes mal einen Euro bekommen, wenn ich einen parseFloat() Fehler suchen musste.
2.3: schlimmere Ausprägung von 2.2: man weiss nicht so genau, was in so eine Variable rein gehört und muss sich auf externe Dokumentation verlassen. Während eine API einer statisch typisierten Sprache zumindest was da angeht absolut selbsterklärend ist.
Aus Punkt zwei ergibt sich ein großes Problem, das auf lange Sicht in großen Projekten entsteht: Refactoring ist schwierig. Aus diesem Grund sind große Javascript Projekte/Produkte extrem komplex in der Wartung. Aber dafür gibt es jetzt eben Typescript und Flow…
Und bevor mich jetzt irgendwelche Fanboys auseinander nehmen:
JavaScript hat auch echt coole Aspekte, die ich persönlich sehr gerne mag. Beispielsweise ist JS eine multi-paradigm-Sprache. Man kann funktional, objektorientiert, im kern irgendwie auch prozedural, asynchron programmieren. Die Mischformen ermöglichen sehr, sehr ausgeklügelte Konstrukte, die in anderen Sprachen mit viel Aufwand verbunden sind.
Darüber hinaus ist ziemlich alles in Javascript ein mock object. Die Vererbungsmechanismen und Art und Weise, wie man Objekte zur Laufzeit manipulieren kann sind sehr bequem.