Konstanten
constist eine Neuerung von ES6 für die Initialisierung von KonstanteKonstanten brauchen immer sofort eine Zuweisung
Konstanten können nicht überschrieben oder neu zugewiesen werden
Konstanten sind ideal für Konfigurationswerten oder Werte, die sich nicht ändern
gleiches Scope-Verhalten wie Variablen (
let)
// Konstanten
{
const TAX_RATE = 1.19;
// const TAX_RATE = 1.19; // error: Redeklaration von Konstanten
// TAX_RATE = 6; // error: keine neue Zuweisung möglich
let nettoPrice = 100;
// let total = nettoPrice * 1.19; // 1.19 - was ist 1.19?
let total = nettoPrice * TAX_RATE;
}
Datentypen
Primitive data types (Wert wird übergeben):
number -> Zahlen (Integer und Float)
string -> Zeichenketten
boolean -> true/false
bigint -> große Zahlen
symbol -> ES6: unique Symbol object (wird in globaler Symbol Registry gespeichert):
const s = Symbol("foo") console.log(Symbol.for("foo")) // Symbol("foo") console.log(Symbol.keyFor(Symbol.for("foo")) === "foo") // true
Siehe auch Datentyp: Symbol.
undefined -> nicht belegte Variable
null -> leerer Objektzeiger (wird als Typ ‘object’ ausgegeben -> Known Bug)
Reference data types (Referenz auf Objekt im Speicher wird übergeben):
gilt für alle Objekte
array -> vordefiniertes Objekt
object literals
function -> gehört zu Objekten
date object -> Objekt zur Ermittlung des aktuellen Datums (speichert Zeit seit 1.1.1970)
Important
JavaScript erlaubt das erneutes Zuweisen eines anderen Datentypen zu einer Variablen (dynamische Typenkonvertierung).
number
{
// primitive data types
// Zahlen (number) - Integer und Float
console.log(Number.MIN_VALUE)
console.log(Number.MAX_VALUE)
// Unter bzw. überschreiten wir den Wertebereich
// bekommt man ein -Infinity oder 'Infinity' zurück
// (beides Datentyp number)
// Hint: Führt nicht zum Fehler, darauf ließe sich noch reagieren
console.log(1/0); // Infinity
console.log(-1/0); // -Infinity
console.log(0/0); // NaN (number)
// NaN = Ergebnis einer fehlgeschlagenen mathematischen Operation
// oder einer fehlgeschlagenen Typenkonvertierung
// Vergleich von zwei NaN Objekten ist stets 'false' (-> daher Prüffunktion nötig)
}
string
Gekennzeichnet durch "", '' oder \`\`.
// Zeichenketten (string)
let output;
output = '<p class="texte">Content</p>'; // DOM String (nutzt "" und '')
output = "<p class=\"texte\">Content</p>"; // Escape " mit \
output = "Mein Text mit \nZeilenumbruch"; // mit Zeilenumbruch
output = "c:\\neuer_order" // Prevent Escape
console.log(output);
Wahrheitswerte (boolean)
Es gibt nur true und false.
Ansonsten undefined für nicht zugewiesene Variable oder null für ein nicht
vorhandenes Objekt.
Warning
null bedeutet nicht kein ‘object’ Typ, obwohl so vom Interpreter behauptet,
sondern ist ein eigener Objekttyp. Nicht mehr zu behebender Fehler in JavaScript.
BigInt
Nur für Genauigkeiten von über 15 Stellen hinaus, für das Web selten bis nie notwendig.
BigInt Nummern müssen als solche generiert werden, bevor sie außerhalb des
15 Stellen Bereichs kommen (enden mit n).
const bigNumber = 333444555666777888999;
const bigIntNumber = 333444555666777888999n;
// Zur Umwandlung in BigInt während der Laufzeit -> Konstruktorfunktion BigInt()
const bigIntClass = BigInt(333444555666777); // muss weniger als 15 Stellen haben
const bigIntClass2 = BigInt(333444555666777888999); // wird bereits gerundet übergeben
console.log(bigNumber); // wird in Ausgabe gerundet
console.log(bigIntNumber); // korrekte Ausgabe
console.log(bigIntClass);
console.log(333444555666777888999 == 333444555666777888111); // true, obwohl ungleich, da Rundung
console.log(333444555666777888999n == 333444555666777888111n); // false -> OK
Operatoren
Numerische Operatoren
+Addition-Subtraktion*Multiplikation/Division%Modulo / Rest einer ganzzahligen Division**Potenz (seit ES7)
console.log(12 / 6); // 2
console.log(12 % 6); // 0
console.log(12 % 7); // 5
console.log(2 * 40 + 8 / 2); // 84 (Punkt vor Strich)
console.log(2 * (40 + 8) / 2); // 48 (Klammern zuerst)
let a = 2, b = 3, c;
a += b; // identisch zu a = a + b;
// Mehrfachzuweisung
a = b = c = 42;
console.log(a);
Inkrement / Dekrement Operator
++ um 1 erhöhen
-- um 1 verringern
/*
Inkrement- / Dekrement-Operator
Operator Beispiel Interpretation
++ a = ++b b = b + 1; a = b
++ a = b++ a = b; b = b + 1
-- a = --b b = b - 1; a = b
-- a = b-- a = b; b = b - 1
*/
let a = 1;
console.log(a++); // 1
console.log(a); // 2
a = 1;
console.log(++a); // 2
console.log(a); // 2
Hint
Inkrement/Dekrement vor der Variablen: Inkrement/Dekrement vor Zuweisung
Inkrement/Dekrement nach der Variablen: Inkrement/Dekrement nach Zuweisung
Verkettungs-Operator (+)
Verkettung von Strings:
Important
Mindestens ein Wert muss ein String sein, der/die andere(n) werden zum String konvertiert (implizite Typenumwandlung).
let userName = "Jessica";
console.log("Hey " + userName + ". Schön, dass du da bist.");
let a = "1"; // string
let b = 2, c = 3; // number
console.log(b + c); // 5 (number)
console.log(a + b + c); // "123" (string) -> keine Verkettung
console.log(a + (b + c)); // "15" (string)
// --> implizite Typ-Konvertierung (string wird bevorzugt)
Relationale Operatoren
<kleiner als>größer als<=kleiner gleich>=größer gleich==gleich (Datentyp wird implizit konvertiert)===gleich (Datentyp wird nicht verändert, daher wird Typengleichheit mit geprüft)!=ungleich (Datentyp wird implizit konvertiert)!==ungleich (Datentyp wird nicht verändert, daher wird Typengleichheit mit geprüft)
Rückgabe ist stets ein boolean (true/false).
console.log(3 < 42); // true
console.log("3" < 42); // true (string wird implizit konvertiert)
console.log("42" == 42); // true (string wird implizit konvertiert)
console.log("42" === 42); // false (unterschiedlicher Datentyp)
console.log(100 < 42); // false
console.log("100" < 42); // false (string wird implizit konvertiert)
console.log("100" < "42"); // true (ASCII Nummer werden zeichenweise verglichen, hier: 1 < 4 -> true)
console.log("3 Autos" > 2); // false (da "3 Autos -> NaN", NaN-Vergleiche sind stets false)
// NaN Vergleiche (immer false) -> stattdessen isFinite() oder isNaN() nutzen
console.log(NaN == NaN); // false
console.log(Number("3 Autos") == NaN); // false
Typenkonvertierung
In JavaScript können Datentypen explizit über einen Ausdruck konvertiert werden, werden allerdings auch bei bestimmten Operation (z.B. Addition) implizit nur für diese Operation konvertiert.
Implizierte Typenkonvertierung
let a = "2", b = 4;
console.log(a * b); // 8 (number)
console.log(a / b); // 0.5 (number)
// --> bei '-', '*' und '/' werden Operanden in Number konvertiert
console.log("15" - "8"); // 7 (number)
console.log("Jessy" - 3); // NaN (number) => NaN - 3 = NaN
Explizite Typenkonvertierung
let a = "3", b = 4, c = 2;
console.log(a + b); // "34"
console.log((a * 1) + b); // 7 (number) - implizite Typenkonvertierung nutzen
console.log(+a + b); // 7 (number) - unary plus Operator wird genutzt
console.log(Number(a) + b); // 7 (number)
console.log(Number("-20.123")); // -20.123 (number)
console.log(Number("Elektra")); // NaN
console.log(Number(" 45 ")); // 45 --> Leerzeichen werden entfernt
console.log(Number("45 34")); // NaN --> Innenliegende Leerzeichen
console.log(Number("10px")); // NaN
console.log(Number("10,20")); // NaN
console.log(Number("")); // 0
console.log(Number(null)); // 0
console.log(Number(false)); // 0
console.log(Number(true)); // 1
console.log(Number(undefined)); // NaN
/* commented out to prevent prompt
let price_1 = prompt("Preis Artikel 1:", (10)); // 10 wird als Ausdruck übergeben, daher Klammern
let price_2 = prompt("Preis Artikel 2:", (10));
console.log(price_1 + price_2); // 1010 -> NOK
console.log(Number(price_1) + Number(price_2)); // 20 -> OK
*/
Über parseInt() wird versucht, einen Ausdruck in einen Integer zu konvertieren.
Ausdruck kann alles mögliche sein (muss in Klammern übergeben wird)
console.log(parseInt("42")); // 42 (number)
console.log(parseInt("42.42")); // 42, da nur ganzzahlig abgerundet
console.log(parseInt("Elektra")); // NaN
console.log(parseInt(" 4256 ")); // 4256
console.log(parseInt("42 56")); // 42 -> nur erste Zahl wird geparst
console.log(parseInt("16px")); // 16 -> px wird ignoriert, gut zum Verändern von Web-Elementen
console.log(parseInt(null)); // NaN
console.log(parseInt(true)); // NaN
// parseFloat() versucht übergebenen Ausdruck in Dezimalzahl zu überführen
console.log(parseInt("42.42")); // 42.42
Datentyp ermitteln
Durch den typeof Operator. Gibt stets den Datentyp als String zurück.
// Datentyp ermitteln durch typeof-Operator
// Syntax: typeof Operand
// Rückgabe = Datentype als String
let output; // 'undefined' ist ein eigener Datentype
output = 42;
output = "42";
output = true;
output = null; // 'null' ist ein eigener Objekttype obwohl 'object' angegeben ist
output = NaN;
let dataType = typeof output;
let dataType2 = typeof typeof output; // type 'string' da das rechte typeof einen String zurückgibt
console.log(output, dataType);
Test auf NaN
Zur Prüfung ob eine Variable eine Number ist oder nicht (isNaN()).
/*
isNaN() liefert true, wenn Konvertierung gescheitert (wenn NaN)
isNaN() liefert false, wenn Konvertierung in Number erfolgreich
*/
console.log(isNaN("42")); // false
console.log(isNaN("42 Jahre")); // true (da NaN)
console.log(isNaN(NaN)); // true
Test auf Infinite oder Finite (isFinite()).
/*
isFinite() prüft ob n endlich ist (im Wertebereich liegt)
liefert false, wenn n = Infinity || -Infinity || NaN
ansonsten true
*/
console.log(isFinite(42 / 4)); // true
console.log(isFinite(42 / 0)); // false (Infinite)
console.log(isFinite(0 / 0)); // false (NaN)
Beispielobjekt: Math
Sammlung von mathematischen Konstanten und Funktionen.
console.log(Math) // Überblick über Objekt
// Konstante PI
console.log(Math.PI);
// Quadratwurzel ziehen
console.log(Math.sqrt(16)); // 4
// Potenz ermitteln
console.log(Math.pow(10, 2)); // 10^2 = 100
// maximaler/minimaler Wert ermitteln
console.log(Math.max(2,11,6,99,43,56,23)); // 99
console.log(Math.min(2,11,6,99,43,56,23)); // 2
// absolute Zahl ermitteln
console.log(Math.abs(-42.234)) // 42.234
// Zufallszahl
console.log(Math.random()) // 0 ... 1 (exclusive 1)
// Runden
// Immer abrunden
console.log(Math.floor(2.99)); // 2
// Immer aufrunden
console.log(Math.ceil(2.1)); // 3
// kaufmännisches Runden
console.log(Math.round(1.4999)); // 1
console.log(Math.round(1.5)); // 2
// Runden auf Nachkommastellen
// Syntax: (number).toFixed(anzahl_nachkommastellen)
// Rückgabe = string
let number = 10.12345;
console.log((number).toFixed()); // 10
console.log((number).toFixed(2)); // 10.12
console.log((number).toFixed(4)); // 10.1235