19.01.2014 Aufrufe

Webtechnologien Teil 15: JavaScript - Teil I

Webtechnologien Teil 15: JavaScript - Teil I

Webtechnologien Teil 15: JavaScript - Teil I

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!