JavaScript für Ungeduldige. Cay Horstmann
Чтение книги онлайн.
Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 18
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.
Tipp
Gestalten Sie die Bedingung so, dass sie entweder true oder false ergibt, auch wenn JavaScript dafür beliebige Werte zulässt und sie in boolesche Werte umwandelt. Wie Sie im nächsten Abschnitt noch sehen werden, sind diese Konvertierungen nicht unbedingt einsichtig und können daher gefährlich sein. Beachten Sie die goldene Regel Nr. 3 aus dem Vorwort:
Seien Sie sich immer über die Typen im Klaren und vermeiden Sie die automatische Typkonvertierung.
Es kommt häufig vor, dass Sie mehrere Anweisungen ausführen wollen, wenn die Bedingung erfüllt ist. Verwenden Sie dazu eine Blockanweisung