Andrise programmeerimisalane WIKI
Tutvustus
JavaScript on skriptimiskeel, mille lõi Netscape brauseri juures töötanud Brendan Eich. Esialgne tööpealkiri oli Mocha, seejärel LiveScript ning lõpuks sai keel endale nime JavaScript. Algselt oli JavaScript mõeldud ainult brauserisiseseks skriptimiseks, kuid praeguseks on see levinud ka muudele platvormidele. Microsofti brauserites on kunagiste litsentsiprobleemide tõttu (JavaScript on kompanii Sun Microsystems kaubamärk) JavaScripti asemel kasutuses identne keel nimega JScript.
JavaScript muutus suhteliselt kiirelt, umbes kaks aastat peale esmast väljatulekut, aastal 1997 ECMAScript nime all standardiks. Seega JavaScript, kuigi ECMAScripti eelkäija, on ametlikult võttes lihtsalt üks ECMAScripti dialekt. Kuna keel arendati ideest standardini üsna kiiresti, on tegu „varajase täiskasvanuga“ sisaldades paljude väga heade võimaluste kõrval ka mitmeid möödalaskmisi (näiteks viite this sidumine funktsioonides globaalse objektiga).
Tegu on ülimalt populaarse programmeerimiskeelega, mille edu üheks põhjuseks on olnud keele näiline lihtsus. JavaScripti suudavad osaliseltki kasutada oma veebilehtede elavdamiseks ka inimesed, kes programmeerimisest üldse mitte midagi ei tea. Paraku aga on see keele mainele „päris programmeerijate“ hulgas mõjunud suhteliselt devalveerivalt - arvatakse, et JavaScript muuks ei kõlbagi, kui vaid veebivormide sisu kontrollimiseks ja brauseri aknas liikuvale hiire kursorile animeeritud „saba“ ja ekraanil langevate „lumehelveste“ tekitamiseks.
Tegelikkus on siiski midagi muud. Tegu on täisfunktsionaale keelega, millega annab realiseerida vägagi keerulisi aplikatsioone. Heaks näiteks oleks siinkohal Google Docs laadsed teenused, mis pakuvad reaalset alternatiivi töölaua kontoritarkvarale (olles mõnes mõttes isegi paremad, kuna pole tarvis muretseda dokumentidest varukoopiate tegemise üle, sest faile salvestatakse internetis).
JavaScript keelena on suhteliselt omapärane. Puuduvad näiteks standardsed vahendid sisendiks ja väljundiks. Tegu on ka praktiliselt ainsa laiemat tuntust kogunud prototüübipõhise objektorienteeritud keelega. Ning JavaScripti potentsiaal juba leviku poolest on meeletu - praktiliselt kõikides maailma arvutites mis on ühendatud internetti, sisaldub JavaScripti interpretaator (selleks on veebibrauser). Keel on sõltumatu nii arvuti operatsioonisüsteemist, kui tegelikult ka tänu piisavale standardiseerimisele ja headele abistavatele teekidele (näiteks Prototype või jQuery) kasutatavast brauserist.
JavaScripti on võimalik brauseris väja lülitada, samuti võivad veel levida mõned vanemad brauserid, mis ei toeta hetkel aktuaalset JavaScripti versiooni 1.5 ja mis teevad sellega kõikide kasutajate toetamise keerulisemaks. Eestis on sellest küljest olukord üsna hea ning seda suuresti tänu internetipankadele populaarsusele. Internetipankade lehed nimelt sisaldavad ohtralt JavaScripti, sundides sellega kõiki kliente kasutama JavaScripti toega brausereid. Reeglina pole internetipangas näiteks sisseloginud kasutaja vaates ühtegi „ehtsat“ linki, kogu navigeerimine toimub läbi javascripti funktsioonide. Tõenäoliselt on see mõeldud vältimaks ühe sessiooni ajal mitme brauseriakna avamist.
Positiivse kõrvalefektina aga muudab suure kasutajaskonnaga netipankade JavaScripti nõudev lähenemine kõikide JavaScripti arendajate töö kordades kergemaks.
Ühilduvuse tagamiseks erinevate brauserite vahel, on siin ja edaspidi käsitletud JavaScripti versiooni 1.5 ning sellest peamiselt osa, mis on ühilduv JScript versiooniga 5.6.
Süntaks
JavaScripti süntaks sarnaneb C ja teiste sarnaste keelte (Java, PHP jne) süntaksile, välja arvatud skoobid, mis JavaScriptis on funktsioonipõhised. Paraku aga sellega sarnasused näiteks Javaga (hoolimata JavaScripti nimest) ka piirduvad. JavaScript on dünaamiliselt ja nõrgalt tüübitud, prototüübipõhine skriptimiskeel, mis on esialgselt mõeldud jooksma „peremeesobjekti“ sees. Sõna „Java“ JavaScripti nimes on vaid omaaegne marketingitrikk, mille tulemuseks on hulk segadust. JavaScript ei ole Java ning JavaScript ei ole Javaga mitte kuidagi seotud (kui mitte arvestada Java jaoks loodud JavaScripti interpretaatorit nimega Rhino).
Üheks suureks erinevuseks näiteks keelega C on semikoolonite kasutamise valikulisus lausete lõpetamiseks. Kuigi tungivalt soovituslik, ei ole need kohustuslikud - sellisel juhul paigutab interpretaator programmi käivitudes ise semikoolonid vajalikesse kohtadesse (tavaliselt reavahetuse sümboli asemele). Selline käitumine võib tekitada ootamatuid probleeme - kui interpretaatorile tundub, et lause võiks siinkohal ära lõppeda, siis paigutab ta antud kohta lause lõpetamiseks semikooloni ning käsitleb kõike järgnevat juba uue lausena. Kuna lausetes on eraldajatena lisaks tühikutele lubatud kasutada ka tabulatsioonisümboleid ning reavahetusi, võib selline käitumine lause kergesti valest kohast katkestada.
return a+b;
Selles näites oleks korrektne lugeda lauset kujul return a+b;, kuid interpretaator käsitleb seda kui return; a+b;, mis on ilmselgelt vale.
Tõstutundlik
JavaScript on tõstutundlik, mis tähendab et muutujate ja funktsioonide nimedes, samuti tekstiliste väärtuste võrdlemisel, mängivad rolli suur ja väiketähed. Näiteks toString() ei ole sama mis toSTRING(). Samuti ei ole võrdsed tekstid „tere“ ja „Tere“.
Dünaamiline tüüpimine
JavaScript on dünaamiliselt ja nõrgalt tüübitud keel. See tähendab, et tüübikontroll ei toimu kompileerimisel, vaid jooksvalt programmi täitmise jooksul. Tüübid on seotud muutujate asemel väärtustega. Näiteks võib ühe muutuja väärtuseks olla alguses number, hiljem tekst ja lõpuks regulaaravaldise objekt. Praktiliselt suvalist tüüpi väärtust on võimalik operatsioonides kasutada teise tüübi asemel. Sellisel juhul muudetakse väärtus vastavaks nõutule. Näiteks kui meil on funktsioon, mis eeldab sisendiks stringi, aga funktsioonile edastatakse hoopis number, muudetakse number tekstikujule.
Parditüüpimine
„When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.“ - James Whitcomb Riley (Ameerika kirjanik ja luuletaja 1849-1916).
Parditüüpimisel loetakse objekt nõutava tüübiga vastavuses olevat, kui selles on implementeeritud oodatavad meetodid ja omadused. Seda isegi kui objekt on tuletatud mingist komandast konstruktorist. Näiteks kui ootame sisendiks objekti, mis omab meetodit z, siis ei oma meie jaoks tähtsust, kas objekt on loodud konstruktoriga X või Y.
KonstruktorX = function(){ this.sisu = 123; }; KonstruktorX.prototype.teade = function(){ alert(this.sisu); } var x = new KonstruktorX(); KonstruktorY = function(){}; KonstruktorY.prototype.teade = function(){ alert(Date()); } var y = new KonstruktorY(); function kuva(objekt){ objekt.teade(); } kuva(x); // 123 kuva(y); //Wed May 13 2009 15:06:30 GMT+0300 (FLE Standard Time)
Näites loome kaks erinevat konstruktorit, millega loodud objektidel on olemas meetod teade. Defineeritud funktsioon kuva ootab sisendiks objekti sama nimega meetodiga. Nagu näha, pole vahet mis tüüpi objektiga on tegu, niikaua kuni objektis on nõutud meetod olemas.
Käidud rada: • numbrid • objektid • advanced • stringid • massiivid • script_tag • nimeruumid • operaatorid • matemaatika • sissejuhatus