Syntax
Anweisungen
Anweisungsende: Semikolon
Eine JavaScript-Anweisung kann sich über mehrere Zeilen verteilen und wird abgeschlossen durch ein Semikolon.
console.log(`
Das ist ein mehrzeiliger String.
`);
console
.log('Eigenwillige, aber korrekte Formatierung');console.log(`
Das ist ein mehrzeiliger String.
`);
console
.log('Eigenwillige, aber korrekte Formatierung');Einrückungen
Einrückungen und zusätzlicher Leeraum (Leerzeichen, Tabulator-Zeichen, Zeilenwechsel) spielen im Quellcode keine Rolle und sollen lediglich die Lesbarkeit erhöhen.
const isImportant = true;
if (isImportant)
console.log('It\'s important.');
console.log('Printed anyway);const isImportant = true;
if (isImportant)
console.log('It\'s important.');
console.log('Printed anyway);Anweisungsblöcke
Statt einer einzelnen Anweisung kann auch ein Anweisungsblock stehen. Häufigste Verwendung ist bei der strukturierten Programmierung (bedingte und wiederholte Ausführung).
const isVeryImportant = true;
if (isVeryImportant) {
console.log('It\'s important.');
console.log('Got it? Important!');
}const isVeryImportant = true;
if (isVeryImportant) {
console.log('It\'s important.');
console.log('Got it? Important!');
}ASI
Ein kleiner Fallstrick und Gegenstand jahrelanger Diskussionen in der JavaScript-Welt ist die ASI (Automatic semicolon injection). Der JavaScript-Interpreter fügt an gegebener Stelle für uns Semikolons ein - falls wir sie vergessen haben (?!).
function add(a,b) {
result = a + b
return {
result: result
}
}
console.log(add(17,4))function add(a,b) {
result = a + b
return {
result: result
}
}
console.log(add(17,4))Kommentare
JavaScript unterscheidet zwischen zwei Kommentarformen: einzeiligem und mehrzeiligem Kommentar
Einzeiliger Kommentar
In einer Zeile wird der Kommentar eingeleitet durch // und endet automatisch mit dem Ende der Zeile.
// Einfache Ausgaben über die Konsole
console.log('Hallo Welt'); // Zum Anschauen dieser Ausgabe: Entwicklertools// Einfache Ausgaben über die Konsole
console.log('Hallo Welt'); // Zum Anschauen dieser Ausgabe: EntwicklertoolsMehrzeiliger Kommentar
Falls ein längerer Kommentar über mehrere Zeilen erstellt werden soll, kann der Text in Kommentarklammern eingefasst werden /* .... */.
/*
* Der Stern hier vorne hat keine Bedeutung,
* er dient lediglich dem schicken Aussehen.
*//*
* Der Stern hier vorne hat keine Bedeutung,
* er dient lediglich dem schicken Aussehen.
*/Auf mehrzeiligen Kommentar sollte zwischen Anweisungen verzichtet werden. Dort sollte er eher zum Ein- und Auskommentieren von Code-Blöcken genutzt werden.
console.log('Eine Nachricht');
/*
console.log('Früher wurde auch das ausgegeben');
console.log('Aber es war eher unwichtig.'); // Aber eben nicht für alle
console.log('Ich will es aber im Code stehen lassen.');
*/console.log('Eine Nachricht');
/*
console.log('Früher wurde auch das ausgegeben');
console.log('Aber es war eher unwichtig.'); // Aber eben nicht für alle
console.log('Ich will es aber im Code stehen lassen.');
*/JSDoc
Sinnvoller ist mehrzeiliger Kommentar vor der Definition von Funktionen und Klassen. Und zwar in seiner speziellen JSDoc-Form. Siehe: JSDOC.
/**
* Add two numbers
*
* @param {number} a - First operand.
* @param {number} b - Second operand.
*
* @returns {number} - Sum of both operands.
*/
function add(a, b) {
return a+b;
}/**
* Add two numbers
*
* @param {number} a - First operand.
* @param {number} b - Second operand.
*
* @returns {number} - Sum of both operands.
*/
function add(a, b) {
return a+b;
}Variablen
Deklaration
Variablen werden mit den Schlüsselwörtern let und const deklariert.
let counter;
counter = 1;
const maximum = 10; // must be initialized
// maximum = 100;
// Neu-Zuweisung, Fehler!let counter;
counter = 1;
const maximum = 10; // must be initialized
// maximum = 100;
// Neu-Zuweisung, Fehler!Vor JavaScript 2015 wurden Variablen ausschließlich mit dem Schlüsselwort var deklariert. Dies sollte heute vermieden werden.
const bedingung = true;
if (bedingung) {
let tempVar = 21; // Scoped to block
var globalVar = 21; // Not scoped, but global
}
console.log(typeof tempVar); // undefined
console.log(typeof globalVar); // numberconst bedingung = true;
if (bedingung) {
let tempVar = 21; // Scoped to block
var globalVar = 21; // Not scoped, but global
}
console.log(typeof tempVar); // undefined
console.log(typeof globalVar); // numberSiehe dazu auch die Abschnitte Basics/Scope und Advanced/Hoisting.
INFO
Als Regel/Richtlinie könnte festgelegt sein:
- Variablen/Symbole immer mit
constdeklarieren und initialisieren - Lockern nach
let, falls die Variable neu gesetzt werden muss - Niemals
var
Konstante Objekte und Arrays
Objekte und Arrays, die konstanten Variablen zugewiesen werden, bleiben weiter veränderbar (mutable). Konstant ist lediglich die Variable, also der Verweis auf das Objekt bzw. Array.
const person = {
firstname: 'Markus'
};
const primzahlen = [2, 3, 5, 7];
person.firstname = 'Klaus';
person.lastname = 'Lage';
primzahlen.push(11, 13, 17, 19);
console.log(person);
console.log(primzahlen);const person = {
firstname: 'Markus'
};
const primzahlen = [2, 3, 5, 7];
person.firstname = 'Klaus';
person.lastname = 'Lage';
primzahlen.push(11, 13, 17, 19);
console.log(person);
console.log(primzahlen);Ausdrücke und Operatoren
Ausdruck / Expression
Ein JavaScript-Ausdruck "steht" für einen Wert. Die einfachste Form ist ein literaler primitiver Wert.
42;42;Natürlich ist auch eine Variable oder die Rückgabe einer aufgerufenen Funktion ein Ausdruck:
const zahl = '17';
zahl;
parseInt(zahl);const zahl = '17';
zahl;
parseInt(zahl);Operatoren
Ausdrücke können mit Operatoren kombiniert werden und liefern neue Werte. JavaScript kennt gängige mathematische, bit-weise, relationale und logische Operatoren.
// Mathematische Operatoren
let summe = 0;
summe = 17 + 4;
summe = summe + 42;
summe += 21; // increment by twentyone
summe++; // increment by one
const average = summe / 5;
// Bit-weise Operatoren
const verdoppelt = summe << 1;
const erstesBit = summe & 1;
// Relationale Operatoren
const groesserAls = 17 > 4; // true
// Logische Operatoren
const logischesUnd = true && false; // false// Mathematische Operatoren
let summe = 0;
summe = 17 + 4;
summe = summe + 42;
summe += 21; // increment by twentyone
summe++; // increment by one
const average = summe / 5;
// Bit-weise Operatoren
const verdoppelt = summe << 1;
const erstesBit = summe & 1;
// Relationale Operatoren
const groesserAls = 17 > 4; // true
// Logische Operatoren
const logischesUnd = true && false; // falseZu den logischen Operatoren gibt es einen Unterabschnitt Syntax/Logische Operatoren.
Zeichenketten-Verknüpfungen werden ebenfalls mit dem + Operator durchgeführt.
let name = 'Thomas' + ' ' + 'Müller';
name += ' (Fussballspieler)';let name = 'Thomas' + ' ' + 'Müller';
name += ' (Fussballspieler)';Falls einer nur der beiden Operanden vom Typ string ist, wird trotzdem eine Zeichenketten-Verknüpfung durchgeführt (der zweite also automatisch in seine Zeichenkette überführt - toString-Aufruf). Anders bei den anderen mathematischen Operatoren, hier wird versucht eine Konvertierung nach number durchzuführen.
console.log('17' + 4);
console.log('17' * 4);console.log('17' + 4);
console.log('17' * 4);Gleichheit
Um die Gleichheit von zwei Werten zu überprüfen, existieren in JavaScript zwei(!) Operatoren:
===: strikte, typsichere Gleichheit mit drei Gleichheitszeichen==: lockere bzw. abstrakte Gleicheit mit Typ-Umwandlungen (MDN)
Strict Equality
Es ist dringend angeraten immer diese strikte Form der Gleichheitsprüfung zu verwenden. Das Wörtchen immer impliziert hier natürlich: keine Regel ohne Ausnahme.
// Primitive Werte
console.log('Hallo' === 'Hallo'); // true
console.log(0 === false); // false
console.log(1 === true); // false
console.log(null === undefined); // false
// Objekte
const primzahlen = [2,3,5];
console.log(primzahlen === primzahlen); // true
console.log(primzahlen == [2,3,4]); // false// Primitive Werte
console.log('Hallo' === 'Hallo'); // true
console.log(0 === false); // false
console.log(1 === true); // false
console.log(null === undefined); // false
// Objekte
const primzahlen = [2,3,5];
console.log(primzahlen === primzahlen); // true
console.log(primzahlen == [2,3,4]); // falseLoose Equality
Aus Bequemlichkeit ist es verschiedentlich durchaus erlaubt, nur locker zu prüfen. Man sollte sich der Konsequenzen bewusst sein.
console.log(5 == '5'); // true
console.log(0 == false); // true
console.log('' == false); // true
console.log([] == false); // true
console.log({} == false); // false
console.log(null == false); // false
console.log(undefined == false); // falseconsole.log(5 == '5'); // true
console.log(0 == false); // true
console.log('' == false); // true
console.log([] == false); // true
console.log({} == false); // false
console.log(null == false); // false
console.log(undefined == false); // falseLogische Operatoren
Binäre Logik
Die logischen Operatoren in JavaScript sind:
&&- logisches Und||- logisches Oder!- logisches Nicht
Alle drei führen eine Typ-Konvertierung nach boolean für nicht boolesche Werte durch (coercion). Das kann bewusst idiomatisch eingesetzt werden, aber auch zu Verwirrung führen.
Truthiness
Ein Wert gilt als truthy, wenn seine Coercion zu true führt. Alle anderen Werte sind falsy. Siehe hierzu MDN.
Für die einzelnen Datentypen sind folgende Werte falsy:
boolean:falsenumber:0,-0,NaNstring:''- Und außerdem:
nullundundefined
Logisches Nicht
Wir benutzen das logische Nicht um einen truthy-Wert nach false umzuwandeln und umgekehrt.
console.log(!true)
console.log(!false)
console.log(!0)
console.log(!42)
console.log(!'')
console.log(!'hello')
// Sometimes unexpected:
console.log([] == false)
console.log(![])console.log(!true)
console.log(!false)
console.log(!0)
console.log(!42)
console.log(!'')
console.log(!'hello')
// Sometimes unexpected:
console.log([] == false)
console.log(![])INFO
Die doppelte Negation wird manchmal ideomatisch eingesetzt, um einen Wert nach boolean zu konvertieren:
const value = ...;
const booleValue = !!value;const value = ...;
const booleValue = !!value;Logisches Und
Der binäre logische Und-Operator (&&) bekommt zwei Operanden und es gilt:
- Ist der erste Operand falsy, evaluiert der Ausdruck zu dem ersten Operanden.
- Ist der erste Operand truthy, evaluiert der Ausdruck zu dem zweiten Operanden.
console.log(true && false); // false
console.log(42 && 'hello'); // 'hello'
console.log(0 && 42); // 0console.log(true && false); // false
console.log(42 && 'hello'); // 'hello'
console.log(0 && 42); // 0Es ist also keinesfalls so, dass der Wert des Ausdrucks vom Typ
booleanist.
Logisches Oder
Der binäre logische Oder-Operator (||) bekommt zwei Operanden und es gilt:
- Ist der erste Operand truthy, evaluiert der Ausdruck zu dem ersten Operanden.
- Ist der erste Operand falsy, evaluiert der Ausdruck zu dem zweiten Operanden.
console.log(true || false); // true
console.log(42 || 'hello'); // 42
console.log(0 || 42); // 42console.log(true || false); // true
console.log(42 || 'hello'); // 42
console.log(0 || 42); // 42Auch hier ist natürlich der Wert des Ausdrucks nicht zwingend vom Typ
boolean.
Kurz-Schluss
Beide Operatoren arbeiten im Kurz-Schluss-Verfahren (short-circuiting):
&&: Ist er erste Operand schon falsy, wird der zweite nicht mehr evaluiert. Eventuelle Nebeneffekte passieren demnach nicht.- '||': Ist der erste Operand schon truthy, wird der zweite genauso nicht mehr evaluiert.
let counter = 1
console.log(false && counter++);
console.log(counter);
console.log(true || counter++);
console.log(counter);let counter = 1
console.log(false && counter++);
console.log(counter);
console.log(true || counter++);
console.log(counter);Sonderformen
Ternärer Operator
Abhängig von der truthy/falsy-Auswertung des ersten Operanden, evaluiert der Ausdruck zum zweiten bzw. dritten Operanden.
const a = 17, b = 4;
const max = a > b ? a : b;const a = 17, b = 4;
const max = a > b ? a : b;Nullish-Coalescing (Vereinigung)
Ist der erste Operand null oder undefined, evaluiert der Ausdruck zum zweiten Operanden.
const firstOp = null;
console.log(firstOp ?? 42);
const firstNumber = 0;
console.log(firstNumber ?? 42);
// Zur Erinnerung:
console.log(firstOp || 42);
console.log(firstNumber || 42);const firstOp = null;
console.log(firstOp ?? 42);
const firstNumber = 0;
console.log(firstNumber ?? 42);
// Zur Erinnerung:
console.log(firstOp || 42);
console.log(firstNumber || 42);Bedingte Ausführung
JavaScript verfügt über zwei Schlüsselwörter, um bedingte Code-Ausführung zu realisieren:
if-else: Einfache Fallunterscheidungswitch: Mehrfach Fallunterscheidung
Wiederholte Ausführung
Es gibt in JavaScript eine Vielzahl von Schleifen-Varianten mit jeweils unterschiedlichen Verwendungsszenarien.
Schleifen mit Abbruchkriterium
while: Test am Kopf der Schleifedo while: Test am Ende der Schleifefor: klassische Zählschleife
Iteration über Objekt-Eigenschaften
for-in: Schleife über alle (!) aufzählbaren Eigenschaften eines Objektes.
Iteration über Arrays
for-of: Schleife über iterable Objekte. Nicht nur Arrays!forEach: Instanz-Methode von Arrays
JavaScript Docs