Sisseehitatud objektid ja funktsioonid
Javaskript on üldpõhimõtetelt objektorienteeritud keel, seetõttu enamiku vahendeid leiab vaid
objektide sisse kapseldatuna. Siiski on võimalik kümmetkonda käsklust tarvitada ilma otse objekti ehk
isendit loomata või olemas oleva klassi poole pöördumata. Enamkasutatavad neist:
parseInt püüab muuta etteantud väärtuse täisarvuks, antagu see sinna ette siis teksti või
numbrina. Nii parseInt(3), parseInt(3.14), parseInt("3"), parseInt("3.14") annavad tulemuseks arvu 3.
Samuti teevad seda parseInt("3. klass") kui parseInt("3 õpilast"). Reaalarvu puhul saadakse täisarv
lihtsalt murdosa äralõikamise teel, nii et parseInt(5.9) tulemuseks on 5. Teksti puhul hakatakse
algusotsast sümboleid lugema ning kuni on tegemist numbritega, seni arvatakse tulemus kokku üheks
arvuks. Kui aga tuleb sümbol, millele arvulist väärtust ei anna omistada, siis etteantud sõnet enam edasi
ei vaadata ning tulemus väljastatakse teksti ees leidunud numbrite põhjal. Kui tulemust pole võimalik
arvuks muuta väljastatakse väärtus NaN ehk Not a Number. Nõnda tulebki, et parseInt("3 õpilast")
annab kokku 3, samuti parseInt(" 3 õpilast"), sest algul paiknevaid tühikuid ei arvestata,
parseInt("õpilane") aga NaN, sest esimene täht "õ" ei anna kuidagi end kümnendsüsteemis numbriks
muuta ning nii ei jää alamprogrammil muud üle kui kasutajale teatada, et tegemist pole numbriga.
Samuti on tulemuseks NaN, kui käsule ette sööta tühisõne "", false või true. Kuigi näiteks C-keeles
tähistatakse false=0 ning true=1, siis siin on parseInt(true) vastuseks NaN. Kaheksand- ning
kuueteistkümnendsüsteemiga saab parseInt samuti hakkama, tunnusedki samad. Kaheksandsüsteemi
numbril peab ees olema 0, kuueteistkümnendsüsteemi omal 0X. Nii on parseInt("014") väärtuseks 12,
samuti parseInt("014dd") juures, sest järgnevaid tähti lihtsalt ei loeta, kuna neid ei anna vastavas
süsteemis arvuks muuta. parseInt(014dd) annab veateate, sest siis tekib parameetriks arusaamatu
kombinatsioon, mis pole ei tekst ega number ning millega intepretaator ei oska midagi mõistlikku peale
hakata. Kuueteistkümnendsüsteemi puhul aga osatakse f ning sellest tähestikus eespool olevad
sümbolid ilusti tõlkida ning väärtus saadakse kätte. parseInt(0x14) annab 20, samuti parseInt("0x14").
Kui kirjutada parseInt("0x14dd"), on tulemuseks 5341.
parseFloat töötab analoogiliselt, st., et seni kuni sinna ette antud teksti algusest leitakse käsule
arusaadavaid numbreid, niikaua kogutakse väljastatavat väärtust. parseFloat("3.14 ja veel pool") annab
tulemuseks 3.14. parseFloat("xxx") aga teatab NaN, sest etteantud sõnet ei anna ka mitte reaalarvuks
muundada. Kaheksand- ning kuueteistkümnendsüsteemi eritunnused siin ei tööta, parseFloat("014")
annab tulemuseks 14 ning parseFloat("0x14") väljastab nulli. Seevastu saab aga kümne astet määrata.
parseFloat("15E2") annab tulemuseks 1500 ning parseFloat("15E-1") 1.5.
isNaN väljastab true, kui etteantud väärtus pole teisendatav numbriks. Selle abil saab näiteks
uurida, kas kasutaja sisestas korrektse arvu.
Numbri küsimine
escape ning unescape aitavad, kui on vaja andmeid URL-i kaudu üle kanda või muul moel
liigutada, kus kasutada tohib vaid täppideta tähti ning protsendimärki. escape teisendab kõik parajasti
sobimatud sümbolid kuueteistkümnendkoodi ning unescape abil saab jälle esialgse oleku tagasi.
Näiteks escape("õpilane") annab tulemuseks %F5pilane ning unescape("%F5pilane") = õpilane.
Lahtiseletatult F5 on kuueteistkümnendsüsteemis 245 (mis ongi õ kood), protsendimärk ees näitab, et
järgnevad kaks sümbolit tuleb kuueteistkümnendkoodis arvuks lugeda. escape("15% väävelhape!") on
15%25%20v%E4%E4velhape%21 , ka protsendimärk ise edastatase kuueteistkümnendkoodi kaudu.
Kuueteistkümnendsüsteemi 20 ehk kümnendsüsteemi 32 on tühiku kood, neid tuleb pikemate tekstide
kodeerimisel küllalt sageli ette.
eval-nimeline funktsioon täidab hulga ülesandeid, mille kordasaatmiseks mõnes
kompileeritavas programmeerimiskeeles tuleb sadu ja tuhandeid ridu kirjutada. Sinna parameetriks
antud sõnet käsitletakse programmi tekstina ning lastakse intepretaatoril see tööle panna. Nii võib välja
arvutada kasutaja sisestatud avaldiste väärtusi, samuti käivitada etteantud nimega alamprogramme või
arvata tükkides kokku muutuja nimesid.
eval
teatab meile rõõmsalt sisestatud avaldise väärtuse.
eval
juures antakse eval'ile ette käsklus, kus tal tuleb vastavalt etteantud numbrile paigutada tekst sobivasse
tekstivälja ning nagu katse näitas, sai käsklus sellega hakkama.
Sisseehitatud objektide loetelu
Järgnevad sisseehitatud objektid koos oma käskudega peaksid kasutatavad olema kõikjal, kus
Javaskriptiga tegemist tuleb.
Array
Massiiv
Boolean
Tõeväärtus
Date
Aeg
Function
Alamprogramm
Math
Arvutused
Number
Numbrid
Object
Objektide üldised omadused
RegExp
Regulaaravaldised, sõnetöötlus
String
Sõne uurimine
Massiiv (Array)
Siin ei pea iga meeles hoitava väärtuse tarvis uut muutuja nime välja mõtlema, piisab
elementide hulgale nime panekust ning pärast järjekorranumbri järgi välja kutsumisest. Nii võib ühte
ritta seada õpilaste nimesid, pikkusi või sünniaastaid. Peab vaid teada olema, mitmenda elemendiga
meil parajasti tegemist on. Uue massiivi saab luua käsuga new Array(), nii nagu järgnevas näites on
var riigid=new Array();
Selle tulemusena luuakse massiiv nimega riigid, milles pole ühtegi elementi. Massiivi pikkust näitab
tema juurde kuuluv muutuja nimega length. Kui annan käskluse
document.writeln("riike on "+riigid.length+" ");
siis trükitakse välja massiivi pikkus ehk mitu riiki on riikidemassiivis. Kui sinna pole ühtegi nime
paigutatud, siis on ka massiiv tühi ning tema elementide arv on 0. Soovides massiivi andmeid lisada,
tuleb lihtsalt vastava koha peale väärtus paigutada. Javaskripti massiivi esimene element on alati
järjekorranumbriga 0 nii nagu mõnes muuski keeles, näiteks C-s. Pärit on selline lugemine aegadest,
kus programmide kirjutamine oli tihedamalt mäluaadressidega seotud ning massivi algkoht tähistas
ühtlasi esimese elemendi asukohta, iga järgmise elemendi leidmiseks tuli aga vastav arv korda
elementide pikkus mäluaadressi paremale kolida. Javaskripti juures enam aadresside arvutamine
takistuseks ei ole, kuid harjunud kirjutuskuju võeti siiagi üle. Elemendi (riigi) lisamiseks kirjutan
riigid[0]="Soome";
Selle tulemusena pannakse esimeseks elemendiks ehk kohale 0 väärtus "Soome" ning massiivi pikkus
ehk riigid.length saab väärtuseks 1. Kui kirjutan
riigid[1]="Rootsi";
, siis pannakse jällegi üks element otsa ning riikidemassiivi pikkuseks saab 2. Soovides massiivi
elemendid järjestikku välja trükkida, võib luua tsükli, mis ükshaaval iga väärtuse ette võtab ning
temaga soovitud toimingu teeb. Kui panna muutuja algväärtuseks 0, iga ringi juures suurendada
muutuja väärtust ühe võrra ning lõpetada siis kui ollakse möödunud viimasest elemendist, siis ongi
kõik riigid läbi käidud ning ekraanile trükitud. Nagu all näites Taani puhul näha, ei pea massiivile
elemente alati järjest lisama. Üldiselt on see mõistlik ning harva läheb vaja olukordi, kus loetelu mõni
element tuleb tühjaks jätta, kuid tühjaks jätmise võimaluse keel siiski pakub. Kui algul olid olemas
riigid number 0 ja 1 ning nüüd lisasime 3-e, siis automaatselt suurendatakse massiivi pikkus neljale
elemendile nii et vahepeal puudu olevale kohale 2 antakse väärtuseks undefined.
Massiiv
Väljatrükk:
riike on 0
riike on 1
riike on 2:
0. Soome
1. Rootsi
riike on 4:
0. Soome
1. Rootsi
2. undefined
3. Taani
Juhul kui kohe algul määrata massiivi pikkus käsuga
var riigid=new Array(4);
, siis luuakse nelja elemendiga massiiv, mille igal kohal on väärtus undefined. Kuhu seejärel riigi nimi
pannakse sinna jääb see püsima, muud kohad aga on ikka täidetud sisuga undefined. Eelnenud
programmi väljatrükk kohe algselt neljaelemendilise massiivi korral on
riike on 4
riike on 4
riike on 4:
0. Soome
1. Rootsi
2. undefined
3. undefined
riike on 4:
0. Soome
1. Rootsi
2. undefined
3. Taani
Algväärtustamine
Kui juba algul on teada, millised väärtused massiivi paigutatakse, siis võib need ette anda kas
nurksulgude vahel või siis parameetritena new Array sulgude sees. Nii loetakse massiivi pikkuseks
etteantud elementide arv ning järjekorras läheb iga väärtus ilusasti oma kohale.
Massiiv
Kahemõõtmeline massiiv
Kui kasutada tabelina paiknevaid andmeid, siis üherealisest massiivist ei aita. Iga väärtuse
leidmiseks on vaja teada, millises reas ning millises veerus see asub. Nii on järgmiseks näiteks olevas
tunniplaanis, kus teada saamiseks millisesse tundi minna, tuleb otsida nii päeva kui tunni
järjekorranumbri järgi. Javaskriptis kohe algselt loodavat kahemõõtmelist massiivi pole, kuid kuna
massiivi elementideks võivad samuti olla massiivid, siis pole tabelina paikneva teabe meelde jätmine
kuigi keeruline. Ühe päeva tunnid on päevade massiivi üheks elemendiks. Kõigepealt kirjutan
var tunniplaan=new Array(5);
, et oleks iga päeva andmeid kuhugi panna. Edasi
tunniplaan[0]=new Array("Matemaatika", "Kehaline kasvatus", "Loodusõpetus");
loob kõigepealt kolmeelemendilise massiivi tundide nimedega ning paigutab siis selle tunniplaani-
nimelise massiivi esimeseks elemendiks. Kui nõnda talitada ka järgmiste päevade andmetega, siis
tulemuseks on kahemõõtmeline ainenimede massiiv, kus ridadeks on päevad ning veergudeks tundide
numbrid.
Tunniplaan
Andmete väljastamine
Andmete hulga kasvades pole sageli mõtet kõiki neid nähtavalt lehele välja trükkida, kasutajal
võib neist vaja minna vaid tühist osa. Kui aga lehte lugev arvuti või sideliinid liialt üle koormatud pole,
siis mõnekümne kilobaidi teabe kohale vedamine pole kuigi suur probleem. Võrreldes piltide
mahtudega jääb teksti hulk enamasti tugevasti väiksemaks. Kui kasutaja soovi järele veel vajalik teave
massi hulgast aidatakse üles leida, siis peaks tulemus päris hea olema. Eeltoodud tunniplaaninäites
hoitakse andmeid kahemõõtmelises massiivis ning kasutajal lastakse valida, millise päeva mitmenda
tunni nime ta soovib vaadata. Andmete sisestamine on päises ühes kohas koos, need võib soovi korral
kas või eraldi failist sisse lugeda. Kui mõni tund lisatakse, eemaldatakse või muudetakse, siis piisab,
kui see muutus sisse viia andmete kirjeldamise juures. Ülejäänud programm juba ise püüab vastavalt
uuele olukorrale käituda. Ka nädalapäevade nimed on pandud massiivi. Nii on võimalik kergesti ka
laupäev koos sellele vastavate tundidega lisada või programm suisa teise keelde tõlkida ilma, et
käsujada sisusse kuigivõrd süvenema peaks. Suurim tundide arv päevas leitakse järgneva käsulõigu
abil:
var maxtundidearv=tunniplaan[0].length;
for(var i=1; imaxtundidearv)maxtundidearv=tunniplaan[i].length;
}
Kõigepealt jäetakse meelde, palju oli tunde esimesel päeval. Edasi vaadatakse järgemööda
kõik järgnevad päevad läbi ning juhul kui sealt leitakse mõni päev, kus tunde enam kui siiamaani
meelde jäetud väärtuses, siis pannakse leitud arv suurimana kirja. Selliselt toimides on lõpuks teada,
palju võib ühel päeval tunde olla ning kui lähteandmetesse tekib hästi pikk päev, siis teatakse
valikmenüüsse ka vastavad numbrid lisada. Kui aga tundide arv kahaneb, siis ei jää üleliigne number
kasutaja silma alla teda häirima.
for(var i=0; i"+(i+1));
}
Niisuguse tsükli abil kirjutatakse valikuid just nii palju kui maxtundidearv näitab. Arvutus (i+1) on
väärtuse leidmiseks tarvilik seepärast, et kui i esimene väärtus on 0 ja suurim väärtus maxtundidearv-1
nagu massiivielementide ja menüüelementide järjekorranumbrite lugemisel tavaks on, siis kasutaja
näeks tavapärast ühega algavat tundide järjekorda tuleb indeksile üks juurde liita.
Tunni nime näitamisel kontrollitakse kõigepealt, kas vastaval päeval üldse märgitud arvu
tunde on. Kuna rippmenüü näitab suurimat nädalas leitud tundide arvu päevas, siis võib kergesti
juhtuda, et tegelikult kolme tunniga päeval otsitakse viiendat tundi. Et kasutaja ette ei satuks massiivi
olematut elementi tähistav "undefined", selleks kontrollitakse tundide arvu ning küsitava tunni
vastavust. Leides, et soovitakse lõppenud päeva järel veel tarkust taga nõudma minna teatatakse otsijale
rõõmsalt, et koolipäev on läbi.
function naitaTunninimi(){
if(tunniplaan[document.vorm1.paev.selectedIndex].length>
document.vorm1.tund.selectedIndex){
document.vorm1.tunninimi.value=
tunniplaan[document.vorm1.paev.selectedIndex][document.vorm1.tund.selectedIndex];
} else {
document.vorm1.tunninimi.value="Koolipäev läbi";
}
}
Paljas tunninime näitamise funktsiooni loomine iseeenesest ei too veel kasutaja ette soovitud väärtust.
Ilma eraldi märkimata võib proovida tunde valida kuitahes kaua, lahendust pakkuva tekstivälja sisse ei
ilmu midagi. Kui mõlema rippmenüü juurde kirjutada, et valiku muutumisel tunninime näidata tuleb,
siis on lootust, et kasutaja silma alla ka vastus jõuab.