SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek



Hasonló dokumentumok
C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Magas szintű programozási nyelvek 2 Előadás jegyzet

Objektumorientált programozás C# nyelven III.

Objektumorientált programozás C# nyelven

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Objektumorientált programozás C# nyelven

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Informatika terméktervezőknek

OBJEKTUMORIENTÁLT TERVEZÉS ESETTANULMÁNYOK. 2.1 A feladat

117. AA Megoldó Alfréd AA 117.

SZERVER OLDALI JAVASCRIPT. 7. hét Promise, async, error rst callback, grunt

Bevezetés a programozásba 2

C# feladatok gyűjteménye

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Osztály és objektum fogalma

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Internet technológiák

Körkörös listák. fej. utolsó. utolsó. fej

Bevezetés a programozásba. 12. Előadás: 8 királynő

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Imperatív programozás

C++ programozási nyelv

C# osztályok. Krizsán Zoltán

C#, OOP. Osztályok tervezése C#-ban

.Net adatstruktúrák. Készítette: Major Péter

JAVA PROGRAMOZÁS 3.ELŐADÁS

A WEB programozása - JSP1 dr.gál Tibor őszi félév

RIA Rich Internet Application

Szabadkai Műszaki Szakfőiskola. Web programozás. dr Zlatko Čović

Bevezetés a mikrovezérlők programozásába: WS2812 RGB LED-ek vezérlése

3. Gyakorlat Ismerkedés a Java nyelvvel

Szoftvertechnológia alapjai Java előadások

Programozási nyelvek Java

S z á m í t ó g é p e s a l a p i s m e r e t e k

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

NONPROFIT ÉRDEKVÉDELMI SZERVEZETEK FEJLESZTÉSE (PL.3346) Java-script nyelv. programozás alapjai. Haramia László

C# gyorstalpaló. Készítette: Major Péter

Java és web programozás

A WEB programozása JavaScript 1 dr.gál Tibor őszi félév

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Programozási nyelvek Java

INFORMATIKAI ALAPISMERETEK

2.3. A C nyelv utasításai

Halmazok. Halmazelméleti lapfogalmak, hatványhalmaz, halmazm veletek, halmazm veletek azonosságai.

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Matematikai alapok. Dr. Iványi Péter

A JavaScript főbb tulajdonságai

BASH script programozás II. Vezérlési szerkezetek

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Java és web programozás

Elıírt lépésszámú ciklusok

OOP: Java 1.Gy: Java alapok

Tipp A Word makrók kimerítõ tárgyalását megtalálhatjuk az O Reilly gondozásában megjelent Writing Word Macros címû könyvben.

Intelligens robotok. Előadás vázlat. 1 előadás

Internet programozása. 3. előadás

INFORMATIKAI ALAPISMERETEK

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Kisvállalkozások könyvelése. Infotéka Kft. programjaival

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Események C#-ban Krizsán Zoltán iit

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Webprogramozás szakkör

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

S z á m í t ó g é p e s a l a p i s m e r e t e k

Bánsághi Anna

PHP5 Új generáció (2. rész)

A C# programozási nyelv alapjai

Felhasználó által definiált adattípus

Programozás II. labor

H Sorozatok számokkal feladatcsomag

2. Halmazelmélet (megoldások)

Hivatkozás hagyományos és elektronikus forrásokra

Matematikai és matematikai statisztikai alapismeretek

SZERVER OLDALI JAVASCRIPT. 8. hét MongoDB, séma tervezés, performancia kérdések

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Programozás és adatbázis kezelés PHP ben

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Eddig még nem használt vezérlőket is megismerünk: PlaceHolder, RadioButtonList.

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

J e g y z ő k ö n y v

Programozási nyelvek JAVA EA+GY 1. gyakolat

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Apple Swift kurzus 3. gyakorlat

Python tanfolyam Python bevezető I. rész

Programozási nyelvek II.: JAVA, 4. gyakorlat

Access adatbázis elérése OLE DB-n keresztül

Mesterséges intelligencia 1 előadások

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Országzászlók (2015. május 27., Sz14)

Adatbázis-kezelés. Harmadik előadás

A DimSQL programrendszer évi nyitási teendői

Az élet szép, környezetünk tele van fákkal, virágokkal, repdeső madarakkal, vidáman futkározó állatokkal.

JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ

A PHP nyelv alapjai. Web-Sky Consulting Kft Tóth Imre 2009

Átírás:

SZERVER OLDALI JAVASCRIPT 3. hét Javascript nyelvi elemek

NYELVI ALAPOK: Ez sajnos igen száraz anyag, Viszont a megértékhez és a nyelv elsajátításához kell.

Próbáljuk meg random gifekkel feldobni.

MIRŐL LESZ SZÓ Alapok Típusok Osztályok Függvények Closure

ALAPOK: HOGY NÉZ KI A KÓD var valtozo = 'ertek'; // ez egy comment var masodik = "ertek2"; /* Tobbsoros comment */ function egyfv (parameter1, paramter2){ return 'visszateresi ertek';

ALAPOK: OPERÁTOROK Javascript gyengén típusos nyelv, lényegében vannak típusok, de minden konverzió automatikusan történik. Az ellenőrzéseknél oda kell figyelni, hogy érték szerint egyenlő (==) vagy típus és érték szerint egyenlő (===) alapján ellenőrzünk. Még értelmezett operátorok:!=,!==, >, <, >=, <=

ALAPOK: IF Az if, while, switch (típusos egyenlőségként) a megszokotthoz hasonlóan működik. var a = '2'; var b = 2; if (a == b) { if (a === b) { console.log('3' > 2) //true //false //true //if + else if (valami){ else if (valami2){

ALAPOK: WHILE, SWITCH var b='0'; switch (b){ case 0: console.log('oh'); break; case '0': console.log('hopp'); break; default: console.log('meh'); break; var b=1; while (b!==3){ console.log(b); //1,2,3 b+=1; Switch típusosan ellenőriz. Tehát hopp és nem oh!

TÍPUSOK C++: int szam = 2; szam = 'valami'; // Error string szoveg = new std::string('boo'); void valami = szoveg + szam; // Error var szam = 2; szam = 'valami'; Javascript: var szoveg = 'boo'; var valami = szoveg + szam; //'boovalami' vagy //ha nincs a 2. sor, akkor 'boo2'

TÍPUSOK Egyszerű írni és olvasni! automatikus típus konvertálások nincs memória kezelés (foglalás / felszabadítás) nincs referencia kezelés (később kitérünk rá) Viszont nem jelzi fordítási időben a hibákat, a működés nem mindig az, mint aminek kellene lennie

TÍPUSOK var a = 2; var b = '2'; console.log(a+b); // 22 (string) console.log(a/b); // 1 (number) console.log(a*b); // 4 (number) Érdemes a típusokra figyelni.

TÍPUSOK Hogyan tudom meg, hogy mi milyen típus? var a = 2; var b = 'valami'; var c; console.log(typeof a); console.log(typeof b); console.log(typeof c); //number //string //object

TÍPUSOK Alaptípusok: Undefined Null Boolean String Number Object

TÍPUSOK Pár "nem létező" osztál, ami a nyelv megértéséhez elengedhetetlen: Reference List Completion (erről inkább nem beszélek, break, continue, return, throw részeknél izgalmas)

UNDEFINED A nyelv dinamikus, tehát egy adott ponton egy változó akár lehet még nem definiált (akár globálisan is). A globális névtérben van egy undefined változó definiálva, aminek a típusa Undefined. console.log(typeof a); //undefined console.log(typeof undefined); //undefined var a = 2; console.log(typeof a); //number (hiszen az előbb definiáltuk)

UNDEFINED Az undefined globális változó (vagy bármi, ami definiált de a típusa undefined) részt vehet műveletekben. console.log(undefined + 'alma') ; //'undefinedalma' console.log(undefined + 3); //NaN (ez egy number) var myun = undefined; if (myun === undefined) { // true // ReferenceError: nemletezo is not defined if (nemletezo === undefined) { Hogyan ellenőrzöm, hogy létezik az adott változó? if (typeof myun!== 'undefined'){...

NULL C++ irányból jövőknek kell megnyutatásként, hogy van valami, ami nem 0 de mégis "valami". Undefinedhoz hasonló, és a szabvány miatt a typeof értéke object. var e = null; console.log(e == 0); console.log(e == false); console.log(e == true); console.log(e); console.log(!e); //false //false //false //null //true Ritkán használjuk.

BOOLEAN Szerencsére ez gyakorlatilag úgy működik, ahogy elvárjuk. Két értéke lehet, true és false. A kapcsolata a többi osztállyal a többi hasonló nyelvhez hasonló: var e = true; var f = false; console.log(e == 1); console.log(e == 0); console.log(f == 0); console.log(e == undefined); console.log(f == undefined); console.log(e == null); console.log(f == null); console.log(f == ''); console.log(f == 'aa'); console.log(f == []); console.log(f == [3]); console.log(e == {); console.log(f == {); //true //false //true //false //false //false //false //true //false //true //false //false //false

STRING Szövegek tárolását oldja meg, nagyon sok kiegészítő funkcióval. Primitív típus, de osztályként viselkedik, amikor műveleteket végzünk rajta. A + concatenál, ami a stringgé való konvertálást is elintézi. A ' és " közül bármelyikkel definiálható. var s = 'Lorem ipsum'; var g = "ipsum"; console.log(s); console.log(s+g); console.log(s+42+g); // Lorem ipsum // Lorem ipsumipsum // Lorem ipsum42ipsum

STRING.indexOf(string) : az adott szövegben megkeresi a másik első előfordulását, ha létezik.substr(from,count): a szöveg egy részét adja vissza, a from karateről count számban var s = 'Lorem ipsum'; var g = "ipsum"; console.log(s.indexof(g)) // 6 console.log(s.indexof('boo')) // -1 console.log(s.substr(1,3)); //ore

NUMBER Számok tárolására való, gyakorlatilag a float-nak felel meg (de intet is tárolhat). A műveletek a Number "terén" belül maradnak általában, bármit is tesztünk. var i = 2; var j = 5.222; console.log(i); //2 console.log(j); //5.222 console.log(i+j); //7.222 console.log(i/3); //0.6666666666666666 console.log(i/0); //Infinity, de nem dob hibát!!! console.log(i/'2'); //1 console.log(i/'2a'); //NaN (Not-a-Number) //number, tehát typeof NaN == number... console.log(typeof(i/'2a')); console.log(typeof(i/0)); console.log(typeof(i+j)); //number //number

NUMBER Ezen az objektumon nem definiáltak osztály típusú műveleteket, e helyett a Math segédosztályt kell használni. var e = 5.6; FONTOSABB RÉSZEI: Math.round(e) - kerekítés Math.floor(e) - csonkolás Math.random() - 0,1 közötti random szám console.log(math.round(e)); //6 console.log(math.floor(e)); //5 console.log(math.random()); //0.800291629973799

NUMBER Stringből hogyan lesz number biztonságosan? parseint("10") //10 parseint("10.00") //10 parseint("10.33") //10 parseint("34 45 66") //34 parseint(" 60 ") //60 parseint("40 years") //40 parseint("he was 40") //NaN parseint(string,radix) parsefloat(string) parsefloat("10") //10 parsefloat("10.00") //10 parsefloat("10.33") //10.33 parsefloat("34 45 66") //34 parsefloat(" 60 ") //60 parsefloat("40 years") //40 parsefloat("he was 40") //NaN

LIST Typeof szerint nincs külön lista típus, de a valóságban lényegében van. Nagyon sokszor használjuk, így egyszerű definiálni, illetve FIFO és FILO módban is nagyon jól tud működni.

LIST lista[i]: i. elem kinyerése, 0-tól indulva lista.push(e1,e2,e3,...): elem hozzáadása a lista végéhez lista.pop(): lista végén lévő elem lekérdezése és eltávolítása a listából lista.shift(): első elem levétele és eltávolítása var lista = []; //üres lista lista.push(1); //lista: [1] lista.push(2,3); //lista: [1,2,3] console.log(lista[1]); //2 var elem = lista.pop(); //elem:3, lista: [1,2] elem = lista.shift(); //elem:1, lista: [2] console.log(typeof lista); //object

LIST foreach(cb,thisobject): minden elemen sorban végrehajtunk egy műveletet indexof(e): e elem első előfordulásának megkeresése (mint string) var lista = [1,2,3,'4pista']; var ret = []; lista.foreach(function(e){ ret.push(parseint(e)*2); ); console.log(ret); // [2, 4, 6, 8] console.log(ret.indexof(4)); //1 console.log(ret.indexof('4')); //-1

OBJECT A legfontosabb, hogy az Object itt nem Class, definíció szerint: Object is an unordered collection of key-value pairs. Bizonyos nyelvekben ez a map, viszont javascriptben, majd látjuk, erősen keveredik az Object az OOP dolgokkal.

OBJECT Az object egy dinamikus dolog, tehát bármikor bármelyik részét módosíthatjuk, vagy módosulhat, létrejöhet vagy törlődhet. ELŐSZÖR DEFINIÁLJUK: var emptyobj = {; //tagváltozó nélküli objektum var kutya = { lab: 4, fej: 1, ugat: function(){ console.log('nyauuu'); ; console.log(kutya.lab); //4 console.log(kutya.fej + 3); //4 kutya.ugat(); // Nyauuu console.log(kutya['lab']); //4: igen, így is elérhető ez

OBJECT Mivel dinamikus, bármikor módosíthatok bármit. kutya.fej=3; console.log(kutya.fej); //3 kutya.ugat = function(){ console.log('wuf'); kutya.ugat(); //Wuf //törölhetőek is a tagváltozók delete kutya.lab; console.log(kutya.lab); //undefined console.log(typeof(kutya)); //object Ugye hogy mennyire "majdnem" OOP.

OBJECT Az objectek magukra a this -el tudnak hivatkozni, ami megint csak OOP szerű. var kutya = { say: 'Wuf', ugat: function(){ console.log(this.say); ; kutya.ugat(); //Wuf De ez még mindig nem osztály típusú működés, nincs konstruktor, nincs semmi. Mégis hogyan lesz ebből osztály?

OSZTÁLY Minden Object-nek van egy.prototype tagváltozója, aminek segítségével nem az objektumon, hanem annak ősén, annak "Oszályán" tudunk definiálni. Illetve a new kulcsszó itt is létezik. function Kutya(mitugat){ this.say = mitugat; Kutya.prototype.ugat = function(){ console.log(this.say); var k = new Kutya('Wuf'); k.ugat(); console.log(typeof k); console.log(k instanceof Kutya); //object //true

OSZTÁLY Az öröklés jelentősen bonyolultabb, mint a többi nyelv esetében, ezen javít majd az ECMAScript 6, de nézzük a klasszikus utat: function Kutya(mitugat){ this.say = mitugat; Kutya.prototype.ugat = function(){ console.log(this.say); NagyKutya.prototype = new Kutya(); function NagyKutya(mitugat){ Kutya.call(this,mitugat); NagyKutya.prototype.sokatUgat = function(){ for (var i=0;i<4;i++){ this.ugat(); var k = new NagyKutya('Wuf'); k.ugat(); k.sokatugat(); //Wuf //4x Wuf Ugye hogy nem akarjátok ezt. :)

OSZTÁLY A node.js esetében van egy util modul, abban egy inherits funkció. Az előző megvalósítása ezzel. function Kutya(mitugat){ this.say = mitugat; Kutya.prototype.ugat = function(){ console.log(this.say); function NagyKutya(mitugat){ Kutya.call(this,mitugat); util.inherits(nagykutya, Kutya); NagyKutya.prototype.sokatUgat = function(){ for (var i=0;i<4;i++){ this.ugat(); var k = new NagyKutya('Wuf'); k.ugat(); k.sokatugat(); //Wuf //4x Wuf Egy picit már jobb, de nem jellenző, hogy osztályokat használunk.

OSZTÁLY Miért nem használunk osztályokat, miért csak objecteket: Az osztály egyedül a Model rétegben hasznos Sokszor azt osztályt mint rendező elv használják, tehát függvények egy helyre "dobálva" (névtér és object is tudja ugyanezt) Az osztálynak akkor van értelme, ha állapotot is tárolunk. A javascript esetében igen kevés perzisztens állapottárolás szokott előjönni. ECMAScript 6 előtt, mint látható, elég nagy káosz az OOP, ECMAScript 6 még nagyon friss.

FÜGGVÉNYEK Mivel az OOP szemlélet ennyire kaotikus, így nagyon nagy hangsúly helyeződik a függvényekre és főleg a callbackekre az aszinkron működés miatt. function osszead(a,b){ return a + b; osszead(1,3); //4 EGYSZERŰ ÖSSZEADÁS

FÜGGVÉNYEK A változók definiálására figyelni kell, a változó értelmezésének terére (scope). Vannak globális illetve lokális változók, mindkettőt var-al definiáljuk, viszont a var elhagyása nélkül is definiálódnak automatikusan a változók. Ezt kerülni kell, mert a nem var-al definiáltak a globális térben kerülnek létrehozásra!! function osszead(a,b){ c = a + b; return c; osszead(1,3); //4 console.log(c); //4!!!! EGYSZERŰ ÖSSZEADÁS Ez BUG, nem FEATURE!!

FÜGGVÉNYEK Maguk a függvények is elmenthetőek változókba,illetve az egyik függvény ezáltal átadható a másiknak. var osszead = function (a,b){ return a + b; osszead(1,3); //4 Hm... Nagyon hasonlít ez valamire. Object vs Osztályok vs Függvények.

FÜGGVÉNYEK Függvény paraméterként átadva function muvelet(a,b,amit){ console.log("a: " + a + " b: "+ b); console.log("eredmeny: " + amit(a, b)); var osszead = function (a,b){ return a + b; var kivon = function (a,b){ return a - b; muvelet(1,3,osszead); //a: 1 b: 3 eredmeny: 4 muvelet(1,3,kivon); //a: 1 b: 3 eredmeny: -2

FÜGGVÉNYEK Függvények amik függvényeket adnak vissza. :) function ugat(mit) { return function(){ console.log(mit); ; var valami = 'wuf'; var wuf = ugat(valami);

FÜGGVÉNYEK Viszont mivel nincs referencia / érték alapú átadás, csak paraméter átadás, mi történik, ha valamelyik paramétert megváltoztatom futás közben? CLOSURES Closures are functions that refer to independent (free) variables. In other words, the function defined in the closure 'remembers' the environment in which it was created. Most tessék kapaszkodni.

CLOSURES BEVEZETÉS Van egy izgalmas async függvény javascriptben, ami annyit tesz, hogy a neki átadott függvényt pár másodperc elteltével hívja csak meg, tehát nem rögtön. settimeout(fv, ms) itt a ms késleltetés millisecben. var a=0; settimeout(function () { a+=10; console.log('hopp: ' + a);,1000); a+=1; console.log('kopp: ' + a); Nézzünk egy egyszerű példát: No, itt mit történik? "Mit ír ki?"

CLOSURES BEVEZETÉS Milyen sorrendben futnak le a parancsok? var a=0; //1 settimeout(function () { a+=10; //5 console.log('hopp: ' + a); //6,1000); //2, a settimeout hívás //, nem a belső függvény a+=1; //3 console.log('kopp: ' + a); //4 Kopp: 1 Hopp: 11 Így ez lesz az eredmény:

CLOSURES BEVEZETÉS És ha ezt a kódot nézzük? function belso(a){ return function () { a+=10; console.log('hopp: ' + a); ; var a=0; settimeout(belso(a),1000); a+=1; console.log('kopp: ' + a);

CLOSURES BEVEZETÉS Egy extra sor beszúrásával árnyaltabb lesz a kép. Futási sorrend jelezve van megint. function belso(a){ var b=a; //3 return function () { b+=10; //6 console.log('hopp: ' + b); //7 ; var a=0; //1 settimeout(belso(a),1000); //2 a belső fv is lefut, egy fv-t ad vissza a+=1; //4 console.log('kopp: ' + a); //5 Kopp: 1 Hopp: 10 Így ez lesz az eredmény:

CLOSURES BEVEZETÉS Egyre érdekesebb, variáljunk még egy picit. function belso(a){ return function () { a.ertek+=10; console.log('hopp: ' + a.ertek); ; var a={ertek:0; settimeout(belso(a),1000); a.ertek+=1; a = {ertek:2; console.log('kopp: ' + a.ertek); //ez a lényeg És a meglepetés: Kopp: 2 Hopp: 11

CLOSURES Hogy is van ez? A belső függvények olyan külső (akár globális akár lokális) változókra hivatkoznak, amikkel a függvény létrehozása és meghívása során bármi történhet. Így a javascript engine a változókat "megpróbálja megtartani" referenciaként. Objectek esetében ha az őket tartalmazó változót módosítom, akkor lényegében őj objektumot hozok létre, és nem az eredeti referencia értékét módosítom. Egyszerű típusok (string,number) esetében ezzel nincs gond, mert nem hozok létre új objektumot, hanem a meglévő értékét módosítom. Ez látszik az előző dián.

CLOSURES Ez így elég meta, hol szokott gondot okozni. For ciklusokban async vagy fv definícióknál: for (var i=0;i<4;i++){ settimeout(function(){ console.log(i);,100); //4 db 4-est ír ki, mert az i változik Ez helyesen: for (var i=0;i<4;i++){ settimeout((function(szam){return function(){ console.log(szam); )(i),100); //itt már 0,1,2,3 íródik ki, mert létrejön //egy szam nevü lokális változó (ami lehetne i is)

CLOSURES Ezt sokszor még a profik is benézik, főleg ha egy egyszerű típusokkal dolgozó függvényt kell refaktorálni objektekké, akkor nem triviális, hogy az eredeti lefutás hogyan törénik.

LÉNYEGÉBEN ENNYI Erre épül a nyelv, persze, sok extrával és hasznos kis aprósággal, de a többit majd csakorlatban. Köszönöm a kitartást!