JavaScript
Bevezetés Kezdetek Nyelvi elemek Típusok, típuskonstrukciók Vezérlési szerkezetek Alprogramok Osztály,Objektum Kivételkezelés
Kezdetek Sun és Netscape (1995) HTML kibővítése Dinamikus oldalak JavaScript nem Java Értelmezés van,nem fordítás Objektum alapú és nem OO HTML-be integrált Gyenge típusosság
Szintaxis HTML <html> <script> //Böngésző által támogatott rész </script> <noscript> //Ha nem ismeri a böngésző </noscript> <body> </body> </html>
Nyelvi elemek Jelkészlet: Unicode Azonosítók Literálok Megjegyzések Eleje: betű vagy „_” Kis és nagybetű érzékeny Literálok Egész: Decimális,Hexa,Oktális Lebegőpontos,Boolean,String(speciális karakterek) Megjegyzések Deklarálás: var név; (let)
Adattípusok Típuslekérdezés: typeof number string boolean undefined null function object Típuslekérdezés: typeof function nothing(){}; typeof nothing() == "undefined" typeof nothing == "function" typeof new nothing() == "object"
Típusok Dinamikusan tipizált nyelv Elemi típusok: Szám(3 számrendszer) Logikai(true,false) Szöveg var lit = „String literál"; var obj = new String("String objektum"); var lit2 = String(„new operátor nélkül ez is literál.");
Típuskonstrukciók Tömb Létrehozás: var longVector = new Array(1000); var shortVector = new Array(); var evens = new Array(0,2,4,6,8); var odds = [1,3,5,7,9]; function range(begin, end) { for (let i = begin; i < end; ++i) { yield i; } } var ten_squares = [i * i for each (i in range(0, 10))];
Tömbök Méret változhat. Tetszőleges adatszerkezet. „Asszociatív tömb”: NewArray = [, "második elem", , "negyedik elem"]; var twoDim = [ [11,12], [21,22] ]; Méret változhat. Tetszőleges adatszerkezet. „Asszociatív tömb”: var myArray = new Array(); myArray["a"] = 100; Hivatkozás: myArray.a == 100
Tömbök 2 Verem Sor Több egyéb művelet push() és pop() shift() és unshift() Több egyéb művelet Pl: reverse(), sort() stb.
Rekordok var v1; function f1 { // valamilyen visszatérési érték } rec = { a: "szöveg", b: f1, 7: v1; } Hivatkozás: rec.a,rec[7]
Típuskonverziók „House ”+ „M.D. ” == „House M.D.” „a” + 1 == „a1” 1 + „1” == „11” 1 + 1 == 2 5 - „3” == 2 function nothing(){}; "a"+nothing() == "aundefined"
Változók Deklarálás: var a = 1; //globális function main() { var (függvény szint) let (blokk szint) (1.7 óta) semmi (opcionális: delete változó;) const név = „valami”; var a = 1; //globális function main() { b = 1; //globális var d = 3; //main-en belül someFunction(d); } function someFunction(e) { var c = 2; //ebben a függvényben
Let 1 var x = 1, y = 0; let (x = x+5, y = 6) { print(x+y + "\n"); // let miatt lokálisak } print((x + y) + "\n"); // globális Kimenet: 12 1
Let 2 var x = 1, y = 0; document.write( let(x = x + 5, y = 6) x+y + " "<br>\n"); document.write(x+y + " "<br>\n");
Let vs. Var function varTest() { var x = 31; if (true) { var x = 71; // ugyanaz a változó alert(x); // 71 } alert(x); // 71 function letTest() { let x = 31; let x = 71; // másik változó alert(x); // 31
Operátorok Ugyanaz,mint C, Java nyelvekben.
Vezérlési szerkezetek C-ből átvett szintaxis. Destruktúrálható értékadás (mintaillesztés) Pl.: var a = 1; var b = 2; [a, b] = [b, a]; // Egyszerű swap
Vezérlési szerkezetek 2 function f() { return [1, 2]; } var a, b; [a, b] = f(); document.write ("A is " + a + " B is " + b + "\n"); -------------------------------------------------------------------- function f() { return [1, 2, 3]; } var [a, , b] = f();
var people = [ { name: "Mike Smith", family: { mother: "Jane Smith", father: "Harry Smith", sister: "Samantha Smith" }, age: 35 name: "Tom Jones", mother: "Norah Jones", father: "Richard Jones", brother: "Howard Jones" age: 25 } ]; for each (let {name: n, family: { father: f } } in people) { document.write ("Name: " + n + ", Father: " + f + "\n"); } Kimenet: Name: Mike Smith, Father: Harry Smith Name: Tom Jones, Father: Richard Jones
Elágazás if ( kifejezés ) { utasítások } else { utasítások } Pl.: var a = jegyetKap(b, c); if ( a <= 1) { document.write(„Megbuktál!"); } else if (a == 5 ) { document.write(„Kitűnő!"); else { document.write(„Átmentél!");
Switch switch (kifejezés) { case címke_1: utasítások; break; case címke_2: utasítások; break; default: utasítások; //Nem kötelező } Nincs {} a blokkoknál Kifejezés bármi lehet
Switch Pl.: switch (expr) { case "Oranges": document.write("Oranges are $0.59 a pound."); break; case "Apples": document.write("Apples are $0.32 a pound."); case "Bananas": document.write("Bananas are $0.48 a pound."); case "Cherries": document.write("Cherries are $3.00 a pound."); default: document.write("Sorry, we are out of " + expr"."); }
Ciklus C-ből átvett ciklusok: for,do…while,while Feltétel: logikai,aritmetikai (0 hamis) Break,continue NINCS végtelen ciklus! while (true) { document.print("Hello, world"); }
For ciklus for ( inicializálás, ciklusfeltétel, inkrementálás ) { ciklusmag } Objektum attribútumain is léphetünk! function dump_props(obj, obj_name) { var result = ""; for (var i in obj) result += obj_name + "." + i + "=" + obj[i] + "\n"; } return result;
For each var sum = 0; var obj = {prop1: 5, prop2: 13, prop3: 8}; for each (var item in obj) { sum += item; } print(sum); Kimenet: 26
With with(obj) statement, vagy with(obj) {...} Pl.: var a, x, y; var r = 10; with (Math) { a = PI * r * r; x = r * cos(PI); y = r * sin(PI / 2); }
Alprogramok Csak function Nem kell típus,csak név function min(a, b) { return a < b ? a : b ; } 1.8 óta Lambda-kifejezés is egyszerű esetben. function(x) { return x*x; } function(x) x*x
Paraméterátadás Függvény is lehet paraméter. Nincs túlterhelés Arguments tömb //Ismeretlen hosszúságú tömbnél function concat(separator) { var result = ""; for (var i=1; i< arguments.length; i++) result = result + arguments[i] + separator; } return result; concat (".", "egy", "kettő", "három"); Kimenet:"egy.kettő.három"
Generátor 1.7 óta function fib() { var i = 0, j = 1; while (true) { yield i; var t = i; i = j; j += t; } var g = fib(); //g generátor-iteráló objektum for (var i = 0; i < 10; i++) { document.write(g.next() + "<br>\n"); } //next hatására lefut a törzs a yield-ig és vár a következő next-re
Osztály,Objektum 2.0-ig nincs osztály! Function segítségével „szimuláljuk” function Osztalynev() { var adat; // privát változó function _setAdat(a) { // privát függvény adat = a; } function _getAdat() { //szintén privát függvény return adat; this.setAdat = _setAdat; // itt tesszük láthatóvá this.getAdat = _getAdat; var obj = new Osztalynev(); obj.setAdat(5); alert(obj.getAdat());
Objektum Az objektumot kiegészíthetjük létrehozás után var obj = new osztalynev(1, 2); var x = obj.fgv(3,4); obj.ujTag = 4; obj.ujFuggveny = function(a) { this.ujTag = a; … }
Osztály 2.0 class C { var x:integer = 3; function m() {return x} function n(x) {return x+4} } var c = new C; c.m(); // returns 3 c.n(7); // returns 11 var f:Function = c.m; // returns 3
Konstruktor class C { var a:String; constructor function C(p:String) { this.a = "New "+p } constructor function make(p:String) { this.a = "Make "+p //Konstruktor szimulálása static függvénnyel static function obtain(p:String):C {return new C(p)} var c:C = new C("one"); var d:C = C.C("two"); var e:C = C.make("three"); var f:C = C.obtain("four"); c.a; // Returns "New one" d.a; // Returns "New two" e.a; // Returns "Make three" f.a; // Returns "New four"
Megjelennek a public, private, virtual parancsok Egyszeres öröklődést támogat class C { virtual var x:integer; var y:integer; } class D extends C { override function set x(a:integer):integer {y = a*2}
Interfész Megjelenik az interface interface I { function f(int):int } class B implements I function f(i:int):int {return i*i}
Kivételkezelés Try-catch-finally szerkezet try{...} catch(e){ if(e instanceof ...) {...} else if (e instanceof ...) {...} ... } -------------------------------------------------------------------------------------------------- catch(e if e instanceof ...) {...} catch(e if e == "kivételnév") {...}
Kivételkezelés 2 Hiba dobása: throw try { throw RangeError; } catch (e) { alert(e.name); } finally { … }