1. blokk · Alapok · 3. fejezet
Az operátorok azok a jelek, amelyekkel műveleteket végzünk: összeadunk, összehasonlítunk, logikai döntéseket
hozunk. A kifejezés olyan kódrészlet, amelynek értéke van. Ebben a fejezetben a számolástól a logikai
döntésekig mindent végigveszünk — a hírhedt == vs === különbséget, a rövidzárat,
a feltételes ? : operátort és a Math objektum leggyakoribb függvényeit.
%, **, +=, ++), és tudod, mire jó a maradék.===-t írsz, és el tudod magyarázni, miért veszélyes a ==.&&, ||, !-vel, ismered a rövidzárat és a truthy/falsy szabályt.a ? b : c), és kerekítesz, abszolút értéket, minimumot számolsz a Math-tal.A kifejezés bármi, aminek értéke van: egy szám (42), egy változó (ar),
egy művelet eredménye (ar * 1.27) vagy egy összehasonlítás (keszlet > 0). Az operátor
a műveletet végző jel (+, >, &&…), az operandusok
pedig azok az értékek, amelyeken dolgozik.
const ar = 6990; const brutto = ar * 1.27; // "ar * 1.27" egy kifejezés; a * az operátor, ar és 1.27 az operandusok const draga = brutto > 10000; // ez is kifejezés — értéke false console.log(brutto, draga); // 8877.3 false
Kifejezés mindenhová írható, ahová érték: console.log-ba, változó értékének, template literál
${}-jába, másik kifejezés belsejébe. A fejezet végéig operátorok szerint haladunk.
| Operátor | Jelentés | Példa | Eredmény |
|---|---|---|---|
+ | összeadás (szövegnél összefűzés!) | 10 + 3 | 13 |
- | kivonás | 10 - 3 | 7 |
* | szorzás | 10 * 3 | 30 |
/ | osztás (tizedes eredmény is lehet) | 10 / 4 | 2.5 |
% | maradék (modulo) | 10 % 3 | 1 |
** | hatványozás | 2 ** 10 | 1024 |
A ** az ES2016-ban jött; korábban a Math.pow(2, 10) volt az egyetlen mód — mindkettő működik.
A / egész számoknál is tizedes törtet adhat; ha egész hányados kell, kerekíts (Math.floor).
A maradékos osztás első látásra ritkán hasznos, valójában rengeteg mintában felbukkan:
const szam = 4721; console.log(szam % 2 === 0); // false — páros-e? (a maradék 0, ha páros) console.log(szam % 10); // 1 — az utolsó számjegy console.log(szam % 100); // 21 — az utolsó két számjegy const ora = 23; console.log((ora + 3) % 24); // 2 — körbeforgás: 23 óra + 3 óra = hajnali 2 const mp = 125; console.log(mp % 60); // 5 — a percen felüli másodpercek
x % n mindig 0 és n-1 közé esik (pozitív x-re) — ezért tökéletes „körbeforgatáshoz":
óra a napon belül, nap a héten belül, pozíció egy listában. És x % n === 0 pontosan azt jelenti: x osztható n-nel.
Az alap értékadás a =: a jobb oldali kifejezés értékét a bal oldali változóba teszi. A rövidített formák
egyszerre olvassák és módosítják a változót — ezért csak let-tel deklarált változón működnek:
| Rövid forma | Ugyanaz, mint | Tipikus használat |
|---|---|---|
x += 3 | x = x + 3 | összegzés, szöveg építése |
x -= 3 | x = x - 3 | készlet csökkentése |
x *= 2 | x = x * 2 | duplázás |
x /= 2 | x = x / 2 | felezés |
x %= 7 | x = x % 7 | körbeforgatás |
x++ / x-- | x = x + 1 / x = x - 1 | számlálás |
let keszlet = 40; keszlet -= 3; // eladtunk 3-at → 37 keszlet++; // egyet visszahoztak → 38 let osszeg = 0; osszeg += 6990; // 6990 osszeg += 1990; // 8980 — így gyűjtünk egy kosár értékét let nev = "Egér"; nev += " (fekete)"; // szövegre is: "Egér (fekete)"
A = értékadás („tedd bele"), nem összehasonlítás. Az „egyenlő-e?" kérdés operátora a ===.
Ha egy feltételbe véletlenül =-t írsz, nem hibát kapsz, hanem rossz eredményt — ez az egyik leggyakoribb kezdő hiba.
Az összehasonlító operátorok két értéket vetnek össze, és logikai eredményt (true / false) adnak.
Ez az eredmény változóba tehető, kiírható, és a következő fejezettől feltételként használjuk.
| Operátor | Jelentés | Példa → eredmény |
|---|---|---|
=== | szigorúan egyenlő (érték és típus) | 5 === 5 → true, "5" === 5 → false |
!== | szigorúan nem egyenlő | 5 !== 3 → true |
> < | nagyobb / kisebb | 7 > 3 → true |
>= <= | nagyobb-egyenlő / kisebb-egyenlő | 5 >= 5 → true |
== != | laza egyenlőség (típusátalakítással) — kerüljük | "5" == 5 → true (!) |
Kétféle „egyenlő" van JavaScriptben:
=== (szigorú): csak akkor igaz, ha az érték ÉS a típus is megegyezik. Kiszámítható.== (laza): összehasonlítás előtt megpróbálja azonos típusra hozni az értékeket — bonyolult szabályok szerint, meglepő eredményekkel.console.log(5 === 5); // true console.log("5" === 5); // false — más a típus (string vs number) console.log("5" == 5); // true — a == átalakítja, ezért egyenlőnek látja console.log(0 == ""); // true (!!) console.log(0 == "0"); // true (!!) console.log("" == "0"); // false (!!!) — pedig az előző kettő szerint „egyenlők" lennének console.log(null == undefined); // true console.log(null === undefined); // false
A == rejtett típusátalakítása nehezen megtalálható hibák forrása. Alapszabály: mindig a
=== és !== párost használd. Ha két különböző típusú értéket akarsz összevetni,
alakítsd át előbb te (Number(szoveg) === 5) — így látszik a szándék. Az egyetlen szokásos kivétel a
x == null, ami egyszerre szűri a null-t és az undefined-ot; de kezdőként írd ezt is ===-vel.
Szövegeket is lehet </>-vel hasonlítani — betűrend szerint, de a kódtábla alapján:
minden nagybetű kisebb minden kisbetűnél, az ékezetes betűk pedig a végén vannak. Rendezéshez ezért később mást használunk (8. fejezet).
A logikai operátorok igaz/hamis értékeket kombinálnak — így épülnek az összetett feltételek:
| Operátor | Neve | Mikor igaz |
|---|---|---|
a && b | ÉS (and) | ha mindkét oldal igaz |
a || b | VAGY (or) | ha legalább az egyik oldal igaz |
!a | NEM (not) | megfordítja: igazból hamis, hamisból igaz |
const ar = 6990, keszlet = 40; console.log(ar < 10000 && keszlet > 0); // true — olcsó ÉS raktáron console.log(ar > 50000 || keszlet > 0); // true — drága VAGY raktáron (elég az egyik) console.log(!(keszlet === 0)); // true — NEM fogyott el console.log(keszlet !== 0); // ugyanaz, olvashatóbban
A logikai operátorok nem csak true/false-szal működnek: bármilyen értéket
„igaznak" (truthy) vagy „hamisnak" (falsy) tekintenek. A falsy értékek köre kicsi, tanuld meg fejből:
| Falsy (hamisnak számít) — csak ezek | Truthy (igaznak számít) |
|---|---|
false, 0, "" (üres szöveg), null, undefined, NaN | minden más: 1, -3, "szöveg", "0" (!), " " (szóköz!), [], {} |
A Boolean(x) megmutatja, melyik: Boolean("0") → true, mert a
"0" nem üres szöveg. Ugyanezt teszi a dupla tagadás is: !!x.
Az && és a || balról jobbra értékel, és megáll, amint eldőlt az eredmény:
a && az első falsy-nál, a || az első truthy-nál. Ráadásul nem true/false-t
adnak vissza, hanem azt az operandust, amelyiknél megálltak:
console.log("" || "Vendég"); // "Vendég" — a bal falsy, ezért a jobb oldalt adja console.log("Anna" || "Vendég"); // "Anna" — a bal truthy, meg sem nézi a jobbat console.log(0 || 10); // 10 console.log(5 && "ok"); // "ok" — a bal truthy, ezért a jobb oldalt adja console.log(0 && "ok"); // 0 — a bal falsy, itt megáll
Ebből születik a leggyakoribb minta, az alapérték: const nev = bejovoNev || "Vendég"; —
ha van név, az marad; ha üres/hiányzik, „Vendég" lesz.
Validációnál a rövidzár mindennapos. A lapozási paraméter hiányozhat vagy hibás lehet — egy Express-kezelőben így adunk alapértéket:
const oldal = Number(req.query.oldal) || 1; Ha a paraméter hiányzik (undefined → NaN),
üres ("" → 0) vagy szöveg ("abc" → NaN), mind falsy, és az 1 lép a helyébe.
Az && pedig a „csak ha létezik" ellenőrzésre jó: felhasznalo && felhasznalo.email.
A || a 0-t is lecseréli alapértékre, ami néha nem kívánatos (a 0 érvényes mennyiség lehet). Erre való a
modern ?? operátor, amely csak null/undefined esetén ad alapértéket — a 9. fejezetben jön.
A feltételes (más néven ternary, azaz háromoperandusú) operátor egy sorban választ két érték közül a feltétel alapján:
// feltétel ? érték_ha_igaz : érték_ha_hamis const keszlet = 0; const allapot = keszlet > 0 ? "raktáron" : "elfogyott"; console.log(allapot); // elfogyott const szam = 7; console.log(szam % 2 === 0 ? "páros" : "páratlan"); // páratlan const ar = 12000; const fizetendo = ar >= 10000 ? ar * 0.9 : ar; // a két ág kifejezés is lehet → 10800 console.log(`Fizetendő: ${fizetendo} Ft`);
Olvasd így: „ha a készlet nagyobb nullánál, akkor „raktáron", különben „elfogyott"". Ez egy kifejezés
— értéke van, ezért változóba tehető, kiírható, template literálba írható. A következő fejezet if/else
szerkezete ugyanezt tudja, de utasításként, több sorban.
Ternary akkor, ha egy értéket választasz két lehetőség közül, és egy sorban elfér. Ha a két ágban több utasítás kell, vagy
egymásba kellene ágyazni több ternaryt — az már if/else. Az egymásba ágyazott ternary olvashatatlan, kerüld.
A Math beépített objektum matematikai függvényeket és állandókat gyűjt. Nem kell létrehozni, bárhol elérhető —
Node-ban és böngészőben ugyanúgy. A leggyakoribbak:
| Függvény | Mit csinál | Példák |
|---|---|---|
Math.round(x) | legközelebbi egészre kerekít (.5 felfelé) | Math.round(2.5) → 3, Math.round(2.4) → 2, Math.round(-2.5) → -2 |
Math.floor(x) | lefelé kerekít („padló") | Math.floor(2.9) → 2, Math.floor(-2.1) → -3 |
Math.ceil(x) | felfelé kerekít („plafon") | Math.ceil(2.1) → 3, Math.ceil(25 / 10) → 3 |
Math.trunc(x) | levágja a tizedeseket (nulla felé) | Math.trunc(2.9) → 2, Math.trunc(-2.9) → -2 |
Math.abs(x) | abszolút érték | Math.abs(-8) → 8, Math.abs(4 - 10) → 6 |
Math.min(a, b, …) | a legkisebb a megadottak közül | Math.min(3, 9, 1) → 1, Math.min(meret, 50) → felső korlát |
Math.max(a, b, …) | a legnagyobb | Math.max(3, 9, 1) → 9, Math.max(0, egyenleg) → alsó korlát |
Math.pow(a, b) | hatvány (ugyanaz, mint a ** b) | Math.pow(2, 8) → 256 |
Math.sqrt(x) | négyzetgyök | Math.sqrt(144) → 12 |
Math.PI | a π állandó (nem függvény, nincs zárójel) | 2 * Math.PI * r |
Math.random() | véletlen szám 0 és 1 között (0 ≤ x < 1) | csak említjük — a 11. fejezetben használjuk |
const db = 25, dobozMeret = 10; console.log(Math.ceil(db / dobozMeret)); // 3 — a megkezdett doboz is számít const kert = "500"; const meret = Math.min(Number(kert) || 10, 50); // 50 — alapérték + felső korlát egy sorban console.log(meret);
Pozitív számoknál a floor és a trunc ugyanazt adja, negatívaknál nem
(floor(-2.1) = -3, trunc(-2.1) = -2). Áraknál, darabszámoknál általában round;
„hány egész fér bele" kérdésre floor; „hány kell, hogy elférjen" kérdésre ceil.
Az operátoroknak — a matematikához hasonlóan — elsőbbségi sorrendjük van. Az erősebb köt előbb; azonos szintűek balról jobbra. A gyakorlatban ezt a sorrendet érdemes fejben tartani (fentről lefelé csökkenő erősség):
| Szint | Operátorok |
|---|---|
| 1. | ( ) zárójel |
| 2. | ! tagadás, typeof, ** hatvány |
| 3. | * / % |
| 4. | + - |
| 5. | < <= > >= |
| 6. | === !== |
| 7. | && |
| 8. | || |
| 9. | ? : feltételes |
| 10. | = += … értékadás (a leggyengébb: mindent kiszámol, aztán tárol) |
console.log(2 + 3 * 4); // 14 — előbb a szorzás console.log((2 + 3) * 4); // 20 — a zárójel előrébb sorol console.log(10 - 4 - 3); // 3 — azonos szint: balról jobbra, (10-4)-3 console.log(5 > 3 && 2 + 2 === 4); // true — aritmetika, aztán összehasonlítás, végül && console.log(true || false && false); // true — az && erősebb: true || (false && false)
Nem kell fejből tudni a teljes táblázatot. Ha egy kifejezésben && és || is van, vagy egy ternary
feltétele összetett, tegyél zárójelet — pl. (ev % 4 === 0 && ev % 100 !== 0) || ev % 400 === 0.
Olvashatóbb, és biztosan azt csinálja, amit szeretnél.
Kísérletezz az operátorokkal! Különösen érdemes a == vs === mintát, a rövidzár visszatérési
értékét és a Math kerekítéseit negatív számokkal kipróbálni. Írj át egy-egy értéket, és tippeld meg előre a kimenetet.
Válassz mintát vagy írj sajátot — majd Futtatás (Ctrl+Enter) ↓
Döntések elágazás nélkül: minden feladat megoldható kifejezésekkel — ternaryvel, logikai operátorokkal, Math-tal és a
%-kal. (Az if és a ciklusok a következő fejezetben jönnek — most szándékosan nem használjuk őket.)
Az adott változókat a gyakorló hozza létre, te csak használd őket, és írd ki pontosan a kért formában.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás — a haladásod ebben a böngészőben megmarad.
A kifejezés-kiértékelős feladatoknál írd le magadnak fejben az eredményt, mielőtt futtatnál. Ha eltér, nézd meg, melyik operátor
kötött másképp, mint gondoltad — így rögzül a precedencia. Ha bizonytalan vagy egy részkifejezésben, írd ki külön console.log-gal.
+ - * / % **. A % a maradék: páros-e (% 2 === 0), utolsó számjegy (% 10), körbeforgás (% 24).= és rövid formái (+=, -=, *=, ++, --) — csak let-en. A = nem egyenlőség!=== !== < > <= >= → logikai érték. Mindig ===; a == típusátalakítása kiszámíthatatlan (0 == "" igaz).&& (mindkettő), || (legalább egy), ! (tagadás). Falsy: false, 0, "", null, undefined, NaN — minden más truthy ("0" is!).&&/|| megáll, amint eldőlt, és az adott operandust adja vissza → alapérték: Number(param) || 1.feltétel ? haIgaz : haHamis — egy sorban választ két érték közül; kifejezés, tehát változóba tehető.round / floor / ceil / trunc, abs, min / max, pow / sqrt, PI, (random).! ** → * / % → + - → összehasonlítás → === → && → || → ? : → =. Kétség esetén zárójelezz.Most már tudsz feltételeket megfogalmazni — a következő fejezetben ezekre építünk a vezérlési szerkezetekkel:
if/else több utasítással, switch, és a ciklusok
(while, for), amelyekkel ismételni és számlálni, összegezni, keresni fogunk.