Hackety hack hack

Atypisches Nutzerverhalten mit Rat und Tat.

Plötzlich Semikolon — Automatic Semicolon Insertion

Für ein Buch, an dem ich gerade arbeite, war der folgende Text zu lang und zu ausführlich. Wegwerfen wollte ich ihn aber nicht, so dass er hier im Blog landete, in dem schon lange nichts mehr aus dem Bereich Programmieren vorkam.

JavaScript und Semikolons

Das automatische Einfügen von Semikolons (Automatic Semicolon Insertion, ASI) ist eine der verwirrendsten und umstrittensten Eigenschaften von JavaScript. Die Regeln für das Einfügen von Semikolons beginnen im Sprachstandard ECMA 262 recht simpel: Wenn ein gültiges JavaScript-Statement von einem anderen gültigen JavaScript-Statement durch einen Zeilenumbruch (linefeed) oder das Zeichen ”}” getrennt wird, dann wird ein Semikolon vor dem Trennzeichen eingesetzt. Am Ende einer Zeile oder eines Blocks können Semikolons also normalerweise weggelassen werden.

Ein Semikolon kann zudem am Ende eines Programms weggelassen werden. Es muss also nicht als letztes Zeichen in der Datei stehen. Dies sind schon alle einfacheren Bedingungen für ASI. Es gilt zudem die Regel, dass ein Semikolon niemals automatisch eingefügt wird (und damit auch nicht weggelassen werden kann), wenn dadurch ein leeres Statement zustande käme. Auch in der Klammer mit den Bedingungen einer for-Schleife wird niemals automatisch ein Semikolon ergänzt.

Die Postfix-Ausdrücke ++ und -- und die Befehle continue, break, return und throw haben ihre eigenen Regeln. Wenn ++ oder -- als Postfix-Operator geparst werden können und sie vom vorhergehenden Zeichen durch einen Zeilenumbruch getrennt werden, dann fügt JavaScript vor ihnen ein Semikolon ein.

a = b
++c

wird also zu:

a = b;
++c;

Wenn bei continue, break, return und throw das nächste Zeichen erst nach einem Zeilenumbruch folgt, dann fügt JavaScript nach diesen Befehlen ein Semikolon ein.

return
a + b

wird demnach zu:

return;
a + b;

Rund um die ASI ist ein geradezu religiöser Streit in der JavaScript-Community entstanden. Ursprünglich dachte Brendan Eich, dass sich mit ASI die Anzahl der Fehler beim Parsen von Programmcode verringern lassen — JavaScript war schließlich für weniger versierte Programmiererinnen und Programmierer gedacht. Douglas Crockford, Autor des wahrscheinlich meistgelesenen JavaScript Stil-Handbuchs “JavaScript: The Good Parts” und einflussreicher Entwickler von Technologien wie JSON (JavaScript Object Notation, also der Serialisierung von Daten in JavaScript), empfiehlt, ASI vollständig zu missachten und jedes Statement einfach mit einem Semikolon abzuschließen, ohne auf die eingebaute Magie des Parsers zu vertrauen.

Demgegenüber steht das meist beobachtete Projekt auf Github, das Framework Twitter Bootstrap, das in seinem JavaScript-Code völlig auf Semikolons verzichtet. Crockford kommentierte das renommierte Bootstrap-Projekt in Hinblick auf seinen JavaScript-Komprimierer JSMin drastisch: ”That is insanely stupid code. I am not going to dumb down JSMin for this case. (…) Learn to use semicolons properly. ! is not intended to be a statement separator. ; is.””

Woraufhin der Bootstrap-Entwickler Jacob Thornton antwortete: ”I have learned to use them, that’s why there isn’t one present.

Aus praktischen Gründen empfiehlt es sich, sich hauptsächlich an Crockford zu halten. Allerdings sollten wir zur Kenntnis nehmen, dass es auch andere religiöse Ansichten zu Semikolons gibt, die wir zu respektieren haben.

Comments