Andrise programmeerimisalane WIKI
Andmetüübid
Kuigi JavaScript on nõrgalt tüübitud keel, ei tähenda see veel, et andmetüübid üldse puuduksid. Tõsi küll - neid tüüpe on suhteliselt vähe. Näiteks numbritüüpe erinevalt keeltest C või Java on ainult üks. Lisaks primitiivsetele tüüpidele nagu number või string, tunneb JavaScript liittüüpi objekt. Objektist aga pärinevad juba mitmed täiendavad keerulisemad andmetüübid nagu massiivid ja funktsioonid. Samuti ka mõningad spetsiaalsed objektitüübid - regulaaravaldise objekt ja kuupäeva objekt. Kõigist neist objekti eri tüüpidest tuleb juttu järgnevates peatükkides.
Numbrid
Kõik numbrid on JavaScriptis topelttäpsusega 64 bitised ujukomaarvud (IEEE 754). Eraldi tüüpe täisarvude või väiksema täpsusega numbrite jaoks pole - kõiki numbreid, olgu selleks 0 või 10E10 (10×1010) hoitakse mälus ühtemoodi 64 bitise ühikuna. Ainsaks erandiks on bitioperatsioonides kasutatavad numbrid, sellisel juhul teisendatakse number operatsiooni sooritamise ajaks 32 bitiseks.
Eritüübilisteks numbriteks on lõpmatus Infinity, mis tekib numbri jagamisel nulliga; negatiivne lõpmatus -Infinity, mis tekib negatiivse numbri jagamisel nulliga; ja mitte-number NaN, mis tähistab kõiki neid väärtusi, mis pole numbrid (sh. nulli jagamine nulliga ja lõpmatuse jagamine lõpmatusega). NaN on huvitav väärtus selle poolest, et ta ei ole võrdne mitte millegagi, sealjuures ka mitte iseendaga (NaN != NaN). NaN väärtuse tuvastamiseks, tuleb kasutada funktsiooni isNaN(väärtus).
Stringid
Stringid on tekstiväärtused mis moodustavad lõpliku 16 bitiste märgita täisarvude järjestatud jada. Eraldi andmetüüp üksiku tähe hoidmiseks (näiteks C keele char) puudub, selle asemel tuleb kasutada tavalist stringi, mille sisuks on vaid üks sümbol.
undefined
undefined väärtus esineb kui üritatakse kasutada defineeritud, kuid väärtustamata muutujat või objekti olematut omadust.
var a; alert(a); // undefined
null
null tähistab olematut väärtust. Tegu on unikaalse väärtusega, mis ei ole sama kui 0, false või undefined kuigi tavalise võrdlustehtega (==) on tulemus tõene. Jäiga võrdlusoperaatoriga (===) võrreldes on tõene ainult väärtuse null võrdlemine väärtusega null.
null == false; //true null === false; // false null === null; //true
Loogilised väärtused
Loogilisteks väärtusteks (Boolean) võivad olla väärtused true, mis tähistab tõest ja false, mis tähistab väärat väärtust. Tavaliselt on loogilised väärtused kasutusel erinevates tingimuslausetes, kus vastavalt operaatorite tagastatava loogilise väärtuse tulemuse järgi tehakse erinevaid tegevusi.
Objekt
Objekt (object) on JavaScriptis kõige keerulisem andmetüüp, mis kujutab endast sorteerimata väljade kogumit võtme-väärtuse paaridest. Iga väli võib hoida endas teist objekti, primitiivset väärtust või meetodit. Programmeerimiskeeles Python oleks JavaScripti objektile kõige lähedasem andmetüüp dict ning PHP-s tekstiliste indeksitega massiiv.
Väärtuste teisendamine operatsioonides
Juhul kui mingis operatsioonis üritatakse kasutada oodatust eri tüüpi väärtust, näiteks kasutatakse teksti loogikaväärtuse asemel, teisendatakse väärtus operatsiooni sooritamise ajaks vajalikule kujule. Järgnev tabel näitab ära selliste teisenduste tulemused erinevate väärtuste vahel.
| Väärtuse kasutamise kontekst | ||||
|---|---|---|---|---|
| Väärtus | String | Number | Boolean | Object |
undefined | "undefined" | NaN | false | Veateade |
null | "null" | 0 | false | Veateade |
| Mittetühi string | Nagu on | Stringi numbriline väärtus või NaN | true | String objekt |
| Tühi string | As is | 0 | false | String objekt |
0 | "0" | Nagu on | false | Number objekt |
NaN | "NaN" | Nagu on | false | Number objekt |
Infinity | "Infinity" | Nagu on | true | Number objekt |
-Infinity | "-Infinity" | Nagu on | true | Number objekt |
| Kõik muud numbrid | Numbri väärtus tekstikujul | Nagu on | true | Number objekt |
true | "true" | 1 | Nagu on | Boolean objekt |
false | "false" | 0 | Nagu on | Boolean objekt |
| Objekt | toString() | valueOf(), toString() või NaN | true | Nagu on |
Tabel 1. Väärtuste teisendamine vastavalt kontekstile
Väärtuste edastamine
Primitiivseid tüübid nagu stringid, numbrid jms. edastatakse muutujale omistamisel väärtusena ehk et ühest muutujast väärtuse omistamisel teisele muutujale, saab teine muutuja enda väärtuseks esimese muutuja väärtuse koopia.
var a = 12345; var b = a;
Objektid aga edastatakse alati viidana originaalse objekti juurde. Seega eraldiseisvad muutujad ei saa mitte igaüks koopiat samast objektist, vaid ainult viida originaalse objekti juurde. Kui ühe muutuja juures objekti muuta, kehtivad need muutused ka kõigi teiste sama objekti juurde viitavate muutujate jaoks.
var a = {}; var b = a; b.test = 123; alert(a.test); //123
Objekte on vajadusel siiski võimalik vastavate meetoditega kloonida ning täpsemalt tuleb sellest juttu Objektide peatükis.
Prahikoristaja
JavaScriptis ei ole võimalik programmi käigus ise väärtusi mälust eemaldada. On olemas operaator delete, kuid see ei tühjenda mitte väärtuse poolt hõivatud mälu, vaid ainult viida muutuja ja väärtuse vahel. Kogu vastava mäluhaldusega tegeleb automaatne prügikoristaja, kes aegajalt käivitudes otsib üles programmi käigus väärtuste poolt hõivatud mäluaadressid ja kontrollib nende vastavust muutujatega. Kui ühtegi viidet väärtuse ja muutujate vahelt ei leita, vabastatakse mälu järgmiste operatsioonide jaoks.
Üldiselt ei pea programmeerija ise mälukasutuse pärast muretsema, v.a. mõned erijuhud nagu näiteks brauseris DOM elementide sündmuste haldus. Kui eemaldada DOM-ist element, millele on seatud sündmuste haldaja, võib see haldaja elemendi kadumisest hoolimata mällu alles jääda. Juhul kui selline elementide eemaldamine on harvaesinev, siis ei ole veidi suurema mälu hõivamisega suuremat probleemi, aga näiteks veebiaplikatsioonides, kus lehekülgede vahetumist ei toimu ja seega sunnitud mälu vabastamist ei ole, võib brauseri mälukasutus vägagi probleemseks osutuda.
Käidud rada: • advanced • andmetueuebid