Webtechnologien Teil 15: JavaScript - Teil I
Webtechnologien Teil 15: JavaScript - Teil I
Webtechnologien Teil 15: JavaScript - Teil I
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Webtechnologien</strong><br />
<strong>Teil</strong> <strong>15</strong>: <strong>JavaScript</strong> - <strong>Teil</strong> I<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I 28.10.13 1
Literatur<br />
[<strong>15</strong>-1] Flanagan, David: <strong>JavaScript</strong>. Kurz & Gut. O'Reilly, 4. Auflage, 2012<br />
[<strong>15</strong>-2] Lubkowitz, Mark: Webseiten programmieren und gestalten. Galileo<br />
Computing, 2003<br />
[<strong>15</strong>-3] Münz, Stefan: . Addison-Wesley, 2005<br />
[<strong>15</strong>-4] Steyer, Ralph: <strong>JavaScript</strong>. Addison-Wesley, 2007<br />
[<strong>15</strong>-5] Steyer, Ralph: Das <strong>JavaScript</strong> Codebook. 2. Auflage, Addison-Wesley, 2005<br />
[<strong>15</strong>-6] Flanagan, David: <strong>JavaScript</strong> – Das umfassende Referenzwerk. O'Reilly, 6.<br />
Auflage, 2012 (1.200 Seiten)<br />
[<strong>15</strong>-7] Nix, Markus: Musterhaft - Design Patterns mit <strong>JavaScript</strong>. Linux Enterprise,<br />
1/2.2004, S.62-65<br />
[<strong>15</strong>-8] Stefanov, Stoyan: <strong>JavaScript</strong> Patterns. O'Reilly, 2011<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
2
Web – Literatur und Werkzeuge<br />
[W1]<br />
[W2]<br />
[W3]<br />
[W4]<br />
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-<br />
262.pdf<br />
http://de.wikipedia.org/wiki/<strong>JavaScript</strong><br />
Zum Prüfen auf syntaktische Korrektheit: JSLint<br />
http://www.jslint.com<br />
Zum schnellen Testen: <strong>JavaScript</strong> Shell<br />
http://www.squarefree.com/shell<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
3
Realisierung aktiver Inhalte<br />
Von 480.000 untersuchten Websites benutzten 2005:<br />
44,0% <strong>JavaScript</strong><br />
6,0% Flash<br />
2,4% iframes<br />
1,5% Java-Applets<br />
0,3% VBScript<br />
Zitiert nach CT 9/2005, S. 93<br />
Dank Ajax und Bibliotheken wie JQuery ist der Anteil heute viel höher.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
4
Geschichte<br />
• Ursprünglich von Netscape ab 1995 entwickelt<br />
• Standardisiert durch die ECMA:<br />
ECMAScript in den Versionen 1 bis 3 und 5<br />
• Aktuelle Version: 1.8.5<br />
• Wie bei CSS gibt es bei den Browsern viele Inkompatibilitäten,<br />
besonders bei ECMAScript5 und HTML5<br />
• JS = <strong>JavaScript</strong><br />
• <strong>JavaScript</strong> hat nichts mit Java zu tun...<br />
• Mit JS wird auf dem Browser aktiver Code ausgeführt.<br />
• Es gibt auch Server, die dies auch auf der Serverseite ausführen –<br />
dies wird hier nicht behandelt.<br />
• Auch Versionen von PDF haben <strong>JavaScript</strong> integriert.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
5
Versionen I<br />
Unterstützung der <strong>JavaScript</strong>-Versionen nach Browsern:<br />
<strong>JavaScript</strong> JScript Netscape Explorer Opera Firefox<br />
1.0 1.0 2.0 3.0 3.0 -<br />
1.1 2.0 3.0 3.0 3.0 -<br />
1.2 - 4.0 4.0, teilweise -<br />
1.3 3.0 4.05-4.7 5.0 5.0 -<br />
1.4 - ab 6.0 - 6.0 -<br />
- 5.0 5.0-6.0 -<br />
1.5 5.5 ab 6.0 ab 8.0 ab 7.0 ab 1.0<br />
1.6 - - ab 1.5<br />
1.7 - - ab 2.0<br />
1.8 - ab 9.0 ab 3.0<br />
Die Korrespondenzen innerhalb einer Zeile sind meist nur Ähnlichkeiten.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
6
Versionen II – ECMA 262<br />
• ECMAv1 entspricht <strong>JavaScript</strong> 1.3 und JScript 3.0<br />
• ECMAv2 ist eine redaktionelle Überarbeitung von ECMAv1<br />
• ECMAv3 entspricht <strong>JavaScript</strong> 1.5<br />
• ECMAv4 ist nie frei gegeben worden<br />
• ECMAv5.1 ist aktuell<br />
http://www.ecma-international.org/publications/files/ECMA-<br />
ST/Ecma-262.pdf<br />
• ECMAv6 ist in Arbeit<br />
In diesem <strong>Teil</strong> wird <strong>JavaScript</strong> in der Version 1.5 behandelt.<br />
Die aktuelle Version ist 1.8.5 von 2010.<br />
Siehe http://de.wikipedia.org/wiki/<strong>JavaScript</strong><br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
7
Aufrufen und Einbinden I<br />
<br />
... <strong>JavaScript</strong>...<br />
<br />
<br />
<br />
<br />
<br />
• <strong>JavaScript</strong> kann innerhalb des Kopfes oder an beliebiger Stelle im Body stehen.<br />
• Die Statements werden innerhalb der Datei von vorn nach hinten ausgeführt.<br />
• Deklarationen sollten aber möglichst vorne im Kopf stehen.<br />
• Wenn die externe Dateiform benutzt wird, dürfen in der *.js-Datei keine HTML-<br />
Kommentare stehen.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
8
Bemerkungen<br />
• Vermeiden Sie einen leeren Inhalt bei den Tags, also nicht:<br />
<br />
schreiben. Schreiben Sie es so wie in der vorherigen Folie:<br />
<br />
<br />
• Das Type-Attribut kann weggelassen werden, der Defaultwert ist<br />
text/javascript.<br />
• Auch die Angabe von "<strong>JavaScript</strong>" kann weggelassen werden, da<br />
<strong>JavaScript</strong> der Default ist<br />
(dies sollte jedoch unterlassen werden).<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
9
Aufrufen und Einbinden II – Alte Browser<br />
<br />
... <strong>JavaScript</strong>...<br />
<br />
• Müssen versionsspezifische Konstrukte benutzt werden, sollte die<br />
niedrigste, erforderliche Versionsnummer angegeben werden. Die<br />
Angabe der Version im SCRIPT-Tag führt dazu, dass der umschlossene<br />
<strong>Teil</strong> ab einschließlich der angegebenen Version ausgeführt wird.<br />
• Zwischen "<strong>JavaScript</strong>" und der Versionsangabe dürfen keine Blanks<br />
stehen.<br />
• Default ist die Version 1.0, wobei "<strong>JavaScript</strong>1.0" nicht angegeben<br />
werden sollte, da der Explorer damit nicht klar kommt.<br />
<br />
....Normaler HTML-Code...<br />
<br />
• Für Browser mit ausgeschaltetem JS kann JS-freier Code durch das<br />
noscript-Element geklammert werden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
10
Aufruf über eine URL I - Adresszeile<br />
javascript: Name-Der-JS-Routine [Parameter]<br />
• Wenn als Protokoll in der Adresszeile "javascript" benutzt wird, rufen<br />
<strong>JavaScript</strong>-fähige Browser das in der URL angegebene Script auf - anstatt<br />
eine Seite zu laden.<br />
• Überall, wo in der Datei eine URL stehen kann, kann über diesen<br />
Mechanismus ein JS-Statement ausgeführt werden.<br />
Dies wird "Inline-Referenz" genannt.<br />
• Derselbe Mechanismus kann auch in Formularen beim action-Attribut<br />
benutzt werden.<br />
Beispiel:<br />
... Text ... <br />
Dies wird selten verwendet und sollte vermieden werden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
11
Syntax<br />
• Bezeichner sind Groß-/Kleinschreibung-sensitiv.<br />
Bezeichner müssen mit einem Buchstaben beginnen, gefolgt von<br />
Buchstaben, Ziffer oder Unterstrich ("_").<br />
• Bezeichner sollten kürzer als 32 Zeichen sein.<br />
• Reservierte Bezeichner können nicht umdefiniert werden und werden<br />
immer klein geschrieben.<br />
• Leerzeichen haben keine Bedeutung; wo ein Leerzeichen stehen<br />
kann, kann auch ein Zeilenende stehen.<br />
Aber: Ist der Rest auf einer Zeile ein gültiges, aber unvollständiges<br />
Statement, dann interpretieren die Browser dies fälschlicherweise als<br />
vollständig,<br />
d.h. jedes Statement vollständig in eine Zeile schreiben.<br />
• Kommentare<br />
– // bis zum Ende der Zeile wie in C++ und Java<br />
– /* ... */ über Zeilenenden hinweg<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
12
Variablen, Typen und Zuweisungen<br />
var variable [= Expression] [, variable [= Expression] ...];<br />
variable= Expression;<br />
• Variablen sollten deklariert werden; dies erfolgt ohne Typangabe.<br />
• Variablen müssen deklariert werden, wenn sie lokal zu einer Funktion sein<br />
sollen.<br />
• Es wird empfohlen immer alle Variablen zu deklarieren.<br />
• Der Typ einer Variablen ist der Typ der Daten auf der rechten Seite der<br />
zuletzt ausgeführten Zuweisung (wie in PHP).<br />
• Variablen können gleich bei der Deklaration einen Wert und damit einen<br />
Typ erhalten.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
13
Ganze Zahlen (integer und real)<br />
var dez= 16;<br />
var okt= 016;<br />
var hex= 0x16;<br />
var float= 1.6e4;<br />
// Oktal!<br />
• Die Typen von Zahlen werden wie in C/C++/Java behandelt:<br />
– "Normale" Darstellung: Dezimal<br />
– Vorlaufende 0: Oktal<br />
– Vorlaufendes 0x: Hexadezimal<br />
– Punkt und/oder Exponent ("e"): floating point<br />
• Floating Point-Variablen sind 64 bit lang<br />
(entspricht double in Java)<br />
• In <strong>JavaScript</strong> werden integer, float und double zu number zusammen<br />
gefasst, siehe dazu<br />
http://www.html-seminar.de/javascript-datentypen.htm.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
14
Zeichenketten (Strings) I<br />
var num= 1;<br />
var zeich= "1";<br />
var char= '1';<br />
(1) char= zeich+zeich; /* ergibt "11" */<br />
(2) num= num+num; /* ergibt 2 */<br />
(3) zeich= ""+num; /* ergibt "2" */<br />
• Zeichenketten werden in einfache oder doppelte Anführungszeichen -<br />
jedoch nicht gemischt - eingeschlossen.<br />
• Die Operation "+" zwischen Strings setzt die Strings zusammen,<br />
während bei Zahlen addiert wird (also wie in Java).<br />
• Der Typ des Ausdrucks wird durch die Konvertierung bestimmt, siehe<br />
Zeile (3). Hier wird der numerische Wert in eine Zeichenkette<br />
konvertiert und mit dem leeren String verbunden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
<strong>15</strong>
Zeichenketten (Strings) II - Typ<br />
Beispiel Ergebnis Typ<br />
" Bäume haben " + 8 " Bäume haben 8" String<br />
" Bäume haben " + 7*7 " Bäume haben 49" String<br />
7 + 6 +" Bäume haben " "13 Bäume haben " String<br />
" Bäume haben " + 4 + 8 " Bäume haben 48" String<br />
"7" * 8 56 Integer<br />
"7" + 8 "78" String<br />
Tipp: Lassen Sie alle Tricks!<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
16
Zeichenketten (Strings) III<br />
Das Escape-Zeichen in Strings ist der Backslash "\":<br />
\n New Line<br />
\r Carriage Return (dieselbe Zeile)<br />
\t Horizontaler Tabulator vorwärts<br />
\f Form Feed: Seitenvorschub<br />
\b Backspace: eine Zeichenposition zurück<br />
\" " selbst<br />
\'<br />
' selbst<br />
\\ \ selbst<br />
\ooo Zeichen aus ISO 8859-1 mit drei Oktalziffern o<br />
\xhh Zeichen aus ISO 8859-1 mit zwei Hexadezimalziffern h<br />
\uhhhh Zeichen aus ISO 8859-1 mit vier Hexadezimalziffern h<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
17
typeof-Operator<br />
Beispiel<br />
var ID= 7;<br />
typeof ID;<br />
var ID= "Hallo!";<br />
typeof ID;<br />
var ID= false;<br />
typeof ID;<br />
Ergebnis von typeof<br />
"number"<br />
"string"<br />
"boolean"<br />
Um den aktuellen Typ eines Objekts herauszubekommen, wird der<br />
typeof-Operator benutzt.<br />
Darüber hinaus gibt es noch folgende Typen:<br />
(1) "function"<br />
(2) "object"<br />
(3) "undefined" als besonderer "Typ"<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
18
Konstanten und Vergleichsoperatoren<br />
Konstanten<br />
true (wahr)<br />
false (falsch)<br />
Operator Bedeutung Bemerkungen<br />
== Gleichheit Wertgleichheit NACH Konvertierung<br />
!= Ungleichheit Ungleichheit NACH Konvertierung<br />
< Kleiner als<br />
> Größer als<br />
= Größer-gleich als<br />
=== Identität Wertgleichheit OHNE Konvertierung<br />
!== Nicht-Identität Ungleichheit OHNE Konvertierung<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
19
Arithmetische Operatoren I<br />
Operator Erläuterung Beispiel Ergebnis<br />
+ Addition 2+2 4<br />
- Subtraktion 2-1 1<br />
* Multiplikation 2*3 6<br />
/ Division 16/4 4<br />
% Modulo 7%3 1<br />
++ Inkrement a= 10;<br />
a++<br />
11<br />
-- Dekrement a= 10;<br />
--a<br />
9<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
20
Arithmetische Operatoren II<br />
Statement Ergebnis Wert von a Wert von b<br />
a= 5;<br />
b= 1.5;<br />
a++ + b 6.5 6 1.5<br />
++a + b 8.5 7 1.5<br />
a-- + b 8.5 6 1.5<br />
--a + b 6.5 5 1.5<br />
Die Post-Operation wird am Ende des Statements ausgeführt,<br />
die Pre-Operation vor dem Auswerten des (<strong>Teil</strong>-)Ausdrucks.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
21
Logische und Bit-Operatoren<br />
Operator Erläuterung Beispiel Ergebnis<br />
&& Und/And true && false false<br />
|| Oder/Or true && false true<br />
! Nicht/Negation !True false<br />
Operator Erläuterung Beispiel Ergebnis<br />
& Bitweises Und 1010 & 0110 0010<br />
| Bitweises Oder 1010 | 0110 1110<br />
~ Bitweise Negation ~ 1010 0101<br />
^ Bitweises XOR 1010 ^ 0110 1100<br />
Rechtsshift 1010 >> 2 0010<br />
>>> Null-Füll-Rechtsshift 1010 >> 1 0101<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
22
Bemerkung<br />
• Beim Rechtsshift um 1 bit gibt es zwei Möglichkeiten zur<br />
Behandlung des Vorzeichenbits:<br />
– Es wird das Vorzeichen-Bit verdoppelt.<br />
– Es wird als höchstes Bit eine 0 benutzt unabhängig vom alten<br />
Vorzeichenbit, was bedeutet, dass negative Zahlen positiv werden.<br />
Daher gibt es zwei Rechts-Shift-Operatoren.<br />
• Das niederwertigste Bit geht in jedem Fall verloren.<br />
Dies gilt genauso für C, C++, Java und PHP.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
23
Zuweisungen<br />
Operator Erläuterung Beispiel Ergebnis<br />
= Zuweisung A = 5 5<br />
+= Addition mit Zuweisung A +=5 10<br />
+= Anfügung mit Zuweisung B= "Schön"<br />
B += "heit"<br />
-= Subtraktion mit Zuweisung A -= 2 8<br />
*= Multiplikation mit Zuweisung A *= 2 16<br />
/= Division mit Zuweisung A /=4 4<br />
%= Modulo mit Zuweisung A %= 3 1<br />
&= Bit-Und mit Zuweisung A &= 3 1<br />
^= Bit-XOR mit Zuweisung A ^= 3 2<br />
|= Bit-Oder mit Zuweisung A |= 7 7<br />
= 2 12<br />
>>>= Null-Füll-Rechtsshift mit Zuweisung A >>>= 2 3<br />
"Schönheit"<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
24
IF-Konstrukt I<br />
if (Bedingung) {<br />
...<br />
} else {<br />
...<br />
}<br />
if (Bedingung) {<br />
...<br />
}<br />
• Das IF-Konstrukt entspricht dem von C/C++/Java.<br />
• Die geschweiften Klammern können bei nur einem Statement im Block<br />
weggelassen werden (wovon dringend abgeraten wird).<br />
• Hinter jeder Anweisung innerhalb der Blöcke muss ein ";" stehen,<br />
nicht jedoch nach einem IF-Konstrukt.<br />
• Es gibt keine Zusammenfassungen geschachtelter Konstrukte wie elif<br />
o.ä.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
25
IF-Konstrukt II<br />
(condition) ? TruePart : FalsePart<br />
Beispiel:<br />
Zeit= '7 ' + (Zeit>12) ? 'PM': 'AM';<br />
• Eine derartige IF-Konstruktion kann auch als <strong>Teil</strong> von Ausdrücken<br />
benutzt werden (wovon abgeraten wird).<br />
Dies gilt genauso für C, C++, Java und PHP.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
26
Switch-Konstrukt I<br />
switch(Expression) {<br />
case Const: ...;<br />
break;<br />
case Const: ...;<br />
break;<br />
default: ...;<br />
}<br />
switch(Tag) {<br />
case "Montag": ...;<br />
break;<br />
case "Dienstag": ...;<br />
break;<br />
default: ...;<br />
}<br />
• Dies entspricht dem von C/C++/Java, wobei die Art der Konstanten hinter<br />
dem case offener ist: es sind hier auch Strings erlaubt.<br />
• Const kann auch ein Ausdruck mit Konstanten sein.<br />
• Die Datentypen der Ausdrücke hinter dem case und dem anschließenden<br />
Doppelpunkt können bei den einzelnen Fällen unterschiedlich sein.<br />
• Das Switch wird in sequentieller Reihenfolge mit dem Ausdruck hinter dem<br />
switch, also der Expression mit der Identität === solange verglichen bis<br />
ein wahr heraus kommt.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
27
While-Schleife I<br />
while (Bedingung) {<br />
...<br />
}<br />
do {<br />
...<br />
} while (Bedingung);<br />
• Die Bedingung der while-Schleife wird initial geprüft und die Schleife<br />
solange durchlaufen bis die Bedingung falsch ist.<br />
• Die do-Schleife wird mindestens einmal durchlaufen; solange diese Prüfung<br />
den Wert True liefert, wird die Schleife erneut durchlaufen.<br />
• Das do-while-Konstrukt wird mit einem Semikolon abgeschlossen. Dies ist<br />
das einzige Kontrollkonstrukt mit einem Semikolon als Abschluss.<br />
• Das scheinbar überflüssige Semikolon stellt eine leere Anweisung dar.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
28
While-Schleife II<br />
<br />
var i= 0;<br />
while (i
For-Schleife I<br />
for (Init; Condition; Increment) {<br />
...<br />
}<br />
Das For-Konstrukt<br />
entspricht<br />
dem aus C/C++/Java.<br />
for (Variable in Objekt) {<br />
...<br />
}<br />
Die Schleife wird für jede<br />
Eigenschaft des Objektes<br />
durchlaufen.<br />
Für "for (Variable in Objekt) {...}" gibt es folgende Hinweise:<br />
• Die Reihenfolge der Schleifendurchläufe ist undefiniert.<br />
• Der Laufvariablen wird der Name des Attributes als String<br />
zugewiesen, nicht als Objekt.<br />
• Der Zugriff auf das Attribut selbst kann über das Objekt als<br />
assoziatives Array erfolgen: Objekt[Laufvariable].<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
30
For-Schleife II<br />
<br />
var i;<br />
for (i= 0; i
Break und Continue<br />
• In jeder For-/While-/Do-Schleife können break und continue<br />
benutzt werden:<br />
– Break:<br />
Die Schleife wird abgebrochen, alle Variablen behalten ihren<br />
augenblicklichen Wert.<br />
– Continue:<br />
Es wird unmittelbar zum internen Schleifenende gesprungen und<br />
die Abbruchbedingung geprüft.<br />
• Beide Konstrukte haben dieselbe Bedeutung wie in C/C++ und<br />
Java.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
32
Eine Ausnahme werfen...<br />
throw Ausdruck;<br />
Eine Ausnahme signalisieren.<br />
try {<br />
}<br />
...Anweisungen...<br />
Block mit Anweisungen, deren<br />
Ausnahmen behandelt werden<br />
catch(Variable) {<br />
...Anweisungen...<br />
}<br />
finally {<br />
...Anweisungen...<br />
}<br />
Die Nummer der Ausnahme wird der<br />
Variablen zugewiesen und die<br />
Anweisungen ausgeführt.<br />
Block mit Anweisungen, die immer<br />
nach try/catch ausgeführt werden<br />
Entweder wird catch oder finally benutzt, aber immer eins von<br />
beiden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
33
Prozeduren und Funktionen<br />
function Name([Parameterliste]) { /* Deklaration */<br />
...<br />
}<br />
...<br />
Name([Parameterliste]); /* Aufruf */<br />
...<br />
function Name([Parameterliste]) { /* Deklaration */<br />
...<br />
return Expression;<br />
}<br />
....<br />
Variable= Name([Parameterliste]); /* Aufruf */<br />
• Zwischen Prozeduren und Funktionen besteht nur der Unterschied, dass<br />
letztere ein return haben.<br />
• Parameterlisten können deklariert werden.<br />
• Parameterlisten können von Aufruf zu Aufruf unterschiedlich lang sein.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
34
Funktionen I - Beispiele<br />
function Mod(Wert,Divi) { /* Deklaration */<br />
Resultat= Wert%Divi; /* nicht deklariert */<br />
return Resultat;<br />
}<br />
value= Modu(23,7); /* Aufruf */<br />
function Modulo(Wert,Divi) {<br />
if (Divi==0) {<br />
return undefined; /* Schlüsselwort */<br />
} else {<br />
Resultat= Wert%Divi;<br />
return Resultat;<br />
}<br />
}<br />
value= Modulo(23,7);<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
35
undefined und null<br />
• undefined ist der Wert einer angelegten Variablen, der noch nie<br />
etwas zugewiesen wurde (entspricht dem NULL in PHP).<br />
• Die Abfrage auf undefined sieht z.B. so aus:<br />
if (x==undefined) {<br />
... x hat undefined als Wert ...<br />
}<br />
• Werden nicht-existente Objekteigenschaften abgefragt, wird<br />
undefined geliefert.<br />
• null ist der Wert eines Objekts, das keinerlei Werte irgendeines<br />
Typs enthält.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
36
Funktionsreferenz I<br />
function plus(a,b) {<br />
return a+b;<br />
}<br />
function minus(a,b) {<br />
return a-b;<br />
}<br />
var sum= plus(2,3);<br />
var op= plus; // Referenz auf plus()<br />
sum= op(2,3); // Aufruf von plus(2,3)<br />
op= minus;<br />
sum= op(2,3); // welchen Wert hat sum?<br />
• Wird der Name einer Routine ohne "()" benutzt, so ist damit eine<br />
Referenz auf die Funktion gemeint, also dessen Adresse.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
37
Funktionsreferenz II - Das Beispiel dazu<br />
function plus(a,b) {<br />
return a+b;<br />
}<br />
function minus(a,b) {<br />
return a-b;<br />
}<br />
...<br />
var sum= plus(2,3);<br />
document.write("plus(2,3)="+sum+"");<br />
var op= plus;<br />
sum= op(2,3);<br />
document.write("plus(2,3)="+sum+"");<br />
op= minus;<br />
sum= op(2,3);<br />
document.write("plus(2,3)="+sum+"");<br />
plus(2,3)=5<br />
plus(2,3)=5<br />
plus(2,3)=-1<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
38
Zugriff auf Argumente<br />
function q1(val) {<br />
return val*val;<br />
}<br />
function q2() {<br />
return arguments[0]*arguments[0];<br />
}<br />
• Alle beim Aufruf übergebenen Argumente werden in einem Array<br />
Namens arguments[] mit der Länge arguments.length abgelegt.<br />
• Der Index des ersten Parameters ist 0.<br />
• Die beiden Beispiele sind gleichwertig.<br />
• Mit diesem Array können dynamisch viele Parameter verarbeitet<br />
werden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
39
Deklarationen I<br />
• Es gibt globale und lokale Variablen.<br />
• Lokale Variablen werden innerhalb Funktionen deklariert und verdecken<br />
globale gleichen Namens.<br />
• Deklarierte Parameter werden wie lokale Variablen behandelt.<br />
var p= 10;<br />
var q= 10;<br />
var r= 10;<br />
function fun(r,s,t) {<br />
var p= 9;<br />
r= 2;<br />
}<br />
fun(q,20,30);<br />
var s= p+q+r; /* 9+10+10 oder 10+10+10 ? */<br />
Mit der lokalen Deklaration von p würde s den Wert 29 erhalten, sonst 30.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
40
Deklarationen II<br />
<br />
JS-Test2<br />
<br />
<br />
var p= 10;<br />
var q= 10;<br />
var r= 10;<br />
function ff(r,s,t) {<br />
var p= 9;<br />
r= 2;<br />
}<br />
document.write(p+" "+q+" "+r+"");<br />
ff(q, 20, 30);<br />
document.write(p+" "+q+" "+r+"");<br />
var s= p+q+r;<br />
document.write(s);<br />
<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
41
Deklarationen III<br />
Die Parameter werden call by value übergeben;<br />
daher hat die Zuweisung an Variable r innerhalb von fun()<br />
keinen Effekt auf irgendetwas im aufrufenden <strong>Teil</strong>.<br />
Es gibt also zwei Gründe zum Deklarieren (Ein Muss!):<br />
• Deklaration als Parameter ohne Typangabe<br />
• Deklaration einer lokalen Variablen ohne Typangabe<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
42
Vordefinierte Funktionen (Auszug) I<br />
Funktion<br />
eval(String)<br />
IsNaN(Expression)<br />
IsFinite(Expression)<br />
parseFloat(String)<br />
parseInt(String)<br />
Erläuterung<br />
Interpretiert den String als <strong>JavaScript</strong> und liefert das<br />
Ergebnis<br />
Testet den Wert, ob er keine Zahl ist<br />
Testet den Wert, ob er innerhalb des Zahlenbereichs liegt<br />
Wandelt String in Float um<br />
Liefert NaN, wenn String mit einem nicht-numerischen Wert<br />
beginnt (NaN = Not a Number)<br />
Ist ein derartiges Zeichen innerhalb der Zahl, dann wird der<br />
bis zu diesem Zeichen bestimmte Wert zurückgeliefert.<br />
Wandelt String in Integer um,<br />
Es gelten dieselben Bemerkungen wie bei parseFloat()<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
43
Vordefinierte Funktionen II<br />
var x= "6";<br />
var y= "6.777";<br />
var z= x+y;<br />
document.writeln(z);<br />
z= parseInt(x)+parseFloat(y);<br />
document.writeln(z);<br />
Es wird "66.777" gefolgt von "12.777" ausgegeben.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
44
Objektorientierung<br />
• In <strong>JavaScript</strong> wird nur von Objekten gesprochen. Es gibt keine<br />
Klassen (jedenfalls im Sinne von Java).<br />
• In <strong>JavaScript</strong> gibt es also nur Objekte.<br />
• Eigenschaften und Methoden werden nicht wie z.B. in Java/C++<br />
vor der Erzeugung deklariert, sondern dynamisch den Objekten<br />
Stück für Stück zugewiesen.<br />
• Die Objekte werden daher Stück um Stück aufgebaut.<br />
Eine Definition einer Klasse gibt es nicht.<br />
• Dadurch können Objekte, die ursprünglich vom "gleichen Typ"<br />
waren, unterschiedliche Eigenschaften haben.<br />
• Dies gilt auch für Methoden eines Objekts.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
45
Klassen-Konstruktor I<br />
function KlassenName([Param1, Param2,..]) { // Konstruktor<br />
this.Attribut1= Param1; // neues Attribut<br />
this.Attribut2= Param2; // neues Attribut<br />
...<br />
}<br />
var obj= new KlassenName([Param1, Param2,..]);<br />
...<br />
• Ein Objekt wird mit einer Konstruktor-Funktion und dem Operator new<br />
definiert, die denselben Namen wie die gedachte Klasse hat.<br />
• Also Objekte, die mit derselben Funktion per new erzeugt wurden, bilden<br />
dadurch die Exemplare einer gemeinsamen fiktiven Klasse.<br />
• Das Schlüsselwort this verweist auf das eigene Objekt.<br />
• Die Attribute werden durch die Zuweisungen über this Stück für Stück<br />
definiert.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
46
Klassen-Konstruktor II<br />
function Person(vor,nach) { /* Konstruktor */<br />
this.vorname= vor;<br />
this.nachname= nach;<br />
}<br />
...<br />
var king= new Person("Gustav","Adolf"); /* Generierung */<br />
var vn= king.vorname;<br />
var nn= king.nachname;<br />
King.nachname= nn+" der Zweite";/* König von Schweden <strong>15</strong>94–1632 */<br />
...<br />
• Mit der Punkt-Schreibweise wird auf die Komponenten, hier die<br />
Attribute, des Objekts zugegriffen.<br />
• Alle so erzeugten Attribute sind lokal zum Objekt.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
47
Hinweise<br />
• Neue Attribute können dynamisch, also auch NACH der<br />
Erzeugung des Objekts hinzugefügt werden, so dass sich<br />
Objekte, die von der selben Konstruktorfunktion "abstammen",<br />
strukturell unterscheiden.<br />
• Es sollten Namenskonventionen eingehalten werden, z. B. dass<br />
Objektnamen mit kleinen Buchstaben beginnen und<br />
Konstruktorfunktionen mit großen.<br />
• Eine Vererbung, so wie in Java, gibt es nicht. Mit Hilfe des<br />
Prototype-Konstrukts lässt sich so etwas wie Vererbung<br />
nachbauen.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
48
Beseitigung von Objekten und Attributen<br />
var str= new string("Das ist aber ein langer String.");<br />
...<br />
delete str; /* str hat nun den Wert undefined */<br />
• Mit delete lassen sich Objekte, die mit new erzeugt wurden,<br />
beseitigen.<br />
Dies gilt auch für Attribute von Objekten:<br />
• Mit delete lassen sich aber auch Attribute löschen, z.B.<br />
delete obj.Nachname<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
49
Abfrage nach der Existenz von Attributen<br />
if ("Attribut" in Objekt) { ... Objekt.Attribut ... }<br />
if ("Vorname" in kaiser) {<br />
kaiser.Vorname= "Ferdinand";<br />
}<br />
• Da dynamische Attribute erzeugt und gelöscht werden können, ist eine<br />
Möglichkeit erforderlich, mit der der aktuelle Zustand des Objektes<br />
abgefragt werden kann: in.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
50
Methoden I<br />
function kroenung() {<br />
document.write("Ab heute ist er's!");<br />
}<br />
function Person(vor,nach) {<br />
this.vorname= vor;<br />
this.nachname= nach;<br />
this.abWann= kroenung; /* Funktionsreferenz */<br />
}<br />
var king= new Person("Gustav","Adolf") /* Generierung */<br />
king.abWann();<br />
document.write(kroenung); /* ??? */<br />
Output:<br />
Ab heute ist er's!<br />
function kroenung() { document.write("Ab heute ist er's!<br />
"); }<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
51
Methoden II<br />
• Methoden werden wie Attribute behandelt.<br />
• Die vorletzte Zeile gibt "Ab heute ist er's!" aus.<br />
• Die letzte Zeile gibt den Source-Code von kroenung() aus:<br />
"function kroenung() { document.write("Ab heute ist<br />
er's!...");}„<br />
• In der Zeile mit " this.abWann" muss Kroenung ohne Klammern<br />
angegeben werden, da sonst nicht der gelieferte Wert<br />
zugewiesen wird.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
52
Arrays I<br />
var ArrayName= new Array(Size);<br />
...<br />
ArrayName[0]= ...;<br />
...= ArrayName[1]...;<br />
• Es lassen nur 1-dimensionale Felder deklarieren und erzeugen.<br />
Mehrdimensionale müssen schrittweise aufgebaut werden.<br />
• Die Indices beginnen immer bei 0 und enden bei Size-1, also wie bei<br />
C/C++/Java.<br />
• Die Eigenschaft length liefert die Anzahl der Elemente, d.h. der Index<br />
läuft von 0 bis ArrayName.length-1.<br />
• Statt Size kann bei Array auch eine Liste angegeben werden, wobei das<br />
Feld so lang wird wie die Liste Elemente hat; dann werden die Array-<br />
Elemente mit den Listenwerten in der angegebenen Reihenfolge<br />
versehen – wie in PHP.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
53
Arrays II<br />
var Suess= new Array(4);<br />
Suess[0]= "Schokolade";<br />
Suess[1]= "Bonbon";<br />
Suess[2]= "Eis";<br />
Suess[3]= "Lutscher";<br />
var Suess= new Array("Schokolade","Bonbon","Eis","Lutscher");<br />
var Suess= ["Schokolade","Bonbon","Eis","Lutscher"];<br />
• Alle drei Formen sind äquivalent.<br />
• Ein new von einem Array mit einem Integer-Parameter erzeugt ein leeres<br />
Feld mit der angegebenen Anzahl von Elementen.<br />
• Ein Array mit einer Liste von Werten, auch unterschiedlichen Typs,<br />
erzeugt ein Feld mit den angegebenen dadurch vorbelegten Elementen.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
54
Mehrdimensionale Felder<br />
for(var i= 0;i
Implementierung der Objekte I<br />
Objekte sind intern als assoziative Arrays implementiert.<br />
var<br />
obj= new Object();// Objekt ohne Eigenschaften<br />
obj.x= 10; // Erzeugen einer neuen Eigenschaft<br />
obj.y= 20; // dasselbe<br />
obj["x"]= <strong>15</strong>; // Alternative Schreibweise<br />
obj["y"]= 25;<br />
obj.sum= obj["x"]+obj.y;<br />
var obj= { x:10, y:20, sum:30 };<br />
Das letzte Beispiel zeigt eine Objekt-Kodierung im JSON-Format.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
56
Implementierung der Objekte II<br />
• Mit der Funktion Object() lassen sich leere Objekte erzeugen.<br />
• Ein impliziter Aufruf von Object() erfolgt bei der Benutzung des JSON-<br />
Formats.<br />
var obj= { x:10, y:20, sum:30 };<br />
var obj= new Object;<br />
obj.x= 10;<br />
obj.y= 20;<br />
obj.sum= 30;<br />
Beide Beispiele sind äquivalent.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
57
Noch einmal zu den Arrays<br />
• Arrays sind spezialisierte Formen von Objekten.<br />
• D.h. es können auch Attribute ausgelesen und zugewiesen<br />
werden, ohne dass es Probleme gibt.<br />
• Der Index muss zwischen 0 und 2**32 -1 liegen.<br />
• Der Längeneigenschaft eines Feldes length kann auch ein Wert<br />
zugewiesen werden; dann passiert folgendes:<br />
– Ist der Wert größer als die augenblickliche Länge, wird das Feld<br />
vergrößert.<br />
– Ist der Wert kleiner als die augenblickliche Länge, wird das Feld<br />
verkleinert einschließlich eines Datenverlustes.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
58
Prototypen I<br />
Konstruktor.prototype.Attribut= Ausdruck;<br />
Konstruktor.prototype.Methode= Funktion;<br />
• Methode ist der Name einer Methode, während Funktion eine<br />
Funktionsreferenz ist.<br />
• Zu jedem Konstruktor gibt es ein internes Objekt (prototype), das bei<br />
einem new() mit dem generierten Objekt verbunden ist.<br />
• Alles, was dem Objekt zugewiesen ist, ist lokal zu dem Objekt.<br />
• Alles, was dem Prototyp zugewiesen ist, ist global zu allen davon<br />
generierten Objekten.<br />
Dies gilt auch NACH der Erzeugung eines Objektes.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
59
Prototypen II<br />
Attr1<br />
Attr2<br />
Attr3<br />
…<br />
AttrN<br />
Prototype<br />
Attr1<br />
Attr2<br />
…<br />
AttrN<br />
Attr1<br />
Attr1<br />
Attr2<br />
…<br />
AttrN<br />
Attr1<br />
Attr2<br />
Objekt1 Objekt2 Objekt3 Objekt4<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
60
Prototypen III<br />
• Es besteht damit eine Verbindung (Pointer) zwischen dem Prototyp-<br />
Objekt und dem eigentlichen Objekt (new) derart,<br />
– dass eine Erzeugung eines Attributs beim Objekt ein Attribut gleichen<br />
Namens im Prototyp-Objekt überdeckt.<br />
– dass eine Erzeugung eines Attributs beim Prototyp für alle bisherigen<br />
und zukünftigen Objekte ein neues Attribut definiert, es sei denn dieser<br />
Attributname ist in den jeweiligen Objekten schon definiert - dann<br />
überdeckt diese Definition die aus dem Prototyp.<br />
• Dies ist die Basis für einen Nachbau der Vererbung.<br />
• Wenn im Prototyp wiederum ein mit new() erzeugtes Objekt<br />
eingefügt wird, entsteht ein Verweis auf dessen Prototyp, so dass<br />
dessen Eigenschaften "vererbt" werden.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
61
Prototypen IV - Anwendungen<br />
• Die Prototypen dienen zur Definition von Methoden, die nur<br />
einmal zugewiesen werden brauchen, anstatt jeweils nach<br />
einem new().<br />
• Damit korrespondierend werden im Prototypen auch die<br />
Attribute, die in den Methoden benutzt werden, definiert.<br />
• In den Konstruktoren werden die "globalen" (also im Prototyp<br />
definierten) Attribute vorbelegt und damit lokal zu dem Objekt<br />
gemacht.<br />
• M.a.W. die "static"-Attribute liegen im Prototyp, die lokalen im<br />
Objekt.<br />
• Von einem dynamischen Zusammenbau von Objekten<br />
wird abgeraten.<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
62
Nach dieser Anstrengung etwas Entspannung...<br />
<strong>Webtechnologien</strong> - WS 2013/14 - <strong>Teil</strong> <strong>15</strong>/<strong>JavaScript</strong> I<br />
63