4 min read

Változók és primitív adattípusok

Változók és primitív adattípusok

Talán furcsának találod, hogy ehhez a cikkhez egy memória fényképét választottam. Az oka az, hogy a változó az nem más mint egy tárolási hely (melyet a memóriacíme határoz meg) és egy név párosítása. A változó nevét használjuk arra (reference, azaz referenciaként), hogy meg tudjuk találni a memóriában a tárolt értéket. Ok, valójában ez történik a háttérben, de alkalmazhatunk egyszerűbb megközelítést is, hátha egyszerűbb felfogni mi is az a változó: egy olyan tároló, melybe különböző típusú adatokat tárolhatunk. Ugye, hogy így már nem is annyira vészes, de miért is hívjuk változónak? Azért, mert a névhez társított érték a program futása során változhat. Tehát összefoglalva: egy változónak van neve, értéke és típusa.

különböző típusú adatokat...

Nézzük ezeket a (primitív) típusokat javascript esetén:

  • string: hm, ezt már olvashattad az előző leckében és itt az ideje, hogy tisztázzuk mi az a string. A string olyan adattípus, mely szöveget tartalmaz, leegyszerüsítve karakterek sorozatát. A javascript a stringet UTF-16 kódolással kezeli, ami az UTF8-tól csak annyiban tér el, hogy míg az UTF-8 egy és 4 byte közötti hozzárendelést használ addig az UTF-16 kettő és 4 byte közöttit, azaz egy kicsit pazarlóbb mint az UTF-8.
    Kitekintő: van olyan programozási nyelv, ahol a char azaz karakter egy adattípus
  • number: szám típus. Durva egyszerűsítés, ide tartozik minden pozitív és negatív szám függetlenül attól, hogy egész vagy lebegőpontos (tört) és nem tesz különbséget a számok nagyságára vonatkozóan sem (8 bites, 16 bites, stb). Ettől függetlenül ezek léteznek, csak éppen nem te mondod meg, hogy mi legyen, hanem a number típus az mindig 64 bites lebegőpontos szám (említettem, hogy a számábrázolás eléggé száraz és nehéz anyag, de ha te mégis szívesen olvasnál róla, akkor bedobok neked ide három csodálatos szót, amikkel el tudsz indulni kalandozni: abscissa, mantissa, ordinate).
    Kitekintő: egyes programnyelveknél szokás a számokat "pontosítani" és meghatározni, hogy egész vagy sem (int vagy float/double), csak pozitív (uint: unsigned integer) vagy kettes komplemens (ez az alap, ezt nem kell külön jelezni) illetve meghatározhatjuk a tároláshoz használt szélességet is (pl. int32: 32 bites egész). A szám típusának meghatározásával a programnyelvnek lehetősége van a memóriahasználatot optimalizáni, a programvégrehajtást sebességre optimalizálni és a nem várt mellékhatásokat kiküszöbölni.
  • boolean: logikai típus, mely vagy true vagy false (igaz vagy hamis).
  • undefined: egy változó típusa és értéke undefined ha már deklaráltuk de még nem adtunk neki értéket.
  • null: hasonlóan az undefined-hez ez is egy speciális típus, melynek egyfajta értéke lehet, a null, ami szimplán annyit jelent, hogy a változónak nincs értéke.
    Bár a null és az undefined nagy hasonlóságot mutat, a későbbiekben szó lesz a különbségekről.
  • bigint: az talán világossá vált az eddigiekből, hogy ha több bitet használunk a számok tárolására, akkor nagyobb számokat tudunk tárolni: 1 biten 2 félét, 2 biten 4 félét... ...8 biten 256 félét, 9 biten 512 félét. A sémából látszik, hogy 1 bit hozzáadása duplázza a tárolható értéket. Ha esetleg a 64 bites lebegőpontos méret nem lenne elég, akkor itt van nekünk a bigint, amelynél a bitek száma nincs limitálva (azért a memória mérete gátat szab a a gátlástalan terjeszkedésünknek) így elméletileg akármekkora számokkal tudunk dolgozni.
    Fontos megjegyezni, hogy javascriptben a bit eltoló műveletek (talán még nem felejtetted el, hiszen dög unalmas és száraz téma volt és az ilyenek, mint a jó kínzások általában, mély nyomot hagynak) 32 bites számokkal működnek, tehát ha esetleg szeretnénk használni őket, akkor addig nyújtózkodjunk amíg a takarónk ér.
  • symbol: a teljesség kedvéért meg kell említeni ezt az adattípust is a primitív adattípusok kapcsán, bár addig amíg nem találkozunk az "object"-el nem sok értelmét fogjuk látni. A symbol egy dinamikusan létrehozott egyedi azonosító, melyet leginkább "object property"-ként használhatunk (ha ez most kissé zavaros ne foglalkozz vele, lépj tovább, vissza fogunk még térni rá).

A változók deklarálása javascriptben a "var" szóval történik:

var myName = "Kovács Gültem";
var age = 42;
var noValueAtTheMoment;
– Honnan ez a név?
– Amikor anyám azt mondta apámnak a szülőágynál: "Legyengültem"
– Mire apám: "Legyen"

Ismét jót nevettünk, üljek le 1-es! Szóval miért is van itt ez a vicc? Mert a javascriptben a változók definiálása történhet az angol "let" azaz "legyen" szóval is (legalábbis az ECMAScript 2015-ös verziója óta). A let és var különbségéről később lesz szó, ám az már most látszik, hogy csak a nevet és az értéket adtuk meg és a típus mintha nem lenne ott. Pedig ott van, csak ügyesen be van "csomagolva". A fordító/értelmező kikövetkezteti (inference, ahogy ez annó le lett írva a JAVA/Kotlin kapcsán) az értékből a típust azaz, hogy a myName egy string (hiszen " jelek között van), míg az age egy szám (nem is akármilyen) és a noValueAtTheMoment változót nem tudta beazonosítani így az undefined lett. Így talán már értelmet nyert az undefined kapcsán írt kissé zavaros magyarázat is. A "typeof" keyword segítségével megtudhatjuk a változónk típusát. Próbáljuk is ki a fenti 3 változóval, másoljuk be a böngésző console-jába a fenti 3 sort egyesével, majd irassuk ki a típusaikat a typeof myName, typeof age és typeof noValueAtTheMoment parancsok segítségével.

typeof myName
"string"
typeof age
"number"
typeof noValueAtTheMoment
"undefined"

Ha esetleg nem veszett el benned a felfedező (akkor menő elektor kalandor vagy) és megpróbálod a többi primitív adattípust is létrehozni type inference segítségével, akkor azt fogod tapasztalni, hogy a boolean és a null esetén sikerrel jártál (bár gyanús lehet, hogy a null-nál a typeof "object"-et mutatott), de a bigint meg a symbol meghaladja jelenlegi tudásod. Semmi gond, ezekről is lesz szó később.

Vegyük most elő a kiváló egysorosunkat és írjuk át picit:

var simonSays = "Hello, World!";
console.log(simonSays);

Ha lefuttatjuk ismét látni fogjuk a "Hello, World!"-öt, tehát semmi látványos változást nem értünk el, de azt azért elkönyvelhetjük magunkban, hogy a log() metódusnak a paramétere most egy string típusú változó. Továbbra sem tudjuk azonban mi az a metódus és a paraméter fogalma is kissé ködös. Türelem, eljutunk oda is.

Mit tanultál ebben a leckében?

  • megtanultad mi az a változó (olyan tároló, melybe különböző típusú adatokat tárolhatunk)
  • megtanultad, hogy a változónak milyen alap adattípusai lehetnek