Skip to content

Syntax

Anweisungen

Anweisungsende: Semikolon

Eine JavaScript-Anweisung kann sich über mehrere Zeilen verteilen und wird abgeschlossen durch ein Semikolon.

js
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.

js
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).

js
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 (?!).

js
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.

js
// 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: Entwicklertools

Mehrzeiliger Kommentar

Falls ein längerer Kommentar über mehrere Zeilen erstellt werden soll, kann der Text in Kommentarklammern eingefasst werden /* .... */.

js
/*
 * 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.

js
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.

js
/**
 * 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.

js
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.

js
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); // number
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); // number

Siehe dazu auch die Abschnitte Basics/Scope und Advanced/Hoisting.

INFO

Als Regel/Richtlinie könnte festgelegt sein:

  1. Variablen/Symbole immer mit const deklarieren und initialisieren
  2. Lockern nach let, falls die Variable neu gesetzt werden muss
  3. 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.

js
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.

js
42;
42;

Natürlich ist auch eine Variable oder die Rückgabe einer aufgerufenen Funktion ein Ausdruck:

js
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.

js
// 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; // false

Zu den logischen Operatoren gibt es einen Unterabschnitt Syntax/Logische Operatoren.

Zeichenketten-Verknüpfungen werden ebenfalls mit dem + Operator durchgeführt.

js
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.

js
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.

js
// 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]);     // false

Loose Equality

Aus Bequemlichkeit ist es verschiedentlich durchaus erlaubt, nur locker zu prüfen. Man sollte sich der Konsequenzen bewusst sein.

js
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);    // false
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);    // false

Logische 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: false
  • number: 0, -0, NaN
  • string: ''
  • Und außerdem: null und undefined

Logisches Nicht

Wir benutzen das logische Nicht um einen truthy-Wert nach false umzuwandeln und umgekehrt.

js
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:

js
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.
js
console.log(true && false); // false
console.log(42 && 'hello'); // 'hello'
console.log(0 && 42);       // 0
console.log(true && false); // false
console.log(42 && 'hello'); // 'hello'
console.log(0 && 42);       // 0

Es ist also keinesfalls so, dass der Wert des Ausdrucks vom Typ boolean ist.

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.
js
console.log(true || false); // true
console.log(42 || 'hello'); // 42
console.log(0 || 42);       // 42
console.log(true || false); // true
console.log(42 || 'hello'); // 42
console.log(0 || 42);       // 42

Auch 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.
js
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.

js
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.

js
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 Fallunterscheidung
  • switch: 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 Schleife
  • do while: Test am Ende der Schleife
  • for: 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