(Készítette: Kiss Beáta, 2025/2026 tanév)
Bár a weboldalak készítését elsősorban deklaratív nyelvek segítségével készítjük (HTML, CSS), mégis léteznek olyan opciók, amivel olyan működéssel is fel tudjuk ruházni oldalainkat, amik túlmutatnak a HTML és CSS lehetőségein. Ilyen például a JavaScript nyelv (ami egy imperatív = utasításalapú ), amit a böngészők képesek futtatni és segítségével dinamikus és interaktív weboldalakat készíthetünk.
Az imperatív nyelvet elsősorban az különbözteti meg a deklaratív nyelvtől, hogy vannak benne közvetlen vezérlőszerkezetek, mint például a ciklus és az elágazás és ezekkel definiálják az értelmezőnek, hogy hogyan fusson le egy algoritmus. Ezzel ellentétben a deklaratív nyelvek a végeredményt deklarálják és a nyelvi értelmmezőre (végrehajtóra, ami a HTML és CSS esetén a böngésző) bízzák, hogy a kívánt eredményt miként éri el.
| Típus | Leírás |
|---|---|
| Number | Számok tárolására szolgál, beleértve az egész számokat és a lebegőpontos számokat is |
| BigInt | Nagy számok tárolására szolgál, amelyek túllépik a Number típus maximális értékét |
| String | Karakterláncok tárolására szolgál |
| Boolean | Logikai típus: True vagy False |
| undefined | Olyan változók értéke, amelyek még nincsenek inicializálva |
| null | Speciális jelentéssel bíró "üres" érték, amely azt jelzi, hogy egy változó szándékosan üres vagy nem létezik |
| Típus | Leírás |
|---|---|
| Array | Tömb, rendezett listát tárol. A tömbök indexelt elemeket tartalmaznak, és az elemek bármilyen típusúak lehetnek |
| Object | Az objektumok kulcs-érték párokat tárolnak, ahol a kulcsok (vagy tulajdonságok) stringek, és az értékek bármilyen típusúak lehetnek (primitív vagy más objektumok) |
| Function | A függvényeket külön típusként kezeli a JavaScript. |
| Map | Kulcs-érték párok tárolása |
| Set | Halmaz, nem engedi a duplikált értékek tárolását |
Az értékadás a változók értékének beállítását jelenti. A JavaScript-ben az értékadás az = operátorral történik. A változók deklarálásához a var, let vagy const kulcsszavakat használjuk. A const kulcsszóval konstans értékeket adhatunk meg!
Példa:
let x = 9; // x értéke legyen 9
const y = 7; // y értéke legyen 7, nem módosítható
Az értékadás során a jobb oldalon lévő kifejezés kiértékelődik, és az eredmény a bal oldalon lévő változóhoz kerül.
A JavaScript támogatja az alapvető aritmetikai műveleteket, mint például az összeadás, kivonás, szorzás, osztás és maradékos osztás. Az aritmetikai operátorok a következők:
| Művelet | Leírás |
|---|---|
| Összeadás (+) | Két szám összeadása |
| Kivonás (-) | Az első szám kivonása a másodikból |
| Szorzás (*) | Két szám szorzása |
| Osztás (/): | Az első szám osztása a másodikkal |
| Maradékos osztás (%): Az osztás maradékának meghatározása |
Példa:
let a = 6;
let b = 2;
let sum = a + b; // 8
let difference = a - b; // 4
let product = a * b; // 12
let quotient = a / b; // 3
let remainder = a % b; // 1
A logikai műveletek a logikai értékek (boolean) manipulálására szolgálnak. A JavaScript-ben a következő logikai operátorok állnak rendelkezésre:
| Logikai operátor | Leírás |
|---|---|
| ÉS (&&) | Két kifejezés igaz, ha mindkettő igaz |
| VAGY (||) | Két kifejezés igaz, ha legalább az egyik igaz |
| NEM (!) | Megfordítja a logikai értéket (igazból hamis, hamisból igaz) |
Példa:
let x = true;
let y = false;
let andResult = x && y; // false
let orResult = x || y; // true
let notResult = !x; // false
A tömböket elemi típusú adatokból állítjuk össze, ahol a tömb bármely eleme tetszőleges típusú lehet. Vagyis egy tömbben többféle típusú adat is előfordulhat. Tömböket a következőképpen hozhatunk létre:
var vektor1 = new Array(); // 0 elemű tömb
var vektor2 = new Array(10); // 10 elemű tömb
var vektor1 = new Array(0,5,10,15); // konstruktor hívással
var vektor2 = [1,3,5,7,9]; // tömbliterál létrehozásával, az elemeket "[" és "]" között megadva
function range(start, finish) {
for (let i = start; i < finish; ++i) {
yield i;
}
}
var vektor1 = [j * j for each (j in range(0, 5))]; // vektor1 = [0,1,2,3,4]
var vektor2 = [j * j for each (j in range(0, 10)) if (i % 2 == 0)]; // vektor2 = [0,2,4,6,8]
// A szintaxis a tömbliterál létrehozásához hasonlít, de az elemeket nem mi soroljuk fel (explicit módon) , hanem egy speciális függvényt (a generátort) többször megismételve (iterálva: for each). A generátor által visszaadott értékeket egyenként átadhatjuk (a példában j*j), és szelektálhatjuk is (lásd a második példában használt if-et).
Tömb sajátosságai:
Példa:
var myArray = [1, 2]; // myArray[4] = undefined, newArray.length = 2
NextArray[3] = 4; // NextArray[2] = undefined, NextArray.length értéke 4
myArray = [, "2. elem", , "4. elem"];
var twoDimArray = [ [1,2], [21,22] ];
Asszociatív tömb A tömbök indexelésére pozitív egészek helyett Stringeket is használhatunk. Ilyenkor használható a . operátor az egyes tömbelemek eléréséhez Például:
var myArray = new Array();
myArray["a"] = 10;
myArray["b"] = 20;
myArray["a"] == myArray.a == 10 // . operator használata
A háttérben egy "a" nevű property jött létre 10-es értékkel a myArray objektumban. Ezt bármilyen objektummal megtehetjük, tehát bármilyen objektum használható asszociatív tömbként. A tömböket érdemes erre a célra használni az átláthatóság miatt valamint a tömb plusz szolgáltatásai (pl. rendezésre sort() függvény használható) miatt.
var myArray = { "first":10, "last": 100}; // tetszőleges új objektum tömbbé alakítása
alert(myArray["first"]); // output: 10
Verem A verem (stack) egy LIFO (Last In First Out: utoljára be, először ki) adatszerkezet. A tömbök rendelkeznek push(), és pop() műveletekkel.
A verem többi művelete a tömb hosszának és az indexelésnek a használatával oldható meg.
Sor A sor (queue) egy FIFO (First In First Out: a besorolt elemek mindig a sor végére kerülnek, elemet kivenni a sor elejéről lehet.) A tömbök rendelkeznek shift() és unshift() műveletekkel.
Tömb metódusok
A fentebb említett metódusokon túl számos metódussal rendelkeznek a tömbök.
További metódusok:
| Metódus | Leírás |
|---|---|
| concat(value1[value2[value...]]) | Egy tömbbé konkatenálja (összefűzi) a paramétereket, melyek lehetnek egyszerű értékek, de tömbök is. |
| every(function) | Ellenőrzi, hogy a paraméterként kapott, logikai értékű függvény a tömb összes elemére igaz-e. |
| filter(function) | A paraméterbe megadott függvényre igazat adó tömbelemeket tartalmazó új tömböt ad vissza. |
| forEach(function) | A paraméterbe megadott függvényt a tömb minden elemére végrehajtja. |
| join(delimeter) | Egy stringet ad vissza a tömb elemeinek felsorolásából, amiben az elemeket a delimiter választja el. |
| indexOf(searchStr[, startIndex]), lastIndexOf(searchStr[, startIndex]) | A tömbben megkeresi a searchStr első / utolsó előfordulását (opcionálisan a startIndextől kezdve). Ha nincs, az eredmény -1. |
| map(function) | A tömb minden elemére a transzformáló függvényt alkalmazza, és a transzformált elemek tömbjével tér vissza. |
| reverse() | Megfordítja a tömb elemeinek sorrendjét. |
| slice([begin[, end]]) | Az egész tömbről, vagy a megadott indexhatárok közötti részről másolatot készít. |
| some(function) | A megadott függvényt addig alkalmazza a tömb elemeire, amíg a függvény igazat nem ad. Ekkor a visszatérési érték igaz, egyébként hamis. |
| sort([function]) | Rendezi a tömb elemeit. Paraméter nélkül: alfabetikusan, paraméterrel: az átadott rendező logika szerint. |
| splice(start[, howmany[, element1[,element...]]]) | A start indextől kezdve howmany darab elemet töröl a tömbből. A törölt elemekből álló tömböt ad vissza. |
| toSource() | A tömböt leíró forráskódot adja vissza. |
| toString() | A tömböt String-ként jeleníti meg. (Az objektumokra csak "[object]"-et ír.) |
A JavaScript-ben a kód blokkok kialakítására (a Java-hoz, c++-hoz, c#-hoz hasonlóan) a { ... } (kapcsos zárójelek) jelölést alkalmazzuk. A függvényeket is ezek seítségével és a function kulcsszóval hozzuk létre, de ennek több formája is megengedett:
function: Függvény deklarálásaarrow function: Függvény deklarálása arrow funkcióvalEz a megadási mód a legelterjedtebb. A kód futása előtt "beemelésre" kerül. A deklaráció előtt is meghívható.
function mulWithTen(int num) {
let a = num;
let b = 10;
return a * b;
}
let addTwoNumber = function(int num1, int num2) { return num1 + num2; }
Célszerű használni például kisebb függvényeknél vagy tömbök és objektumok feldolgozásánál. Ha nincs return => undefine értékkel tér vissza.
let addArrow = (x, y) => x + y; // arrow function
console.log(addArrow(2, 3)); // 5
Létezik egy speciális függvény forma, ami azonnal le is fut, amikor kiértékelődik, ez az un. IIFE (Immediately Invoked Function Expression).
Ez gyakorlatilag egy anonym függvény, amit a deklarálás után azonnal le is futtatunk:
(function() {
// kód
})();
A JavaScript-ben a változó hatásköre (scope) arra utal, hogy melyik kódrészben van definiálva és hol érhető el a változó.
A var, let és const kulcsszavak segítségével tudunk változókat deklarálni és mindegyiknek megvan a maga hatásköre.
var: Függvényhatáskör (function scoped). Az így deklarált változók hatásköre (ahol elérhetők) az a függvényblokk, ahol deklaráltuk. Ha egy változót var-ral deklarálunk a függvényeken kívül, akkor globálisan elérhető.let és const: Blokkhatáskör. A let-tel és const-tal deklarált változók hatásköre az a blokk, ahol deklaráltuk őket. Ez lehet egy függvény, egy ciklus vagy bármi, aminek tudunk { .. }-el blokkot definiálni.Példa:
// Globális változó
var globalVar = 5;
let globalLet = 7;
const globalConst = 14;
function myFunction() {
// Függvényhatáskör - function scoped
var functionVar = 40;
let functionLet = 50;
const functionConst = 60;
if (true) {
// Blokkhatáskör
var blockVar = 70;
let blockLet = 80;
const blockConst = 90;
}
console.log(globalVar); // 5
console.log(globalLet); // 7
console.log(globalConst); // 14
console.log(functionVar); // 40
console.log(functionLet); // 50
console.log(functionConst); // 60
console.log(blockVar); // 70
console.log(blockLet); // ReferenceError: blockLet is not defined
console.log(blockConst); // ReferenceError: blockConst is not defined
}
myFunction();
Ebben a példában a blockLet nem elérhető a feltételes utasításon kívül, mert let-tel van deklarálva és így blokkhatásköre van. Másrészt a blockVar elérhető a feltételes utasításon kívül, mert var-ral van deklarálva és így függvényhatásköre van.
A láthatóság (visibility) szempontjából a változó hatásköre meghatározza, hogy hol érhető el. Egy változó a saját hatáskörében elérhető, és bármely kód, amely a hatáskörön belül van, elérheti. Ha egy változó nem látható, akkor nem érhető el és a hozzáférési kísérlet ReferenceError-t eredményez.
A JavaScript változók láthatóságának speciális esete az úgy nevezett hoisting. Ez egy olyan jelenség, amikor a változók és függvények deklarálása az adott scope (hatáskör) tetejére kerül, függetlenül attól, hogy hol van a kódunkban.
A var kulcsszóval deklarált változók esetében a hoisting azt jelenti, hogy a változó deklarálása az adott scope tetejére kerül, de az értékadás (azaz a változó értékének beállítása) nem. Ez azt jelenti, hogy a változó elérhető az egész scope-ban, de az értéke undefined lesz, amíg el nem érjük a tényleges értékadást.
Példa:
console.log(x); // undefined
var x = 10;
console.log(x); // 10
Ebben a példában a x változó deklarálása a scope tetejére kerül, ezért elérhető az első console.log sorban is, de az értéke undefined lesz, mert az értékadás csak a második sorban történik.
A let és const kulcsszavakkal deklarált változók esetében a hoisting nem történik meg, azaz a változók csak a deklarálásuk után lesznek elérhetők.
Példa:
console.log(x); // ReferenceError: x is not defined
let x = 10;
console.log(x); // 10
Ebben a példában a x változó nem elérhető az első console.log sorban, mert a deklarálása csak a második sorban történik.
A függvények esetében a hoisting mindig megtörténik, függetlenül attól, hogy milyen kulcsszóval vannak deklarálva.
Példa:
console.log(f()); // 10
function f() {
return 10;
}
Ebben a példában az f() függvény deklarálása a scope tetejére kerül, ezért elérhető az első console.log sorban is.
Összefoglalás:
- A
varfüggvényhatáskörrel rendelkezik, míg aletésconstblokkhatáskörrel.- A
var-ral deklarált változók "hoistolódnak" a hatáskör tetejére, míg aletésconstváltozók nem.- A
letésconstváltozók nem érhetők el, amíg deklarálva nem lesznek, míg avarváltozók a hatáskörükben bárhol elérhetők.- A változó hatásköre meghatározza a láthatóságát és elérhetőségét.
+: Összeadás-: Kivonás*: Szorzás/: Osztás++: Érték növelése (increment)--: Érték csökkentése (decrement)=: Értékadás (assign)==: Egyenlőség ellenőrzése (loose equality)===: Szigorú egyenlőség ellenőrzése (strict equality)Példák:
let x = 5;
let y = 3;
console.log(x + y); // 8
console.log(x - y); // 2
console.log(x * y); // 15
console.log(x / y); // 1.67
x++;
console.log(x); // 6
x--;
console.log(x); // 5
let z = x;
console.log(z); // 5
console.log(x == y); // false
console.log(x === y); // false
for: Egy adott feltétel teljesülése esetén ismétli a kódotfor...in: Egy objektum tulajdonságain fut végig.for...of: Egy iterálható objektum (például egy tömb vagy egy szöveg) elemein megy végig.while: Egy adott feltétel teljesülése esetén ismétli a kódotdo-while: Egy adott feltétel teljesülése esetén ismétli a kódotbreak: Kilép a ciklusból vagy elágazásból.forEach(): Tömb elemein iterál.Példák:
// for
for (let i = 0; i < 5; i++) { console.log(i); }
// for..in
let obj = {a: 1, b: 2, c: 3};
for (let key in obj) { console.log(key + ": " + obj[key]); }
// for..of
let arr = [1, 2, 3];
for (let elem of arr) { console.log(elem); }
// while
let j = 0;
while (j < 5) {
console.log(j);
j++;
}
// do-while
let k = 0;
do {
console.log(k);
k++;
} while (k < 5);
// break
let i = 0;
while (i < 5) {
if (i === 3) {
break;
}
console.log(i);
i++;
}
if: Feltétel szerinti elágazáselse: Alternatív elágazás, ha az elötte lévő if feltétel nem teljesülneswitch: Egy változó értéke alapján dönti el, hogy melyik kódrészletet kell végrehajtaniPéldák:
let x = 5;
if (x > 10) {
console.log("x nagyobb, mint 10");
} else {
console.log("x kisebb, mint 10");
}
let y = 2;
switch (y) {
case 1:
console.log("y egyenlő 1-gyel");
break;
case 2:
console.log("y egyenlő 2-vel");
break;
default:
console.log("y nem egyenlő 1-gyel vagy 2-vel");
}
Ternális operátor : A ternális operátor (?:) egy olyan operátor, amely három operandust vesz igénybe, és egy értéket ad vissza.
A következő szintaxissal használják:
feltétel ? igaz_érték : hamis_érték
A ternális operátor működése:
const szam = 5;
const eredmeny = szam > 10 ? "nagyobb mint 10" : "kisebb vagy egyenlő 10";
console.log(eredmeny); // "kisebb vagy egyenlő 10"
Egy objektum egy olyan entitás, amely tulajdonságokat és metódusokat tartalmaz. A tulajdonságok olyan értékek, amelyek az objektumhoz tartoznak, míg a metódusok olyan függvények, amelyek az objektumon hajtanak végre műveleteket.
const auto = {
marka: "Toyota",
tipus: "Corolla",
ev: 2015,
szin: "piros",
gyorsitas: function() { console.log("Gyorsítok!"); }
};
A fenti példában az auto objektum rendelkezik:
Elérésük a következő módon történik:
console.log(auto.marka); // "Toyota"
auto.gyorsitas(); // "Gyorsítok!"
Új tulajdonság vagy metódus megadása:
auto.uj_tulajdonsag = "klíma";
auto.klima = function() { console.log("Klíma bekapcsolva!"); };
Tulajdonságok vagy metódus törlése:
delete auto.marka;
delete auto.gyorsitas;
A kivételkezelés (exception handling) segít kezelni azokat a hibákat, amelyek a program futása közben történhetnek. Használatával mi magunk döntjük el, mit tegyünk a hiba esetén.
A try-catch a kivételkezelés alapja. A try blokkban írjuk azt a kódot, amely hibát okozhat, a catch blokkban pedig kezeljük a hibát:
try {
const szám = 10 / 0; // Matematikai hiba
console.log(szám);
} catch (hiba) {
// Ha hiba történik, ezt futtatjuk
console.log("Hiba történt: " + hiba.message);
}
A finally blokk mindig lefut, akár történt hiba, akár nem:
try {
console.log("Próbálunk valamit...");
} catch (hiba) {
console.log("Hiba: " + hiba.message);
} finally {
console.log("Ez mindig futtatódik!");
}
A throw segítségével saját hibát dobhatunk:
function oszt(a, b) {
if (b === 0) {
throw new Error("Nullával nem lehet osztani!");
}
return a / b;
}
try {
console.log(oszt(10, 0)); // HIBA!
} catch (hiba) {
console.log("Hiba: " + hiba.message);
}
Az objektum-orientált programozás (OOP) az adatokat és funkcionalitást objektumok köré szervezi. Az objektumok olyan entitások, amelyeknek vannak tulajdonságai (properties) és metódusai (methods). Ez a megközelítés nagyon hasonlít a valós világra – például egy autó objektumnak vannak tulajdonságai (szín, márka, sebesség) és metódusai (indítás, fékezés, gyorsítás).
class Auto {
constructor(marka, szin, sebesseg) {
this.marka = marka;
this.szin = szin;
this.sebesseg = 0; // kezdeti sebesség
}
// Metódusok
indítas() {
console.log(`${this.marka} autó elindult!`);
}
gyorsitas(ertek) {
this.sebesseg += ertek;
console.log(`Jelenlegi sebesség: ${this.sebesseg} km/h`);
}
fekezes() {
this.sebesseg = 0;
console.log("Autó megállt!");
}
}
// Objektum létrehozása
const autom = new Auto("Toyota", "piros");
autóm.inditas();
autóm.gyorsitas(50);
autóm.fekezes();
Az öröklés lehetővé teszi, hogy egy új osztály örökölhessen egy meglévő osztálytól.
class Jarmu {
constructor(marka) {
this.marka = marka;
}
informacio() {
console.log(`Márka: ${this.marka}`);
}
}
class Auto extends Jarmu {
constructor(marka, ajtok) {
super(marka); // szülő osztály konstruktora
this.ajtok = ajtok;
}
informacio() {
super.informacio(); // szülő metódus meghívása
console.log(`Ajtók száma: ${this.ajtok}`);
}
}
const auto = new Auto("BMW", 4);
auto.informacio();
// Kimenet:
// Márka: BMW
// Ajtók száma: 4
A getter és setter metódusok lehetővé teszik az adatok kontrollált elérését és módosítását.
class Ember {
constructor(nev, kor) {
this._nev = nev;
this._kor = kor;
}
// Getter
get nev() {
return this._nev;
}
get kor() {
return this._kor;
}
// Setter
set kor(ertek) {
if (ertek > 0 && ertek < 150) {
this._kor = ertek;
} else {
console.log("Érvénytelen kor!");
}
}
}
const ember = new Ember("János", 25);
console.log(ember.kor); // 25
ember.kor = 30; // setter meghívása
console.log(ember.kor); // 30
ember.kor = -5; // "Érvénytelen kor!"