JavaScript: Explizite Typkonvertierung
Um Überraschungen zu vermeiden, kannst du Typen auch explizit umwandeln:
// Zu Number konvertieren
console.log(Number("5")); // 5
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number("")); // 0
console.log(Number("Hallo")); // NaN
// Zu String konvertieren
console.log(String(5)); // "5"
console.log(String(true)); // "true"
console.log(String(null)); // "null"
// Zu Boolean konvertieren
console.log(Boolean(1)); // true
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean("Hallo")); // true
Häufige Fallstricke und Lösungen
Unerwartete Stringverkettung
// Problem
let a = 5;
let b = "3";
console.log(a + b); // "53" (unerwartete Stringverkettung)
// Lösung
console.log(a + Number(b)); // 8
Zahlen in Formularen
// Problem: Formulareingaben sind immer Strings
let eingabe = „5“;
let verdoppelt = eingabe * 2; // 10 (implizite Konvertierung)
let verkettung = eingabe + 2; // „52“ (Vorsicht!)
// Lösung
let sicheresAddieren = Number(eingabe) + 2; // 7
Typkonvertierung bei window.prompt
Der Fallstrick bei prompt-Eingaben
Die window.prompt
-Funktion ist ein klassischer Fallstrick bei der Typkonvertierung in JavaScript. Sie gibt immer einen String zurück – selbst wenn der Benutzer eine Zahl eingibt. Dieser versteckte Umstand führt oft zu unerwarteten Ergebnissen.
// Benutzer gibt die Zahl 5 einlet alter = prompt("Wie alt bist du?"); console.log(alter); // "5" (als String)console.log(typeof alter); // "string"// Problematische Berechnungenlet inZehnJahren = alter + 10;console.log(inZehnJahren); // "510" (Stringverkettung statt Addition!)// Weitere unerwartete Ergebnisseconsole.log(alter > 18); // false (Stringvergleich: "5" kommt alphabetisch vor "18")console.log(alter == 5); // true (durch implizite Konvertierung)console.log(alter === 5); // false (unterschiedliche Typen)
Die Lösung: Explizite Typkonvertierung
Um dieses Problem zu umgehen, wandle die Eingabe sofort in eine Zahl um:
// Direkte Umwandlunglet alter = Number(prompt("Wie alt bist du?"));console.log(alter); // 5 (als Number)console.log(typeof alter); // "number"// Jetzt funktionieren Berechnungen korrektlet inZehnJahren = alter + 10;console.log(inZehnJahren); // 15 (mathematische Addition)// Auch Vergleiche funktionieren wie erwartetconsole.log(alter > 18); // false (numerischer Vergleich)console.log(alter === 5); // true (gleicher Typ und Wert)
Umgang mit ungültigen Eingaben
Ein zusätzliches Problem: Wenn der Benutzer keine Zahl eingibt, erhältst du NaN
(Not a Number):
// Benutzer gibt "zwanzig" einlet alter = Number(prompt("Wie alt bist du?"));console.log(alter); // NaN
Eine robuste Lösung prüft daher die Gültigkeit der Eingabe. Dies werden wir später ausführlich mit den Vergleichsoperatoren machen.
Alternativen für verschiedene Zahlenformate
Je nach Anwendungsfall brauchst du unterschiedliche Konvertierungsmethoden:
// Ganzzahlen (ohne Nachkommastellen)let ganzzahl = parseInt(prompt("Gib eine Ganzzahl ein:"));// Zahlen mit Nachkommastellenlet dezimalzahl = parseFloat(prompt("Gib eine Dezimalzahl ein:"));// Umwandlung mit angegebener Basis (z.B. für Hexadezimal)let binärZahl = parseInt(prompt("Gib eine Binärzahl ein:"), 2);console.log(binärZahl); // Wandelt z.B. "1010" in die Dezimalzahl 10 um
Merke dir: Bei prompt
ist die explizite Typkonvertierung nicht optional, sondern notwendig. Ohne sie programmierst du an der Absicht des Benutzers vorbei und schaffst schwer zu findende Fehler!
TL;DR
In diesem Kapitel hast du kennegelernt, dass du mit:
der Funktion | konvertierst zu |
Number(value) | Zahl |
parseInt(value) | Ganzzahl |
parseFloat(value) | Fließkommazahl |
Boolean(value) | Wahrheitswert |
String(value) | Zeichenkette |