2. gyakorlat
WebStorm IDE használata¶
Új projekt létrehozása¶
- Nyisd meg a WebStormot.
- Kattints a "New Project" vagy "Create New Project" gombra.
- A felugró ablakban add meg a projekt helyét és nevét, és kattints a "Language" választónál a JavaScriptre. Amennyiben semmilyen feleslegesen generált dolgot nem szeretnél, válaszd az "Empty Project" opciót a bal oldali panelről. Ebben az esetben is állítsd be a projekt helyét és nevét.
- Kattints a "Create" gombra.
JavaScript fájlok létrehozása¶
- Jobb klikk a projekt mappájára a Project nézetben.
- Válaszd a "New" → "JavaScript File" opciót.
- Add meg a fájl nevét (.js kiterjesztés nélkül).
- Nyomj Entert.
JavaScript kód futtatása¶
- Jobb klikk a .js fájlra.
- Válaszd a "Run 'filename.js'" opciót.
- A kimenet a Run ablakban jelenik meg alul.
VAGY
- Kattints a zöld "Play" ikonra a WebStormban.
- A kimenet a Run ablakban jelenik meg alul.
Kommentek¶
JavaScriptben is lehetőségünk van kommentek (megjegyzések) írására.
Java, C nyelvekből ismerős lehet a szintaxis, amit használuk: az egysoros kommenteket //
után adjuk meg, míg a több soros kommenteket /*
és */
közé írjuk.
A Pythonból ismerős #
karaktert itt nem használhatjuk.
1 2 3 4 5 6 |
|
Kiíratások¶
A gyakorlaton szinte mindig a console.log()
-ot fogjuk használni kiíratásra.
Ennek segítségével egyszerűen írhatunk adatokat a konzolra.
1 |
|
Fontosabb adattípusok¶
A JavaScript legalapvetőbb adattípusai: boolean, number, string és undefined.
A boolean (amint arra a nevéből rájöhetünk) logikai adattípus. Kétféle értéke lehet: true
(logikai igaz érték) vagy false
(logikai hamis érték).
A number adattípus a számok adattípusa lesz. JavaScriptben nincs külön egész és lebegőpontos típus, a szám adatok minden esetben number típusúak lesznek. Ez minden számot lebegőpontosként ábrázol, ami sajnos sok esetben pazarló.
A string természetesen a szöveges adattípust jelenti. JavaScriptben stringeket általában aposztrófok ('...') vagy idézőjelek ("...") között szoktunk megadni. A stringek összefűzése a +
(plusz) operátorral történik.
1 2 3 4 |
|
A kimenet minden esetben applepie
lesz.
A JavaScript egyik érdekes adattípusa az undefined
, ami a definiálatlan értéket jelenti. Például amikor egy változót deklarálunk (létrehozunk), de nem adunk neki értéket, akkor a változó értéke automatikusan undefined
lesz.
Típusellenőrzés¶
JavaScriptben a typeof
operátor segítségével megkaphatjuk egy adott érték típusát. A visszaadott típus minden esetben egy szöveges érték lesz.
1 2 3 4 5 |
|
Változók¶
Természetesen JavaScriptben is hozhatunk létre változókat, amelyeknek értéket a szokásos =
operátorral adhatunk.
JavaScriptben többféleképpen is létrehozhatunk változókat.
Tekintsük az alábbi két szintaxist:
var variableName = value;
let variableName = value;
Amint láthatjuk, változókat létrehozhatunk a nyelvben régebben óta létező var
, illetve az újabb (ECMAScript 6 szabványban bevezetett) let
kulcsszavakkal.
Ahhoz, hogy megértsük a két kulcsszó közötti működésbeli különbséget, nézzük az alábbi kódpéldát!
1 2 3 4 5 6 7 |
|
Kimenet:
1 2 |
|
Mi történt itt? Egy utasításblokkon (kapcsos zárójelpáron, de ez lehetne akár egy függvény törzse) belül létrehoztunk két változót: az a
változót a var
kulcsszóval, míg a b
változót a let
kulcsszóval.
Amikor a blokkon kívül kiírattuk a var
kulcsszóval létrehozott változó értékét, akkor semmi gond nem volt, a blokkon belül létrehozott változó a blokkján kívül is látszott. Ez igen problémás lehet, hiszen ellentmond a többi programozási nyelv logikájának.
Ezzel szemben a let
kulcsszóval létrehozott b
változó a már jól megszokott módon viselkedik: az őt létrehozó blokkon belül lokális lesz, ha pedig ezen a blokkon kívül hivatkozunk rá, akkor hibaüzenetet kapunk.
Tipp
Összefoglalva: változók létrehozásakor használjuk inkább a let
kulcsszót!
Az ECMAScript 6 szabvány a let
mellett egy újabb módosítószót is hozott magával változók létrehozására, mégpedig a const
kulcsszót, amit már a múlt órán láthattunk.
A const
kulcsszóval létrehozott változók a let
kulcsszóval létrehozott változókhoz hasonló módon viselkednek, azzal a kikötéssel, hogy az ő kezdőértéküket nem lehet módosítani ("konstans változók").
1 2 3 4 5 6 7 |
|
Kimenet:
1 2 |
|
A változók létrehozása során a változónévre vonatkozóan van néhány tudnivaló, amivel érdemes tisztában lennünk:
- A változónév nem kezdődhet számmal
- A változónév betűt, számot és speciális jelet (
_
,$
) tartalmazhat - Foglalt nevek nem használhatók változónévként (pl.
function
,return
,let
,class
)
A JavaScript egy dinamikusan típusos nyelv, tehát lehetőségünk van arra, hogy ugyanabban a változóban eltérő típusú értékeket tároljunk.
1 2 3 4 5 6 7 8 9 10 11 |
|
Kimenet:
1 2 3 4 5 6 |
|
Típuskonverzió¶
JavaScriptben az adattípusok közötti konverzió automatikus. Két egyszerű példa automatikus típuskonverzióra:
- Ha a
+
(plusz) operátor bármely operandusa szöveg, akkor az operátor stringösszefűzést fog végezni. Ekkor a nem string típusú operandusok automatikusan szöveges típusra lesznek konvertálva.
1 2 |
|
- A
*
operátor a szorzást jelenti. Ha valamelyik operandusa nem szám típusú, akkor megpróbálja aztnumber
típusúra konvertálni. Ha a konverzió sikeres, akkor elvégezzük a szorzást, ellenkező esetben pedigNaN
-t kapunk vissza (Not a Number).
1 2 |
|
NaN (Not a Number) JavaScriptben¶
Ahogy láttuk, egy szöveg összeszorzása egy számmal ebben a fenti esetben NaN
értéket eredményezett. A NaN
(Not a Number) egy speciális érték JavaScriptben, amely azt jelenti, hogy egy művelet eredménye nem értelmezhető számként. Bár a neve "Not a Number", technikai szempontból a NaN
maga is number
típusú érték.
1 2 |
|
Természetesen az automatikus típuskonverzió mellett lehetőségünk van manuálisan is egy adatot egy másikra típusra konvertálnunk bizonyos beépített függvények segítségével. Ezt nevezzük (explicit) typecasting-nak.
Boolean(expr)
: azexpr
kifejezéstboolean
típusúvá alakítjaNumber(expr)
: azexpr
kifejezéstnumber
típusúvá alakítjaString(expr)
: azexpr
kifejezéststring
típusúvá alakítja- Számok közötti konverzióra használhatjuk a
parseInt()
ésparseFloat()
függvényeket
1 2 3 4 5 6 7 |
|
Fontosabb operátorok¶
A JavaScript fontosabb operátorai:
Kategória | Operátorok |
---|---|
Aritmetikai operátorok | + , - , * , / , % , ** |
Hozzárendelő operátorok | = , += , -= , *= , /= |
Incrementáló, decrementáló operátorok | ++ , -- |
Összehasonlító operátorok | == , === , != , !== , < , <= , > , >= |
Logikai operátorok | && , || , ! |
A legtöbb operátor a korábban tanultakkal megegyező módon viselkedik (hasonlóan, mint Pythonban vagy éppen mint Javaban).
- A
/
operátor mindig (egész operandusok esetén is) lebegőpontos osztást végez - Hatványozásra a
**
(dupla csillag) operátor alkalmas - JavaScriptben használhatjuk a
++
és--
operátorokat egy változó értékének 1-gyel való növeléséhez vagy csökkentéséhez
Érdekesek még az ==
(dupla egyenlő) és az ===
(tripla egyenlő) operátorok. Mindkettőt összehasonlításra használjuk, viszont van egy lényegi különbség a két operátor működésében:
- Az
==
pontosan akkor ad vissza igazat, ha a két operandusának értéke megegyezik - Az
===
pontosan akkor ad vissza igazat, ha a két operandusának értéke és típusa egyaránt megegyezik
1 |
|
Példa: Az ==
és ===
operátorok működésbeli különbsége
1 2 |
|
Kimenet:
1 2 |
|
Mi is történik itt? Mivel egy számot akarunk egy stringgel összehasonlítani, ezért a JavaScript automatikus típuskonverziót végez. A konverzió után a két változó értéke megegyezik (42
), így az ==
operátor igazat ad vissza. Viszont mivel a 42
egy number
, míg a "42"
egy string
típusú adat, ezért az ===
operátor visszatérési értéke hamis lesz.
Tipp
Az összehasonlításoknál általában érdemes típusra is ellenőriznünk, tehát használjuk az ===
operátort!
Az ==
operátor tagadása a !=
(ez pontosan akkor ad vissza igazat, ha a két operandus eltérő értékű), míg az ===
operátort a !==
segítségével tagadhatjuk (ez pontosan akkor ad vissza igazat, ha a két operandus eltérő értékű vagy eltérő típusú).
Típuskonverzió unáris operátorokkal¶
A +
operátor JavaScriptben kétféle funkciót is ellát: működhet unáris operátorként (típuskonverzióra) és bináris operátorként (összeadásra vagy string összefűzésre).
Ez a kettős szerep gyakran zavart okozhat.
Amikor a +
operátort egyetlen operandussal használjuk (unáris operátor), akkor az operandust number
típusúra próbálja konvertálni. Ez egy gyors módja a típuskonverziónak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Hasonlóképp, ez a -
operátorral is működhet, bár ezt ritkábban láthatni valós kódban.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Érvénytelen konverziókat is végezhetünk, ezek eredménye azonban nem mindig egyértelmű, néhány példa:
1 2 3 4 5 6 |
|
Az operátort használhatjuk bármilyen művelet során:
1 2 3 4 5 |
|
Célszerű körültekintően használni ezt a fajta konverziós operátort, mert az ember könnyen írhat olyan kódot, amiről nem tudja, hogy pontosan milyen végeredményt ad.
Az alább láthatunk két példát. Az első esetben az operátorok precedenciája miatt először elvégzésre kerül az összeadás, majd pedig a szöveggé alakítás és összefűzés, a másik esetben pedig mivel egy szöveg van a művelet elején, így minden további "összeadás" szöveg összefűzést fog jelenteni.
1 2 3 4 5 6 7 |
|
Csak a +
operátor használatával elég cifra kifejezéseket is készíthetünk.
1 2 |
|
Pontosvessző használata JavaScriptben¶
A JavaScriptben pontosvesszőket (;
) használunk az utasítások lezárására. Bár a JavaScript rendelkezik Automatikus Pontosvessző Beszúrás (ASI) funkcióval (bővebben), ami azt jelenti, hogy a pontosvesszők technikailag opcionálisak sok esetben, bevált gyakorlat, hogy mindig használjuk őket, ezt több style guide is ajánlja.
Sőt, ez segít a kódot egyértelműbbé és könnyebben olvashatóvá tenni.
Ezen felül azonban előfordulhat, hogy az ASI-ra támaszkodás hibás működést eredményez. Tekintsük az alábbi példát.
1 2 3 4 5 6 |
|
A console.log
által kiírt érték az elvárthoz képest egészen más, egészen pontosan undefined
.
Ennek oka az ASI, ami a return
után gondolta úgy, hogy oda kellene amúgy a pontosvessző, így oda illesztette be.
Jelenleg a legegyszerűbb megoldás, ha nem törjük meg a sort, azonban a későbbiekben még látni fogunk példát helytelen ASI-ra.
1 2 3 4 5 |
|
Mindig zárd le az utasításaidat pontosvesszővel! Ez megelőzi a lehetséges problémákat és kiszámíthatóbbá teszi a kódot.
Feladatok¶
1. feladat: Kézfogás (2 pont)¶
Egy több tagú baráti társaságban mindenki mindenkivel kezet fog (nyilván önmagával senki sem fog kezet, ennyire kétségbeesettek azért nem vagyunk). Írj egy kezfogas
nevű függvényt, amely a társaságban lévő emberek számát kapja paraméterül, és visszaadja, hogy összesen hány kézfogás történt!
Példa:
- Input: 10
- Return: 45
2. feladat: Egyezés (2 pont)¶
Írj egy egyezes
nevű függvényt, amely két tetszőleges típusú paramétert vár! A függvény adja vissza, hogy a két paraméter értékre és típusra is megyezik-e!
Példa:
- Input: 1, true
- Return: false
Példa:
- Input: false, false
- Return: true
3. feladat: Furcsa matematika (2 pont)¶
Mit írnak ki az alábbi kifejezések? Először gondold végig, majd ellenőrizd őket az IDE-ben.
1 2 3 4 5 6 |
|
4. feladat: Átlagszámítás¶
Írj egy atlag
függvényt, amely három számot kap paraméterül és visszaadja a számtani közepüket!
1 2 3 4 5 6 |
|
5. feladat: Parkolás¶
Egy parkolóban az első óra 300 Ft, minden további megkezdett óra 200 Ft. Írj egy parkolodij
függvényt, amely a parkolási időt órában kapja paraméterül, és visszaadja a fizetendő összeget!
1 2 3 4 5 6 7 8 9 |
|