1 JAVASCRIPT Történet JavaScript nyelv nem azonos a Java nyelvvel 1995: Netscape vezette be az addigi statikus HTML oldalak dinamikussá tételére 1996:...
JavaScript nyelv nem azonos a Java nyelvvel 1995: Netscape vezette be az addigi statikus HTML oldalak dinamikussá tételére 1996: Microsoft saját változata a JScript Microsoft mint konkurenciát kifejlesztette a VBscript-et is De a VBScript a kihalás folyamatában van Ugyanakkor a JScript a .NET default nyelve lett
1997: ECMA (European Computer Manufacturers Association) kiadja az ECMAScript nyelvet, hogy elősegítse a különböző változatok szabványosítását Számos változatuk megjelent Netscape változatok: JavaScript v1.0 – v1.5 Internet Explorer: JScript v1.0 – v5.6 Ma már a ténylegesen "jegyzett" böngészőkben a kompatíbilis változatok: ECMAScript-262 ≈JavaScript 1.5 ≈ JScript 5.6
Mi a JavaScript
A mag- és alkalmazásfüggő részek kapcsolata
Szkript Forráskód, amelynek végrehajtása soronként értelmezővel (interpreter) vagy a végrehajtás folyamán soronként gépi kódba fordítással
Végrehajtható program Gépi kódú utasításokba lefordított program gyorsabb, de a lefordított program már nem változtatható
A WEB alkalmazásokban gyakran használunk ügyfél oldali szkripteket kiszolgáló oldali szkripteket a web oldalakba plug-in segítségével integrált végrehajtható programokat
A végrehajtáshoz egy értelmező (szkriptmotor) szükséges A kölönböző alkalmazások különböző szkriptmotorokat használnak Eltérés a szkriptmotorok között A nyelvnek a szkriptmotoroktól független elemei képezik a nyelv magját, ez a Core JavaScript vagy a JavaScript alkalmazás-független része
a különböző böngészők eltérő járulékos funkciókkal egészítheti ki a mag JavaScriptet a kiszolgáló oldali bővítések alapvetően eltérnek az ügyféloldaliaktól az egyes alkalmzások bővítése az adott alkalmazás céljainak felelnek meg
Példák: Önálló JavaScript interpreter: DMDScript HTML oldalba illesztett JavaScript: böngésző szkriptmotor Szkriptmotor gazda: WSH (Példák: JS_exec_versions)
1
A WEB programozása – JavaScript 1 dr.Gál Tibor A mag JavaScript áttekintése Aritmetikai, logikai, bitkezelő műveletek és a programvezérlő szerkezetek azonosak a Java vagy a C (C++) nyelvben használtakkal Lényegi különbségek Gyengén típusos nyelv Prototípus alapú az objektumorientáltság Az adattípusokat nem kell explicit módon megadni és konvertálni Alap (mag) objektumok
Megegyező sajátságok: vázlatos tárgyalás Eltérő sajátosságok: részletesebb tárgyalás Kitérő a gyakorolhatóság érdekében Hogyan helyezünk el egy szkriptet a böngészőben? Hogyan valósítunk meg primitív be- és kivitelt?
2010. őszi félév
<script> var n = fp_input( "Kamatos kamat számítása - Kiindulási tõke = 100\n" + "Adja meg a kamat értékét!"); s = ""; sum = 100; for(i=1; i<11; i++){ sum = sum * (1+0.01*n); s += "Év:" + i + " Megnövekedett tõke:" + sum+'\n'; } output(s); function output(str){alert(str);} function str_input(){return promt("str","");} function int_input(str){return parseInt(prompt(str,""));} function fp_input(str){return parseFloat(prompt(str,""));}
Értékek, változók és literálok
Általános szintaktikai szabályok Értelmező figyelmen kívül hagyja a szóköz, tabulátor, sorvégkaraktert egy utasítás több sorba írható egy sorban több utasítás is lehet értelemszerűen: azonosító, kulcsszó, sztring stb. nem vágható szét!
Utasítások lezárása pontosvesszővel opcionális, de ha egy sorban több utasítás van, akkor kötelező Javaslat minden utasítás külön sorba tegyünk minden utasítást explicite pontosvesszővel zárjunk
Kis/nagybetű érzékeny a nyelv
Értékek
sztringek: "Ez egy string", "1956",'1956' számok: 021, 17, 0x11, 3.14, 314E-2 logikai értékek: true és false null: nulla értéket kifejező speciális kulcsszó undefined: nem definiált érték
A WEB programozása – JavaScript 1 dr.Gál Tibor Változók betűvel, aláhúzással vagy $ jellel kezdődnek, s számmal is folytatódhatnak deklarálás és hatáskör egyszerű hozzárendelés pl. x = 23; var kulcsszó használata pl. var x = 32; De: függvényen belül csak akkor lokális a változó, ha var kulcsszóval deklaráltuk
function f(){ x=1; ...} f(); y = x; // itt y értéke 1 lesz
2010. őszi félév
Konstansok const prfix = '212'; neve nem lehet azonos egy függvény vagy változó nevével azonos hatáskörben
Literálok
tömb logikai lebegőpontos egész objektum sztring
Tömb literálok function f(){ var x=1; ...} y = x + 1; // itt runtime error lép fel
String objektum metódusai a string literálokra is meghívható js1/ct3.html "abcd".charAt(2) // c "abcd".length // 4 "Ugrás a Sun holapjára".link( "http://www.sun.com ") //Ugrás a Sun-ra
Kifejezések és operátorok Kifejezések
Aritmetikai: kiértékelve számot ad vissza Sztring: kiértékelve sztringet ad vissza Logikai: kiértékelve true vagy false értéket ad vissza Objektum: kiértékelve objektumot ad vissza
Operátorok
Értékadó operátorok
értékadó összehasonlító aritmetikai bit logikai sztring speciális
Összehasonlító operátorok
Az egyetlen nélkülözhetetlen értékadó operátor: = A többi
Operátor
true értéket visszaadó példa (var1=3 var2=4)
Értékadó operátorok
Jelentés
==
3 == var1
"3" == var1
x += y
x = x + y
!=
var1 != 4
var2 != "3"
x -= y
x = x – y
===
3 === var1
!==
var1 !== "3"
>
var2 > var1
>=
var2 >= var1
<
var1 < var2
<=
var1 <= var2
x *= y
x = x * y
x /= y
x = x / y
x %= y
x = x % y
x <<= y
x = x << y
x >>= y
x = x >> y
x >>>= y
x = x >>> y
x &= y
x = x & y
x ^= y
x = x ^ y
x |= y
x = x | y
=== !==
3 == '3'
3 !== '3' var1 >= 3 var2 <= 5
egzakt egyenlő egzakt nem egyenlő
4
A WEB programozása – JavaScript 1 dr.Gál Tibor
2010. őszi félév
Aritmetikai operátorok: mint a többi nyelvben
Bit operátorok Operátor
Leírás
a & b Bitenkénti ÉS
1-et ad vissza minden olyan bit pozícióban, amelyben mindkét operandus bitje 1 értékű.
Kivonás
a | b Bitenkénti VAGY
1-et ad vissza minden olyan bit pozícióban, amelyben legalább az egyik operandus bitje 1 értékű.
*
Szorzás
/
Osztás
a ^ b Bitenkénti kizáró VAGY
1-et ad vissza minden olyan bit pozícióban, amelyben a két operandus bitjei eltérőek.
%
Modulus
~a Bitenkénti NEM
Invertálja az operandus bitjeit.
++
Inkrement
––
Dekrement
a << b Balra léptetés
Az a operandus bináris reprezentációjában b bittel balra lépteti a biteket, s a jobb oldalon nullákat léptet be.
-
Negálás
Operátor
Jelentés
+
Összeadás
-
a >> b Az a operandus bináris reprezentációjában b bittel Jobbra léptetés az előjel jobbra lépteti a biteket, a bal oldalon az előjelet megtartásával megtartja, s a jobb oldalon kilépő biteket eldobja.
De: a / osztás lebegőpontos eredményt ad vissza Java-ban 3/2 visszaadott értéke 1 JavaScriptben 3/2 visszaadott értéke 1.5
a >>> b Jobbra léptetés az előjel megtartása nélkül
Példák a bit operátorokra
Mint az előbbi, de a bal oldalon nullákat léptet be.
Logikai operátorok
15 & 9 (...00001111 & ...00001001
→ 1001)
9
Operátor
Jelentés
15 | 9 (...00001111 | ...00001001
→ 1111)
15
&&
Logikai ÉS
15 ^ 9 (...00001111 ^ ...00001001
→ 0110)
6
||
Logikai VAGY
!
Logikai NEM
-15 & 9 (1111...11110001 & 0000...00001001
→ 0000...00000001)
1
-15 | 9 (1111...11110001 | 0000...00001001
→ 1111...11110001)
–7
-15 ^ 9 (1111...11110001 & 0000...00001001
→ 1111... 1111 1000) -8
9 << 2 (... 0000 1001 << 2
→ ... 0010 0100)
36
9 >> 2 (... 0000 1001 >> 2
→ ... 0000 0010)
2
-9 >> 2 (1111...11110111 >> 2
→ 11111111 ... 11111101)
-3
De: nem logikai értékek esetén A&&B az A kifejezést adja vissza, ha az false értékké konvertálható, egyébként a B kifejezést A||B az A kifejezést adja vissza, ha az true értékké konvertálható, egyébként a B kifejezést !A false értéket ad vissza, ha A true értékké konvertálható, egyébként true értéket
Tartalmazás-vizsgálat operátor (in) Igaz értéket ad vissza, ha az adott tulajdonság megtalálható az adott objektumban primek = new Array(1,2,3,5,7); 0 in primek // eredménye true 5 in primek // eredménye false "PI" in Math // eredménye true, Math egy előre definiált // objektum, melynek van egy PI tulajdonsága
Példányvizsgáló operátor (instanceof) Igaz értéket ad vissza, ha a két objektum típusa megegyezik
Komma operátor (,) Mindkét op. kiértékelése, s jobboldali visszaadása for(i=0, j=9; i<9; i++, j--)
Törlés operátor (delete) Objektumot, obj. tulajdonságot vagy tömbelemet töröl delete objectName delete objectName.propertyName delete arrayName[index] impliciten deklarált változó törölhető var kulcsszóval deklarált nem a sikeresen töröl entitás undefined állapotot vesz fel sikeres törlés true értékkel tér vissza tömbelem törlésekor a tömb hossza nem változik az in operátor nem találja meg a törölt elemeket, de indexszel hivatkozva undefined értékük megkapható js1/ct4.html
Típusvizsgáló operátor (typeof) Sztringet ad vissza, amely a kiértékeletlen operandus típusát jelzi typeof operandus typeof (operandus) typeof ′2′+2 typeof 2+2
// visszaadott érték string // visszaadott érték number
A void operátor Az argumentumában szereplő kifejezes-t ki kell értékelni, de nem kell visszaadni
thaDay = new Date(2001, 09, 11); if(theDay instanceof Date){ // ezek az utasítások végrehajtódnak }
Feltételes utasítások if (x==y) {utasítások} if (x>y) max=x; else max=y;
A switch utasítás swith (kifejezés){ case cimke1: utasítások; break; case cimke2: utasítások; break; ... default: utasítások; }
Java: kifejezés csak egész értékű lehet JavScript: bármi js1/ct5.html
Ciklusutasítások A for utasítás for(var i=0; i<10; i++) { utasítások }
A do while utasítás do { utasítások } while (i<5);
A while utasítás while (n < 3) { utasítások; }
A break utasítás Címke nélküli esetben a legbelső while, do while, for vagy switch végrehajtása fejeződik be Címkével használva, a hivatkozott címkével ellátott utasítás végrehajtása marad abba
A continue utasítás Címke nélküli esetben abbahagyja a legbelső while, do while, for vagy switch utasítás végrehajtását és rátér a következő iterációra Címkével használva, a megjelölt címkéjű utasításban tár át a következő iterációra
Objektummanipulációs utasítások A for utasítás for(változó in objektum) { utasítások }
js1/ct7.html A with utasítás /beállítja az alapértelmezett objektumot/ var c = Math.sqrt(a*a+b*b); var d = c*Math.sin(alfa); var kerulet = d*Math.PI; // de with (Math) { var c = sqrt(a*a+b*b); var d = c*sin(alfa); var kerulet = d*PI; }
Megjegyzések // egyetlen sorra a sor végéig /* többsoros megjegyzés */
7
A WEB programozása – JavaScript 1 dr.Gál Tibor Kivételkezelő utasítások A kivételek dobása a throw utasítással történhet Elkapásuk a try ... catch utasítással throw "Error2" throw 42; throw true; try { kivételt dobható utasítások } catch(e) { kivétel felléptekor végrehajtandó utasítások } try { ... } catch(e if e=="Error1") { ... } catch(e if e=="Error2") { ... }
Példa2 function getCustInfo(name, id, email) { var n, i, e; if (!validate_name(name)) throw "InvalidNameException" else n = name; if (!validate_id(id)) throw "InvalidIdException" else i = id; if (!validate_email(email)) throw "InvalidEmailException" else e = email; cust = (n + " " + i + " " + e); return (cust); }
2010. őszi félév
Példa1 function getMonthName (mo) { mo=mo-1; //A tömb feltöltése hónap nevekkel (1=jan,12=dec) var months=new Array("jan.","febr.","márc.","ápr.","máj.", "jun.","júl.","aug.","szept.","okt.","nov.","dec."); if (months[mo] != null) { return months[mo]; } else { throw "IllegálisHónapSzám"; } } try { monthName=getMonthName(myMonth); // ez a függvény // kivételt dobhat } catch (e) { monthName="unknown"; logMyErrors(e); // a kivétel objektum átadása a // hibakezelőnek } js1/ct9.html
A finally blokk (mindig végrehajtódik) openMyFile(); try { writeMyFile(theData); } finally { closeMyFile(); // mindig lezárja a fájlt }
try { // a függvény háromféle kivételt dobhat getCustInfo("Lee", 1234, "[email protected]"); } catch (e if e=="InvalidNameException") {bad_name_handler(e);} catch (e if e == "InvalidIdException") {bad_id_handler(e);} catch (e if e == "InvalidEmailException") {bad_email_handler(e);} catch (e){ // valami egyéb hiba logError(e);}