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.select
edIndex];
} 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.