3. Unterrichtsblock: Variablen, Datentypen und Rechnen

Heute lernst du, wie man in JavaScript Werte speichert, mit ihnen rechnet und sie vergleicht. Du arbeitest lokal in einem Projektordner und siehst Ergebnisse in der Browser-Konsole und auf der Seite. Neben jedem Beispiel siehst du, was dabei herauskommt.

Projekt vorbereiten

Lege einen Ordner js-projekt mit zwei Dateien an: index.html und app.js. Das Skript bindest du wie in Block 2 als externe Datei ein.

<!-- index.html -->
<!doctype html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <title>JavaScript üben</title>
  </head>
  <body>
    <h1>JavaScript üben</h1>
    <p id="ausgabe"></p>
    <script src="app.js"></script>
  </body>
</html>
// app.js
console.log("app.js wurde geladen");

Öffne index.html im Browser und drücke F12. Im Reiter Konsole steht jetzt die Ausgabe von console.log(). Dort erscheinen auch Fehlermeldungen.

Ausgabe in der Konsole
app.js wurde geladen

Variablen: Werte speichern

Eine Variable ist ein Name für einen gespeicherten Wert. Mit let legst du eine Variable an, deren Wert sich ändern darf. Mit const legst du eine Konstante an, deren Wert gleich bleibt.

const name = "Lina";   // bleibt gleich
let alter = 17;       // kann sich ändern

alter = 18;           // neuer Wert: erlaubt
console.log(name, alter);
Ausgabe in der Konsole
Lina 18
Merke: Nimm standardmäßig const. Schreibe let nur, wenn sich der Wert wirklich ändert. Das alte var schauen wir uns gleich an, wir schreiben es aber nicht selbst.

Namen für Variablen

NameGültig?Grund
alter, vorName, _temp, preis2jaBuchstaben, Ziffern, _ und $ sind erlaubt
2plaetzeneinbeginnt mit einer Ziffer
mein-nameneinBindestrich ist ein Minuszeichen
letneinreserviertes Schlüsselwort
Alter und alterja, aber verschiedenGroß- und Kleinschreibung zählt

Üblich ist die camelCase-Schreibweise: preisProStueck. Wähle Namen, die sagen, was gespeichert ist.

Und was ist mit var?

Bevor es let und const gab (vor 2015), benutzte man var. Du findest es in vielen älteren Beispielen und Tutorials im Netz. Es funktioniert, verhält sich aber an drei Stellen anders und führt leicht zu Fehlern, die man nicht bemerkt:

let / constvar
Doppelt anlegenFehler (gut, du merkst den Tippfehler)kein Fehler, der alte Wert wird still überschrieben
Vor der Deklaration benutzenFehlerliefert undefined, ohne Fehler
Gültigkeitnur im { }-Blockignoriert { }-Blöcke, gilt in der ganzen Funktion
var alter = 17;
var alter = 18;            // kein Fehler, obwohl doppelt angelegt
console.log(alter);        // 18

console.log(vorname);      // undefined, nicht einmal ein Fehler
var vorname = "Lina";
Ausgabe in der Konsole
18
undefined

Dasselbe mit let: Hier meldet JavaScript beide Fehler sofort und du findest sie gleich. Die zwei Beispiele laufen getrennt, weil schon der erste Fehler das Skript stoppt.

let alter = 17;
let alter = 18;            // Fehler: Name schon vergeben
console.log(alter);
Fehler in der Konsole
Uncaught SyntaxError: Identifier ‚alter‘ has already been declared
console.log(vorname);      // Fehler: benutzt, bevor es angelegt wurde
let vorname = "Lina";
Fehler in der Konsole
Uncaught ReferenceError: Cannot access ‚vorname‘ before initialization
Merke: Du musst var erkennen und lesen können. Schreibe aber selbst nur const und let. Mehr dazu, wo eine Variable überhaupt gilt, lernst du im nächsten Block (Gültigkeitsbereich).

Aufgabe 1 – Dein Steckbrief

Zeit: ca. 5 Minuten

  1. Lege in app.js Variablen für deinen Namen (const), dein Alter (let) und dein Lieblingsfach (const) an.
  2. Gib alle drei mit console.log() aus.
  3. Erhöhe dein Alter um 1 und gib es erneut aus.
  4. Gib deinen Namen zusätzlich mit document.getElementById("ausgabe").innerHTML auf der Seite aus.

Fehlermeldungen lesen

Fehler gehören dazu. Die Konsole zeigt dir, was schiefgelaufen ist: den Fehlertyp, eine Erklärung und die Datei mit Zeilennummer. Drei typische Fehler:

const pi = 3.14;
pi = 3;              // const neu zuweisen
Fehler in der Konsole
Uncaught TypeError: Assignment to constant variable.
  at app.js:2
let punkte = 10;
let punkte = 20;     // Namen doppelt angelegt
Fehler in der Konsole
Uncaught SyntaxError: Identifier ‚punkte‘ has already been declared
console.log(gesamtpreis);   // gibt es nicht
Fehler in der Konsole
Uncaught ReferenceError: gesamtpreis is not defined
Merke: Lies die Meldung von vorne: Der Fehlertyp sagt dir die Art des Fehlers, der Text sagt dir, was los ist, und die Zeilennummer sagt dir, wo du suchen musst.

Aufgabe 2 – Fehler provozieren

Zeit: ca. 5 Minuten

  1. Baue die drei Fehler aus den Beispielen nacheinander in app.js ein und öffne jedes Mal die Konsole.
  2. Notiere dir für jeden Fehler Typ, Meldung und Zeilennummer als Kommentar.
  3. Lege zum Vergleich eine Variable zweimal mit var an. Was passiert diesmal?
  4. Repariere den Code wieder.

Datentypen

Jeder Wert hat einen Datentyp. Mit typeof fragst du ihn ab.

WertDatentypBeschreibung
"Lina", 'Hallo'stringText in Anführungszeichen
42, 3.14numberGanz- und Kommazahlen (mit Punkt, ohne Anführungszeichen)
true, falsebooleanWahr oder falsch
undefinedundefinedVariable ohne Wert
const name = "Lina";
const alter = 17;
const istSchueler = true;
let ohneWert;

console.log(typeof name);
console.log(typeof alter);
console.log(typeof istSchueler);
console.log(typeof ohneWert);
Ausgabe in der Konsole
string
number
boolean
undefined

Eingaben aus Formularfeldern sind immer Text. Probiere es aus:

const eingabe = "42";
console.log(typeof eingabe);            // string
console.log(typeof Number(eingabe));    // number
Ergebnis im Browser

Text und Zahl mischen

Der Operator + rechnet bei Zahlen und hängt bei Text zusammen. Sobald ein Text dabei ist, wird zusammengehängt.

console.log(5 + 5);        // 10
console.log("5" + 5);      // 55
console.log("Hallo" + 5);  // Hallo5
console.log("5" - 2);      // 3  (Minus gibt es nur für Zahlen)
console.log(Number("5") + 5);  // 10
Ausgabe in der Konsole
10
55
Hallo5
3
10

Aufgabe 3 – Text plus Zahl

Zeit: ca. 5 Minuten

  1. Sage für 5 + 5 + "5" und "5" + 5 + 5 voraus, was herauskommt. Prüfe dann in der Konsole.
  2. Lege const zahlAlsText = "8" an. Rechne damit zahlAlsText + 2 und Number(zahlAlsText) + 2. Erkläre den Unterschied als Kommentar.

Rechnen

Mit Zahlen rechnest du mit den arithmetischen Operatoren. Es gilt Punkt vor Strich, mit Klammern steuerst du die Reihenfolge.

OperatorBedeutungBeispielErgebnis
+Addition7 + 29
-Subtraktion7 - 25
*Multiplikation7 * 214
/Division7 / 23.5
%Rest einer Division7 % 21
**Potenz2 ** 38
++um 1 erhöhenzahl++zahl + 1
--um 1 verringernzahl--zahl – 1

Probiere mit eigenen Zahlen aus:

Ergebnis im Browser
und

Merke: Der Rest % ist nützlich: zahl % 2 === 0 ist bei geraden Zahlen wahr. minuten % 60 liefert die Restminuten, wenn man Stunden abzieht.

Kurzschreibweisen für Zuweisungen

Statt punkte = punkte + 5 schreibt man kürzer punkte += 5.

OperatorBeispielBedeutet
=x = 5x bekommt den Wert 5
+=x += 5x = x + 5
-=x -= 5x = x - 5
*=x *= 5x = x * 5
/=x /= 5x = x / 5
%=x %= 5x = x % 5
let punkte = 10;
punkte += 5;     // 15
punkte *= 2;     // 30
console.log(punkte);
Ergebnis im Browser
  Punkte: 10

Aufgabe 4 – Warenkorb

Zeit: ca. 10 Minuten

Berechne einen kleinen Einkauf.

  1. Lege const preisBrot = 2.5, const preisMilch = 1.2 und const mengeBrot = 2, const mengeMilch = 3 an.
  2. Berechne den Gesamtpreis in der Variable gesamt.
  3. Gib auf der Seite aus: „Gesamtpreis: 8.6 Euro“ (verwende document.getElementById("ausgabe").innerHTML).
  4. Runde die Ausgabe mit gesamt.toFixed(2) auf zwei Nachkommastellen.

Vergleichen

Vergleiche liefern immer einen Wahrheitswert: true oder false. Wir benutzen den strengen Vergleich ===: Er prüft Wert und Datentyp.

OperatorBedeutungBeispiel (x ist 5)Ergebnis
===gleich (Wert und Typ)x === 5true
===gleich (Wert und Typ)x === "5"false
!==ungleichx !== 8true
>, <größer, kleinerx > 3true
>=, <=größer oder gleich, kleiner oder gleichx <= 4false
const x = 5;
console.log(x === 5);     // true
console.log(x === "5");   // false, denn "5" ist Text
console.log(x == "5");    // true, weil == den Typ ignoriert
console.log(x > 3);       // true
Ausgabe in der Konsole
true
false
true
true
Merke: Benutze immer === und !==. Das einfache == wandelt Typen automatisch um und liefert oft überraschende Ergebnisse. Du siehst es aber in fremdem Code.

Eigenheiten von JavaScript

JavaScript hat einige Eigenheiten, die auf den ersten Blick wie Fehler aussehen. Es sind Regeln der Sprache, und man muss sie kennen, sonst wundert man sich. Sage bei jedem Ausdruck zuerst voraus, was herauskommt, und klicke dann auf „Ergebnis zeigen“.

Text und Zahlen

Das + hängt Text zusammen oder rechnet. Ein + vor einem Wert versucht, daraus eine Zahl zu machen. Aus "a" wird dabei NaN („Not a Number“, keine Zahl).

console.log("b" + "a" + +"a" + "a");
Ausdruck (erst selbst vorhersagen!)Ergebnis
"b" + "a" + +"a" + "a"
+"a"
true + true

Kommazahlen sind nur Näherungen

Der Computer rechnet im Zweiersystem. Viele Dezimalzahlen wie 0,1 lassen sich dort nicht genau darstellen. Deshalb ist 0.1 + 0.2 nicht exakt 0,3.

Ausdruck (erst selbst vorhersagen!)Ergebnis
0.1 + 0.2
0.1 + 0.2 === 0.3
(0.1 + 0.2).toFixed(2)
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON
Merke: Vergleiche Kommazahlen nie mit ===. Runde mit toFixed() oder prüfe, ob der Unterschied winzig ist (Number.EPSILON).

Division durch null und NaN

JavaScript bricht bei einer Division durch null nicht mit einem Fehler ab. Es liefert Infinity (unendlich) oder NaN.

Ausdruck (erst selbst vorhersagen!)Ergebnis
1 / 0
-1 / 0
0 / 0
"abc" * 2
NaN === NaN
typeof NaN
Number.isNaN(0 / 0)
Merke: NaN ist mit nichts gleich, auch nicht mit sich selbst. Ob ein Wert NaN ist, prüfst du mit Number.isNaN(wert).

Abschlussaufgaben

Jetzt wird es anspruchsvoller. Nimm dir Zeit, es müssen nicht alle Aufgaben geschafft werden.

Aufgabe 5 – Preisrechner

Zeit: ca. 15 Minuten

Ein Laden gibt Rabatt. Berechne den Endpreis.

  1. Lege die Variablen nettopreis = 80, rabattProzent = 15 und mwstProzent = 19 an.
  2. Berechne den Rabatt in Euro und den Preis nach Rabatt.
  3. Berechne darauf die Mehrwertsteuer und den Bruttopreis.
  4. Gib alle Zwischenergebnisse in einer übersichtlichen Liste auf der Seite aus, auf zwei Nachkommastellen gerundet.

Zusatz: Füge eine Variable stueckzahl hinzu, sodass der Preis für mehrere Stück berechnet wird.

Aufgabe 6 – Transfer: Sekunden umrechnen

Zeit: ca. 20 Minuten

Ein Videoplayer kennt nur die Gesamtlänge in Sekunden. Er soll sie als Stunden, Minuten und Sekunden anzeigen. Du brauchst dafür nur, was du heute gelernt hast. Die Lösung musst du dir selbst überlegen.

GesamtlängeAnzeige
37251 h 2 min 5 s
590 h 0 min 59 s
36001 h 0 min 0 s
8639923 h 59 min 59 s
  1. Lege const gesamt = 3725 an und berechne stunden, minuten und sekunden jeweils als ganze Zahlen.
  2. Gib das Ergebnis als Text auf der Seite aus, zum Beispiel „1 h 2 min 5 s“.
  3. Teste mit den Werten aus der Tabelle und mit 0.
  4. Baue ein Eingabefeld und einen Button, damit die Länge eingegeben werden kann. Denke daran, was ein Eingabefeld liefert.

Tipp: Eine Division wie 3725 / 3600 liefert eine Kommazahl. Überlege, wie du mit dem Rest (%) erst das Überzählige abziehst und dann ganze Stunden erhältst.

Zusatz: Ein Kassenautomat gibt Wechselgeld in Cent aus. Berechne für 387 Cent, wie viele 2-Euro-Münzen, 1-Euro-Münzen und 50-Cent-Münzen ausgegeben werden und wie viele Cent übrig bleiben.

Kurz zusammengefasst

Variablen speichern Werte, const ist der Standard und let nur für Werte, die sich ändern. Jeder Wert hat einen Datentyp, und mit Text und Zahlen ist Vorsicht geboten. Rechnen geht mit + - * / % **, vergleichen mit ===. Die Konsole zeigt dir Ergebnisse und Fehler.