Grundlagen
Historie von JavaScript
- LiveScript (1995) im Netscape Navigator 2.0
- Entwickelt von Brendan Eich
- umbenannt in JavaScript (Name wurde von Sun lizensiert)
- hat aber nichts mit Java tu tun
- von Netscape an Microsoft lizenziert
JScript (1996) von Microsoft eingeführt
- lizenzunabhängige Sprachvariante
- mit Erweiterungen durch Microsoft
- ECMAScript (1997) – ECMA-262
- European Computer Manufacturer's Association, Genf
- Standardisierung des Sprachkerns von JavaScript
- sollte den Browserkrieg befrieden
- aktuelle Version ECMA2022
Anwendung von JavaScript
- Benutzerinteraktion auf Clientseite
- Verbesserte Navigation
- Überprüfung von Benutzereingaben vor dem Absenden des Formulars
- Dynamische Modifikation von HTML-Seiten zur Laufzeit
- Strukturanpassungen durch Einfügen / Entfernen von HTML-Elementen
- Formatanpassungen durch Ändern von CSS-Einstellungen
- Nachladen von Daten, ohne die HTML-Seite neu zu laden
- AJAX (Asynchronous JavaScript and XML), Frame-Ersatz
- Nachbildung von GUI-Elementen, die in HTML fehlen
Beispiel: Hello World in JavaScript
alert("Hello World!");
Eigenschaften von JavaScript
- C ähnlicher Syntax
- Frei formatierbar
- Interpretiert
- Schwaches Typsystem (loosely-typed)
- Garbage-Collection (ähnlich zu Java)
- Ausschließlich Fließkommazahlen
- Strings in Unicode
- Keine Klassen
- Objekte haben Properties und Methoden
- objektbasiert aber nicht objektorientiert
- Variablen und Funktionen können jederzeit angelegt werden
- Variable Anzahl von Parametern für Funktionen
- Portabel und hardwareunabhängig
Vergleich mit Java
- Ähnlicher Syntax
- Blöcke mit
{ } - Kontrollstrukturen:
if, switch, for, while, do, try catch - Kommentare:
//, /*...*/ - Stringverkettung mit
+
- Variablen sind dynamisch typisiert
- keine Typdeklaration, Variable kann nacheinander unterschiedliche Typen halten
- Zahlen sind immer Gleitkommazahlen (kein
int, keinshort, …) letodervarleiten Variablendeklaration einconstdefiniert Konstantenfunctionleitet Funktionsdeklaration ein
let a = 5;
const b = 7;
function f(a) { /* */ }
- Objekterzeugung erfolgt mit
new - Statements werden mit
;beendet - Am Zeilenende darf
;fehlen, wird automatisch eingefügt - kein Zeilenende hinter
returnoder vor++bzw.--
Sichtbarkeit von Variablen
- Deklaration mit
var - sind in der ganzen Funktion sichtbar
- Blöcke haben (anders als in Java) keine Auswirkungen auf die Sichtbarkeit
- Deklaration mit
let - haben Block-Scope (wie in Java)
Moderner JavaScript-Code verwendet
var nicht mehr Sichtbarkeit von Variablen (var)
var a = 5; // global sichtbar
function f() {
var b = 7; // innerhalb der Funktion sichtbar
if (b === 7) {
var c = 9; // innerhalb der Funktion sichtbar
}
log("a = " + a);
log("b = " + b);
log("c = " + c);
}
f();
Sichtbarkeit von Variablen (let)
let a = 5; // global sichtbar
function f() {
let b = 7; // innerhalb der Funktion sichtbar
if (b === 7) {
let c = 9; // innerhalb des Blocks sichtbar
}
log("a = " + a);
log("b = " + b);
log(typeof c);
}
f();
Datentypen in JavaScript
Eingebaute Datentypen von JavaScript
Boolean: Wahrheitswert (trueoderfalse)Number: Ganz- oder FließkommazahlString: ZeichenketteDate: DatumArray: Indiziertes oder assoziatives ArrayObjekt: Vor- oder selbstdefinierte ObjekteFunction: Funktionen
Typumwandlung
Typumwandlung erfolgt implizit
- hin zum größeren Typ
- keine Genauigkeitsverluste bei Zuweisung
Zwei Vergleichsoperatoren
==Vergleich mit Typumwandlung===Vergleich ohne Typumwandlung
typeof(variable) liefert den Datentyp der Variablen
Beispiel: Typumwandlung
let a = "10";
let b = 10;
log("typeof(a) = " + typeof(a));
log("typeof(b) = " + typeof(b));
let c1 = (a == b);
let c2 = (a === b);
log("c1 = " + c1);
log("c2 = " + c2);
Truthiness
- JavaScript Operatoren
||,&&und Kontrollstrukturen (z. B.if) arbeiten mit booleschen Werten, beliebige Daten können übergeben werden und werden zutrue/falsekonvertiert - Truthiness legt fest, welche Werte als
truebzw.falseangesehen werden - falsch sind
false,""0,-0,NaNnull,undefined- wahr sind alle anderen Werte ⇒ Anders als in vielen anderen Sprachen
Beispiel: Truthiness
if (!0) { log("0 == false"); }
if (1) { log("1 == true"); }
if (!NaN) { log("NaN == false"); }
if (!'') { log("'' == false"); }
if ('Hallo') { log("'Hallo' == true"); }
if (!null) { log("null == false"); }
Not a Number (NaN)
- Bei Zahlen repräsentiert
NaNden ungültigen Wert Not a Number - Kein Wert ist gleich
NaN(auch nichtNaNselbst)
log(1 / 0);
log(0 / 0);
log(0 === NaN);
log(NaN === NaN)
Einfache Literale
Notation wie in Java mit Besonderheiten bei Strings
let antwort = 42; // Integer-Literal
let pi = 3.141; // Fließkomma-Literal
let happy = true; // Boolean-Literal
let leer = null; // Null-Literal
// String-Literale
let s1 = 'Hallo';
let s2 = "Hallo";
let s3 = 'String "im String" geht auch';
let s4 = "String 'im String' geht auch";
let s5 = "String " + "Anhang";
let s6 = "\"Escapen von Zeichen\"";
let s7 = "\u00ea Unicode";
Template-Literals
Template-Literals
- Die meisten Skriptsprachen können Variablen in Strings ersetzen
- JavaScript kannte diesen Mechanismus ursprünglich nicht
- Mit ECMAScript 6 wurde er eingeführt, konnte aber aus Kompatibilitätsgründen nicht für
"- und'-Strings aktiviert werden ⇒ Neuer Begrenzer `
let name = "Thomas";
let hello = `Hello ${ name }.`;
log(hello);
Ausnahmebehandlung
try, catch, finally ähnlich wie in Java
- Ausnahmen sind nicht typisiert
- daher nur ein
catch-Block protry finallywird immer ausgeführt
Beispiel: Ausnahmen
try {
log("Vor dem throw...");
throw { name: "Fehlermeldung" };
log("Nach dem throw...");
}
catch (e) {
// Fehlerbehandlung
log("Ooops: " + e.name);
}
finally {
// wird immer ausgeführt
log("finally");
}