console.log(6 * 7);
42
undefined
Die erste Zeile der Ausgabe ist der Seiteneffekt des Aufrufs von console.log, die zweite ist der Rückgabewert des Methodenaufrufs. Wie bereits erwähnt, gibt console.log den Wert undefined zurück.
2.2Semikolonergänzung
In JavaScript müssen bestimmte Anweisungen mit einem Semikolon abgeschlossen werden, vor allem Variablendeklarationen, Ausdrucksanweisungen und nichtlineare Steueranweisungen (break, continue, return und throw). Allerdings ergänzt JavaScript die erforderlichen Semikolons für Sie.
Die Grundregel dafür ist einfach: Bei der Verarbeitung einer Anweisung nimmt der Parser jedes Token darin auf, bis er auf ein Semikolon oder ein ungültiges Token stößt, also eines, das nicht als Teil der Anweisung gedeutet werden kann. Geht diesem ungültigen Token ein Zeilentrennzeichen voraus, handelt es sich also um eine schließende geschweifte Klammer oder um das Ende der Eingabe, dann fügt der Parser ein Semikolon hinzu.
Betrachten Sie dazu das folgende Beispiel:
let a = x
+ someComplicatedFunctionCall()
let b = y
Hinter der ersten Zeile wird kein Semikolon ergänzt, denn das Token + am Anfang der zweiten Zeile ist nicht ungültig.
Dagegen ist das Token let am Anfang der dritten Zeile ungültig, denn schließlich kann es kein Teil der ersten Variablendeklaration sein. Da dieses ungültige Token auf ein Zeilentrennzeichen folgt, wird ein Semikolon eingefügt:
let a = x
+ someComplicatedFunctionCall();
let b = y
Die Regel mit den ungültigen Token ist einfach und funktioniert in fast allen Fällen sehr gut. Allerdings versagt sie, wenn eine neue Anweisung mit einem Token beginnt, das auch Teil der vorhergehenden Anweisung sein könnte. Betrachten Sie dazu das folgende Beispiel:
let x = a
(console.log(6 * 7))
Hinter dem a wird kein Semikolon eingefügt, denn rein syntaktisch gesehen ist a(console.log(6 * 7) gültiges JavaScript. Dieser Code ruft eine Funktion namens a mit dem von console.log zurückgegebenen Wert auf. Das Token ( in der zweiten Zeile wird daher nicht als ungültig angesehen.
Dieses Beispiel ist natürlich ziemlich gewollt, denn die Klammern um console.log(6 * 7) sind nicht nötig. Ein anderes häufig angeführtes Beispiel sieht wie folgt aus:
let a = x
[1, 2, 3].forEach(console.log)
Da hinter x eine öffnende eckige Klammer stehen kann, wird auch hier kein Semikolon ergänzt. In dem unwahrscheinlichen Fall, dass Sie tatsächlich auf diese Weise ein Array-Literal in einer Schleife durchlaufen wollen, müssen Sie das Array in einer Variablen speichern:
let a = x
const numbers = [1, 2, 3]
numbers.forEach(console.log)
Tipp
Beginnen Sie eine Anweisung niemals mit ( oder [. Dann müssen Sie sich keine Sorgen darüber machen, ob die Anweisung als Fortsetzung der vorherigen Zeile aufgefasst wird oder nicht.
Hinweis
Ohne ein Semikolon kann es passieren, dass eine Zeile, die mit einem Template-Literal oder einem Literal für einen regulären Ausdruck beginnt, mit der vorausgehenden Zeile verschmolzen wird:
let a = x
`Fred`.toUpperCase()
Hier wird x`Fred` als Tagged-Template-Literal aufgefasst. In der Praxis werden Sie solchen Code aber nie schreiben, denn bei der Arbeit mit einem String oder einem regulären Ausdruck wollen Sie ja das Ergebnis nutzen. Deshalb würden Sie das Literal nicht an den Anfang der Anweisung stellen.
Die zweite Semikolonregel ist jedoch problematischer. Danach wird ein Semikolon hinter einer nichtlinearen Steueranweisung (break, continue, return, throw und yield) ergänzt, auf die unmittelbar ein Zeilentrennzeichen folgt:
return
x + someComplicatedExpression;
Hier wird automatisch ein Semikolon hinzugefügt:
return ;
x + someComplicatedExpression;
Die Funktion springt zurück, ohne einen Wert zurückzugeben. Die zweite Zeile ist jetzt eine Ausdrucksanweisung, die niemals ausgeführt wird.
Die Lösung für dieses Problem ist trivial: Fügen Sie niemals einen Zeilenumbruch nach return ein, sondern stellen Sie mindestens ein Token des Ausdrucks für den Rückgabewert in dieselbe Zeile:
return x +
someComplicatedExpression;
Diese Regel müssen Sie auch dann beachten, wenn Sie gewissenhaft alle erforderlichen Semikolons selbst hinschreiben.
Neben den Regeln zu ungültigen Token und nichtlinearen Steueranweisungen gibt es noch eine dritte, eigenartige Regel: Ein Semikolon wird eingefügt, wenn auf ++ oder -- unmittelbar ein Zeilentrennzeichen folgt. Betrachten Sie folgendes Beispiel:
x
++
y
Daraus wird nach dieser Regel:
x;
++y;
Solange Sie den Operator ++ in dieselbe Zeile schreiben wie seinen Operanden, müssen Sie sich jedoch keine Gedanken über diese Regel machen.
Die Regeln für die automatische Semikolonergänzung sind ein Teil der Sprache. In der Praxis funktionieren sie auch durchaus annehmbar. Wenn Sie Semikolons gern selbst einfügen, dann tun Sie das ruhig, wenn nicht, lassen Sie es bleiben. In jedem Fall aber müssen Sie auf eine Reihe von Grenzfällen achten.
Hinweis
Semikolons werden nur vor Zeilentrennzeichen und der schließenden geschweiften Klammer automatisch ergänzt. Wenn Sie mehrere Anweisungen in eine Zeile schreiben, müssen Sie die Semikolons selbst einfügen:
if (i < j) { i++; j-- }
Hier sind die Semikolons notwendig, um die Anweisungen i++ und j-- voneinander zu trennen.
2.3Verzweigungen
Wenn Sie mit C, C++, Java oder C# vertraut sind, können Sie diesen Abschnitt getrost überspringen.
Die Bedingungsanweisung in JavaScript hat folgende Form:
if (Bedingung) Anweisung
Die Bedingung muss dabei in runden Klammern stehen.