Javaskript ili Džavaskript (engl.JavaScript) je dinamičan, slabo tipiziran i interpretiran programski jezik visokog nivoa. Standardizovan je po EKMASkript specifikaciji jezika. Pored HTML-a i CSS-a, Javaskript je jedna od tri vodeće tehnologije za definisanje sadržaja na Vebu; većina veb-sajtova koristi Javaskript a svi moderni veb-čitači ga podržavaju bez potrebe za instaliranjem dodataka. Kombinovan sa HTML jezikom i CSS-om Javaskript čini DHTML (Dynamic HTML).[3] Javaskript je jezik zasnovan na prototipovima sa funkcijama prvog reda, što ga čini jezikom višestruke paradigme koji podržava objektno-orijentisani,[4]imperativni i funkcionalni način programiranja. Sadrži API za rad sa tekstom, nizovima, datumima i regularnim izrazima, ali ne i ulazno/izlazne funkcionalnosti, kao što su povezivanje, skladištenje podataka ili grafičke funkcionalnosti, za šta se oslanja na okruženje u kome se izvršava.
Iako se na prvi pogled može reći da Javaskript ima određene sličnosti sa programskim jezikom Java, kao što su naziv, sintaksa i standardne biblioteke, oni su dva potpuno različita programska jezika koja se značajno razlikuju u svom dizajnu. Na programski jezik Javaskript najviše su uticali jezici kao što su Self i Scheme.[5]
Javaskript se pored Veba koristi i u drugim okruženjima, kao što su PDF dokumenti, Veb-čitači za specifične veb-sajtove (engl.site-specific browsers) i desktop vidžeti (engl.widget). Nove i znatno brže Javaskript virtuelne mašine i platforme zasnovane na njima, popularizovale su Javaskript za izradu veb aplikacija na serverskoj strani. Na klijentskoj strani, programeri najčešće implementiraju Javaskript kao interpretirani jezik, ali sve više novijih veb-čitača obavlja just-in-time kompajliranje. Javaskript se još koristi i za razvoj video igara, desktop i mobilnih aplikacija kao i u mrežnom programiranju na serverskoj strani sa izvršnim okruženjima kao što je Node.js.
JS pripada OO paradigmi, jer programer ne definiše samo tip podataka, nego i vrstu operacija (funkcija) koje se mogu primeniti na strukture podataka. Na ovaj način, struktura podataka postaje objekat koji uključuje i podatke i funkcije. Pored toga, programeri mogu da prave odnose između jednog i drugog objekta. Na primer, objekti mogu da naslede karakteristike od drugih objekata.[3] Skriptni je jezik, jer se sastoji od serije komandi koje se očitavaju u interpreteru, a da se prethodno ne kompajlira sadržaj. Odnosno ne prevodi se u mašinski jezik, nego se komande direktno „čitaju” iz koda (izvornog koda ili bajtovskog koda). Zbog ove karakteristike JavaScript se izvršava na strani korisnika (client side), tj. na računaru na kojem je pokrenut sadržaj sa Javaskriptom. Sam po sebi, HTML dozvoljava posetiocu da pošalje podatke ka serveru na obradu. Nažalost, ako ti podaci nisu validni ceo proces se mora ponoviti sve dok se ne unesu validni podaci. Ovo je jedan od osnovnih razloga nastanka Javaskripta koji proverava verodostojnost podataka na klijentovom pregledaču i tako olakšava posao na vebu.[3]
Javaskript je najpopularniji skriptni jezik na Internetu kojeg podržavaju svi poznatiji pregledači (Internet Explorer, Mozilla Firefox, Netscape, Opera, Safari). Neke primene JS su:
Javaskript daje HTML dizajnerima alat za programiranje - HTML autori obično nisu programeri, ali Javaskript je skriptni jezik sa veoma jednostavnom sintaksom.
Javaskript može da dinamički unese kod u HTML stranu,
Javaskript može da reaguje na događaje - Javaskript može da se podesi tako da se izvrši kad se nešto desi, npr. kad se strana učita ili kad korisnik klikne na HTML element,
Javaskript može da pročita ili ispiše HTML elemente - Javaskript može da pročita i da promeni sadržaj HTML elementa,
Javaskript može da se koristi za proveru ispravnosti unetih podataka - Javaskript može da se koristi za proveru ispravnosti podataka unetih u formu, da proveri ispravnost podataka pre nego što se pošalju serveru,
Javaskript može da se koristi za detektovanje brauzera korisnika - u zavisnosti od brauzera, učitava se strana specijalno dizajnirana za taj brauzer,
Javaskript može da se koristi za kreiranje kukija - Javaskript može da se koristi za čuvanje i vraćanje informacija o računaru posetioca, itd.
Godine 1993, Nacionalni centar za superkompjuterske aplikacije (engl.National Center for Supercomputing Applications - NCSA), koji je deo Univerziteta u Ilinoisu, objavio je Mozaik, prvi popularni grafički veb-čitač, koji je odigrao značajnu ulogu u razvoju Veba koji je u to vreme bio na samom začetku. 1994. godine u Mauntin Vjuu, u Kaliforniji, osnovana je kompanija pod nazivom Mozaik Komjunikejšn, koja je zaposlila većinu autora originalnog veb-čitača Mozaik kako bi razvili Mozaik Netskejp. Kasnije će se ispostaviti da ovaj veb-čitač neće imati nikakve sličnosti sa originalnim Mozaikom. Interni naziv za ovaj veb-čitač bio je "Mozila", što je značilo "ubica Mozaika" engl.Mosaic killer, jer je cilj kompanije bio da zameni Mozaik kao najpopularniji veb-čitač na svetu. Prva verzija veb-čitača, Mozaik Netskejp 0.9, objavljena je krajem 1994. godine. Za samo četiri meseca ovaj veb-čitač je već zauzeo tri četvrtine tržišta veb-čitača i postao je najpopularniji veb-čitač devedesetih godina 20. veka. Kako bi izbegli probleme sa autorskim pravima sa NCSA, veb-čitač je iste godine dobio nov naziv, Netskejp navigator, a kompanija Netskejp Komjunikejšn.
U ovoj kompaniji su na vreme shvatili da bi Veb trebalo da postane dinamičniji. Osnivač kompanije, Mark Andresen, tvrdio je da HTML-u treba prateći jezik koji veb dizajneri i programeri mogu lako da koriste za sklapanje komponenti kao što su slike i dodaci, čiji bi se kod pisao direktno u HTML kodu veb stranice. Kako bi uopšte započeli sa radom, kompanija Netskejp Komjunikejšn je morala da sarađuje sa kompanijom San Majkrosistems da bi u ovaj veb-čitač ugradili njihov statični programski jezik Javu i time se borili sa konkurentskom kompanijom Majkrosoft za veću naklonost korisnika i usvajanje veb tehnologija i platformi.[6] Odlučeno je da se kreira programski jezik komplementaran Javi, sa sličnom sintaksom, što je u startu značilo odbacivanje podrške za druge programske jezike kao što su Perl, Pajton, TCL ili Scheme. Kako bi odbranili ideju Javaskripta u odnosu na ponudu konkurenata, kompanije je bio potreban prototip. Ajk je napisao prototip budućeg programskog jezika za 10 dana, u maju 1995. godine.
Iako je razvijan pod kodnim nazivom Moka, jezik je zvanično nazvan Lajvskript prilikom prvog objavljivanja beta verzija Netskejp navigatora 2.0, septembra 1995. godine, ali je ubrzo preimenovan u Javaskript[1] sa objavljivanjem Netskejp navigatora 2.0 beta 3 verzije, u decembru iste godine.[7] Konačan izbor imena je izazvao konfuziju kod korisnika jer je stvoren utisak da je ovo još jedna varijanta programskog jezika Java, a sam izbor imena je okarakterisan kao marketinški trik Netskejpa kako bi se Javaskript predstavio kao najnoviji veb programski jezik.
Često se javlja pogrešno tumačenje da je na razvoj Javaskripta bitno uticao veb skriptni jezik C-- razvijen od strane kompanije Nombas (ovaj skriptni jezik ne treba mešati sa kasnije razvijenim jezikom C--, 1997. godine]).[8][9] U prilog tome ide i činjenica da Brendan Ajk nije nikad čuo za C-- pre nego što je kreirao LajvSkript.[10] Nombas je obezbeđivao ugrađene skriptne veb stranice Netskejpu, iako koncept skriptnih veb stranica nije bio nov, kao što se može videti u veb-čitaču ViolaWWW.[11] Kasnije je kompanija Nombas odlučila da u svom proizvodu SkriptIz, C-- zameni Javaskriptom i učestvovala je u standardizaciji EKMASkripta kroz TC39 grupu.[12]
U decembru 1995. godine, ubrzo nakon objavljivanja Javaskripta za veb-čitače, kompanija Netskejp je predstavila i implementaciju ovog jezika za servere kroz Netskejp enterprajz server (engl.Netscape Enterprise Server).
Od sredine 2000-ih, objavljeno je nekoliko serverskih Javaskript implementacija, među kojima najpoznatiji Node.js (2009. godine).[13]
Majkrosoft je 1996. godine predstavio svoje skriptne jezike, VBSkript i JSkript. JSkript, obrnuta implementacija Netskejpovog Javaskripta, bila je deo Internet Eksplorera 3. JSkript je takođe bio dostupan i kao serverska implementacija skriptnog jezika u Internet Informacionom Serveru. Internet Eksplorer 3 je po prvi put doneo podršku za CSS i različite HTML dodatke, ali se vodilo računa o tome da svaka implementacija bude značajno različita od one u Netskejp navigatoru.[14][15] Ove razlike su otežavale dizajnerima i programerima da prave veb-sajtove koji bi funkcionisali u oba veb-čitača, što je dovelo do pojave logoa "najbolji prikaz u Netskejpu" i "najbolji prikaz u Internet Eksploreru" koji su obeležili početne godine borbe među veb-čitačima.[16] Javaskript je počeo da stiče reputaciju prepreke višeplatformskom i standardizovanom Vebu. Programeri su se prihvatili zadatka da pokušaju da prave veb-sajtove koji će raditi u oba najpoznatija veb-čitača iako većina nije imala vremena za to.[14] Objavom Internet Eksplorera 4, Majkrosoft je predstavio koncept dinamičkog HTML-a, ali su razlike u implementaciji jezika i različiti vlasnički objektni modeli dokumenata predstavljali prepreke za širu primenu Javaskripta na Vebu.[14]
U novembru 1996. godine, Netskejp je standardizovao Javaskript kako bi ostale kompanije koje razvijaju veb-čitače mogle da ga implementiraju u svojim proizvodima. To je dovelo do zvaničnog objavljivanja specifikacije jezika EKMASkript koja je objavljena u prvoj verziji EKMA-262 standarda u junu 1997. godine, čija je najpoznatija implementacija upravo Javaskript. EkšnSkript i JSkript su takođe poznate implementacije EKMASkripta sa dodacima.
Proces standardizacije je nastavljen u ciklusima, objavljivanjem EKMASkripta 2 u junu 1998. godine, koji donosi određene promene kako bi se prilagodio ISO/IEC 16262 međunarodnom standardu. Sa objavljivanjem je nastavljeno u decembru 1999. godine sa EKMASkriptom 3, koji predstavlja osnovu za Javaskript kakav danas znamo. Razvoj originalnog EKMASkripta 4, koji je vodio Valdemar Horvat (tada zaposleni u Netskejpu, danas u Guglu), počeo je 2000. godine i na samom početku je izgledalo kao da Majkrosoft učestvuje u tome pa je čak i implementirao neke karakteristike u njihov JSkript .NET jezik.
Vremenom je bilo jasno da Majkrosoft ne namerava da sarađuje niti da implementira Javaskript u InternetEksploreru, iako nisu imali dostojnu alternativu već samo parcijalno završenu implementaciju .NET serverske strane. Zbog toga je do 2003. godine razvoj EKMASkripta 4 bio zapostavljen.
Sledeća bitna godina za Javaskript bila je 2005, koju su obeležila dva velika istorijska događaja bitna za razvoj Javaskripta. Prvo su se Brendan Ajk i Mozila pridružili EKMA Internašonal kao neprofitni članovi i započet je rad na EKMASkriptu za XML (E4X), EKMA-357 standardu, koji je potekao od Majkrosoftovih bivših zaposlenih koji su sad radili za BEA Sistems. To je dovelo do zajedničkog rada sa kompanijom Makromedija (koju je kasnije kupio Adobi Sistems), koji su primenili E4X u svom EkšnSkriptu 3 (EkšnSkript 3 je bio fork originalnog EKMASkripta 4).
Zajedno sa Makromedijom ponovo je otpočet razvoj EKMASkripta 4 sa ciljem standardizacije komponenti iz EkšnSkripta 3. Na kraju ovog procesa, Adobi Sistems je objavio EkšnSkript virtuelnu mašinu verzije 2, kodnog naziva Tamarin, kao projekat otvorenog koda. Međutim, Tamarin i EkšnSkript 3 su bili značajno različiti od onoga čemu Javaskript teži, što su obe strane uvidele tokom 2007. i 2008. godine.
Na tržištu je vladao haos među različitim igračima. Daglas Krokford, tada zaposleni u Jahu-u, udružio se sa Majkrosoftom 2007. godine kako bi se suprotstavio EKMASkript 4 standardu, što je dovelo do razvoja EKMASkript 3.1 standarda. Iako razvoj EKMASkript 4 standarda nikad nije dovršen, on je bitno uticao na naredne verzije.[17]
Dok se sve ovo dešavalo, zajednice otvorenog koda i programera su nastavile na razvoju revolucionarnih mogućnosti sa Javaskriptom. Napor zajednice je dobio zamajac 2005. godine kada je Džesi Džejms Garet osmislio koncept Ajaksa i opisao skup tehnologija, gde je oslonac bio na Javaskriptu, koje se koriste za kreiranje veb aplikacija kod kojih se podaci mogu učitavati u pozadini, bez potrebe da se cela stranica učita, što je dovelo do razvoja još dinamičnijih aplikacija. Sve ovo je dovelo do perioda preporoda u korišćenju Javaskripta, predvođenog bibliotekama otvorenog koda i zajednicama koje su se formirale oko njih, sa bibliotekama kao što su Prototajp, džejKveri, Dodžo Tulkit, MuTuls i druge.
U julu 2008. godine, razdvojene strane su se sastale u Oslu. To je dovelo do eventualnog dogovora početkom 2009. godine, da se EKMASkript 3.1 standard preimenuje u EKMASkript 5 i da se jezik unapredi prateći agendu poznatiju kao Harmoni (engl.Harmony). EKMASkript 5 je konačno objavljen u decembru 2009. godine.
U junu 2011. godine, EKMASkript 5.1 je objavljen kako bi se u potpunosti izjednačio sa trećim izdanjem ISO/IEC 16262 međunarodnog standarda. EKMASkript 2015 je objavljen u junu 2015. godine. Trenutna verzija EKMASkript 2016 je objavljena u junu 2016. godine.[18]
Javaskript je postao jedan od najpopularnijih programskih jezika na Vebu. Međutim, na samom početku jezik nije bio na dobrom glasu među programerima profesionalcima, zbog toga što su mu, između ostalog, ciljna publika bili veb autori i ostali "amateri".[19] Sa pojavom Ajaksa Javaskript se vraća u centar pažnje i postaje atraktivan za sve više programera. Rezultat toga je umnožavanje obimnih frejmvorka i biblioteka, poboljšana Javaskript rutina programiranja i povećano korišćenje Javaskripta izvan veb-čitača, što je u direktnoj korelaciji sa značajnim razvojem serverskih Javaskript platformi.
U januaru 2009. godine, predstavljen je projekat KomonJS (engl.CommonJS) sa ciljem standardizacije zajedničkih biblioteka, uglavnom za Javaskript razvoj izvan veb-čitača.[20]
Sa porastom jednostraničnih aplikacija i naprednih Javaskript sajtova, povećano je njegovo korišćenje od strane kompajlera kako za dinamičke tako i za statičke programske jezike.
Javaskript podržava veći deo strukturirane sintakse programskog jezika C (npr. if iskaze, while petlje, switch iskaze, do while petlje, i dr.). Delimičan izuzetak je opseg promenljivih: Javaskript je u originalu podržavao samo funkcionalni opseg promenljivih pomoću deklaracije var. EKMASkript 2015 donosi ključnu reč let za blokovski opseg, tako da sada Javaskript podržava funkcionalni i blokovski opseg. Kao i C, Javaskript pravi razliku između iskaza i izraza. Još jedna bitna razlika u odnosu na C je i automatsko umetanje kraja naredbe odnosno karaktera tačka-zarez, pa nije potrebno eksplicitno naglašavati kraj naredbe sa znakom tačka-zarez.[23]
Kao i većina skriptnih jezika, Javaskript je jezik sa dinamičnom proverom kucanja; tip je povezan sa svakom vrednošću pre nego sa svakom izrazom. Na primer, ukoliko imamo neku promenljivu koja je vezana za broj, ta ista promenljiva kasnije može biti vezana za string.[24] Javaskript podržava različite načine provere tipa objekta.
Provera prilikom izvršavanja
Javaskript sadrži eval koja može da izvršava iskaze u obliku stringova u vreme izvršavanja.
Javaskript je skoro u potpunosti objektno zasnovan skriptni jezik. U Javaskriptu, objekat predstavlja asocijativni niz, naglašen pomoću prototipa; svaki ključ u obliku niza karaktera predstavlja naziv svojstva objekta za koji postoji dva sintaksna način za definisanje takvog naziva; notacija sa tačkom, engl.dot notation (obj.x = 10) i notacija sa zagradama, engl.bracket notation (obj['x'] = 10). Svojstvo se može dodati ili obrisati za vreme izvršavanja koda. Većina svojstava objekta (ili bilo kog svojstva koje pripada lancu nasleđivanja prototipa objekta) se može nabrojati korišćenjem for...in petlje.
Javaskript sadrži ograničen broj ugrađenih objekata, kao što su Date i Function.
Prototipovi
Javaskript koristi prototipove u slučajevima u kojima drugi objektno-orijentisani programski jezici koriste klase za nasleđivanje.[25] Pomoću prototipova u Javaskriptu je moguće simulirate mnoge karakteristike klasa.[26]
Funkcije kao konstruktori objekata
Funkcije osim svoje glavne funkcije, imaju i ulogu konstruktora objekata. Dodavanjem prefiksa new ispred poziva funkcije, kreira novu instancu prototipa, nasleđujući svojstva i metode konstruktora (uključujući i svojstva Object prototipa).[27] EKMASkript 5 sadrži metodu Object.create, koja omogućava eksplicitno kreiranje instance bez automatskog nasleđivanja Object prototipa (starija okruženja mogu dodeljivati prototipu vrednost null).[28] Svojstvo prototype konstruktora određuje koji objekat se koristi kao interni prototip novog objekta. Nove metode se mogu dodati izmenom prototipa funkcije koja se koristi kao konstruktor. Konstruktori dostupni u samom Javaskriptu, kao što su Array i Object, takođe imaju svoje prototipove koji mogu da se izmene. Iako moguća, izmena Object prototipa nije dobra praksa zbog toga što većina objekata u Javaskriptu nasleđuje metode i svojstva iz Object prototipa i potencijalno ne očekuju njegovu izmenu.[29]
Funkcije kao metode
Za razliku od većine objektno-orijentisanih jezika, u Javaskriptu ne postoji razlika između definisanja funkcija i definisanja metoda. Najčešće, razlika postoji kod pozivanja funkcije; kada se funkcija poziva kao metoda objekta, njena lokalna ključna reč this se vezuje za taj objekat prilikom pozivanja.
Funkcija je prve klase i može se tretirati kao objekat. Kao takva, funkcija može da sadrži svojstva i metode, kao što je .call() i .bind().[30]Ugnježdena funkcija je funkcija koja se definiše unutar druge funkcije. Ovakva funkcija se kreira svaki put kada se pozove nadređena funkcija. Dodatno, svaka nadređena funkcija formira leksički blok; Leksički blok nadređene funkcije (uključujući konstante, lokalne promenljive i vrednosti argumenata) postaju sastavni deo svakog objekta podređene funkcije, čak i nakon završetka izvršavanja nadređene funkcije.[31] Javaskript podržava i anonimne funkcije.
Javaskript podržava implicitno i eksplicitno delegiranje.
Funkcije kao uloge (Traits i Mixins)
Javaskript podrazumevano podržava različite funkcije implementirane u vidu uloga (engl.Roles)[32] i paterna kao što su Traits[33][34] i Mixins.[35] Ovakva funkcija definiše dodatno ponašanje barem jedne metode vezane za ključnu reč this unutar tela funkcije. Uloga se nakon toga eksplicitno dodeljuje pomoću call ili apply naredbe objektima koji treba da sadrže dodatno ponašanje koje se ne deli kroz lanac prototipova.
Kompozicija objekata i nasleđivanje
Iako eksplicitna delegacija zasnovana na funkcijama pokriva kompoziciju objekata u JavaSkript-u, implicitna delegacija se već obavlja svaki put kada se lanac prototipova proširuje kako bi, npr. pronašli metodu koja je potencijalno povezana ali ne i u direktnoj vezi sa objektom. Kada se metoda jednom pronađe, ona se poziva u kontekstu objekta. Na ovaj način je nasleđivanje u JavaSkrupt-u pokriveno automatizmom delegacije koji se vezuje za svojstva prototipa u okviru funkcija u konstruktoru.
JavaSkript se najčešće oslanja na izvršno okruženje (npr. Veb pretraživač) kak obi obezbedilo objekte i metode pomoću kojih skripte vrše interakciju sa okruženjem (npr. Objektni model dokumenta veb stranice). Takođe se na izvršno okruženje oslanja i da bi obezbedili mogućnost uključivanja skripti (npr. pomoću HTMLscript elementa). Ovo nije osobina samog programskog jezika, iako je zajednička karakteristika mnogih JavaSkript implementacija.
JavaSkript obrađuje poruke iz reda jednu po jednu. Pre nego što učita novu poruku, JavaSkript poziva funkciju vezanu za ovu poruku, čime se kreira okvir pozivnog steka (argumenti funkcije i lokalne promenljive). Pozivni stek se širi i raste u zavisnosti od potreba funkcije. Pre samog izvršavanja funkcije, kada je stek prazan, JavaSkript nastavlja sa obradom sledeće poruke u redu. To se još naziva i petljom događaja (engl.event loop) i opisuje kao "skok na završetak" jer je svaka poruka u potpunosti obrađena pre nego što se u obzir uzme sledeća poruka. Bez obzira na to, model konkurentnosti programskog jezika definiše da petlja događaja ne blokira samo izvršavanje: ulazno/izlazne operacije programa se odvijaju putem događaja i povratnih funkcija. To znači, na primer, da JavaSkript može da obradi klik mišem dok čeka da upit nad bazom podataka vrati traženu informaciju.[36]
Varijativne funkcije
Funkciji može biti prosleđen neograničen broj argumenata. Funkcija im pristupa putem formalnih parametara ili kroz lokalni arguments objekat. Varijativne funkcije se takođe mogu kreirati i pomoću bind metode.
Niz i literali objekata
Kao i kod mnogih programskih jezika, nizovi i objekti (asocijativni nizovi u drugim jezicima) se mogu kreirati pomoću skraćene sintakse. Zapravo, ovi literali formiraju bazu JSON formata podataka.
Regularni izrazi
JavaSkript takođe podržava regularne izraze na način sličan onome u programskom jeziku Perl, koji pruža preciznu i snažnu sintaksu za manipulaciju tekstom koja je dosta naprednija od ugrađenih funkcija znakovnih nizova.[37]
Razvojem JavaSkript programskog jezika upravlja Mozila Fondacija, dok se nove funkcionalnosti periodično dodaju jeziku. Međutim, samo određeni pokretači JavaSkript-a podržavaju ove nove funkcionalnosti:
Pojam Vanila Javaskript ili Vanila JS se odnosi na Javaskript koji nije proširen nekim frejmvorkom ili dodatnim bibliotekama. Skript napisan Vanila Javaskriptom je čist Javaskript kod.
Brojevi: sve vrednosti su predstavljene kao realni brojevi (64 bita, IEEE 754 standard). U slučaju prekoračenja (overflow) generiše se +/- Infinity.[41] U slučaju potkoračenja (underflow) generiše se 0/ "negative zero". Deljenje nulom ne rezultira greškom osim u slučaju 0/0 – tada se generiše NaN. Infinity i NaN su globalne promenljive koje se mogu samo čitati.
Stringovi su nepromenljive sekvence 16-bitnih vrednosti, uglavnom Unikodnih karaktera i moraju biti pod dvostrukim ili jednostrukim navodnicima ("string", '123str45', "vise reci", ...). Takođe, bitno je zapamtiti da indeksi kreću od nule, a ne od jedinice.[41] String može sadržati i HTML kodove, kao i sledeće specijalne tekst oznake:
null - predstavlja nedostajuću vrednost (jezička ključna reč);[41] undefined - predstavlja nedostajuću vrednost (globalna promenljiva koja se može samo čitati); dobija se kao rezultat pristupa svojstvima ili elementima niza koji ne postoje ili kao rezultat funkcija koje nemaju return.[41] Ovo je možda malo zbunjujuće, ali bitno je zapamtiti da je undefined sam po sebi (nedefinisan) tip, a null je objekat.
Objekti su sve preostalo, odnosno, neuređena kolekcija imenovanih vrednosti (svojstava). Oni su dinamičke prirode i za razliku od primitivnih tipova prenose se po referenci, a ne po vrednosti. Svaki put kada se interpreter pokrene ili se učita nova strana u pregledaču, kreira se nešto što se zove globalni objekat i na nivou njega se definišu i inicijalizuju svojstva tipa undefined, NaN, globalne funkcije tipa isNaN(), parseInt(), konstruktori kao što su Date(), Array(), String(),..., globalni objekti ko što su Math, JSON,... Rezervisana reč kojom se u globalnom opsegu može referisati na ovaj objekat je this. Na nivou pregledača to je Vindous objekat koji se može referisati sa window.[41]
U programiranju se često dolazi u situaciju u kojoj se deo programa ponavlja na više različitih mesta. Postoji potreba da se taj deo programa izdvoji i da se poziva po potrebi. To se ostvaruje pomoću funkcija. Funkcije predstavljaju potprograme koji uglavnom vraćaju rezultat nekog izračunavanja. Vraćanje rezultata nije obavezno.[42] Da bi se koristila funkcija, ona se mora deklarisati. Deklaracija obavezno sadrži ključnu reč function. Posle nje se može navesti naziv funkcije, a onda obavezno zagrade unutar kojih se može navesti lista formalnih argumenata. Konačno, obavezno se navode vitičaste zagrade unutar kojih se može navesti telo funkcije, odnosno njene naredbe.[42]
Naredbe unutar funkcije se ne izvršavaju dok se funkcija ne pozove. Poziv funkcije se obavlja jednostavno navođenjem naziva funkcije i, obavezno, zagrada unutar kojih se može navesti lista argumenata.[42]
Prilikom deklaracije funkcije može se navesti lista parametara. Lista parametara je obično spisak promenljivih.
functionzbir(a,b){varrezultat=a+b;}
U navedenom primeru a i b su lokalne promenljive u funkciji. Funkcija uzima prosleđene parametre, u ovom slučaju dva broja i vraća njihov zbir. Funkcija kao parametar može uzimati neke vrednosti ili reference na objekte. U programu mogu nesmetano postojati istoimene promenljive dokle god su u različitom lokalnom opsegu.[42]
Formalni parametri su oni koji se navode u deklaraciji funkcije i koji se koriste kada se piše telo funkcije. Stvarni argument su konkretne vrednosti koje se navode. Pri pozivu funkcije bitno je da parametri imaju vrednosti.
zbir(5,2);zbir(x,y*4);
U klasičnom programiranju važi da se stvarni i formalni parametri moraju poklopiti po broju, tipu i redosledu. Javaskript dozvoljava odstupanje od ovog pravila. To znači da je dozvoljeno da se navede više stvarnih argumenata nego što je predviđeno (vrednosti viškova se ignorišu), ili da ih ima manje (u funkciji će nedostajući parametri imati vrednost undefined). Pošto Javaskript nije strogo tipiziran jezik, ne postoji način da se programer natera da koristi tačno određene tipove pri pozivu funkcije. To što je ovakva praksa dozvoljena ne znači da je poželjna.[42]
Unutar funkcije se na jednom ili više mesta može navesti naredba return, posle koje se navodi vrednost koja se vraća kao rezultat funkcije. Važno je naglasiti da čim se u izvršavanju funkcije naiđe na naredbu return, funkcija prekida sve i ostale naredbe će biti ignorisane.[42]
Vrednost funkcije se može koristiti unutar izraza.
varp=zbir(a-10,zbir(c*2,b)/2);
Primer funkcije koja računa kvadrat broja
functionkvadratBroja(x){returnx*x;}---x=kvadratBroja(5);/* poziv funkcije */document.write("Kvadrat od 5 je "+x);//u HTML dokumentu ispisuje vrednost---Kvadratod5je25
Javaskript Array objekat je globalni objekat koji se koristi kao konstruktor za kreiranje nizova.[43]
//kreiranje nizavarniz=[1,2,3,"Soldier of fortune"];//ilivarnovi_niz=newArray(4,5,"I can't make you love me");varn=niz.length;// u promenljivu n upisujemo dužinu nizavarprvi=niz[0];// prvi sadrži 1, tj. prvi element nizavarposlednji=niz[niz.length-1];//poslednji sadrži "Soldier of fortune", tj. poslednji element niza//for je kolekcijskiniz.forEach(function(itemindexarray)){console.log(item,index);});/*1 0 2 1 3 2 "Soldier of fortune" 3*///dodavanje elementa na kraj nizavarkraj=niz.push("Tears in heaven");// niz: [1, 2, 3, "Soldier of fortune", "Tears in heaven"]//brisanje elementa sa kraja nizavarposlednji=niz1.pop();//niz: [1, 2, 3, "Soldier of fortune"]//brisanje elementa sa pocetka nizavarprvi=niz1.shift();//niz: [2, 3, "Soldier of fortune"]//dodavanje na početak nizavarnovi_niz=niz1.unshift("Wish you were here");//niz: ["Wish you were here", 2, 3, "Soldier of fortune"]//pronalaženje pozicije na kojoj se element nalazivarpozicija=niz1.indexOf(2);//1//brisanje elementa koji se nalazi na zadatoj pozicijivarniz1_bez_dvojke=niz1.splice(pos,1);//niz: ["Wish you were here", 3, "Soldier of fortune"]//pravljenje kopije nizavarkopija=niz1.slice();//kreiranje višedimenzionih nizovavarvisedimenzioni_niz=[["Ali","sreca","je","uvek","bila","tamo"],["gde","je","neko","umeo","da","voli"],["i","ziveo","za","svoja","osecanja"]];//pristupanje elementimavarelement=visedimenzioni_niz[1][5];//"voli"varprvi_element=visedimenzioni_niz[0];//["Ali", "sreca", "je", "uvek", "bila", "tamo"]//primervarvrednost=[];for(x=0;x<10;x++){vrednost.push([2**x,2*x**2])};console.table(vrednost.join('\n'));/*"0,0 1,2 4,8 9,18 16,32 25,50 36,72 49,98 64,128 81,162"*/
Svaki od pregledača ima svoj podrazumevani način reagovanja na greške, npr. Fajerfoks i Kroum upisuju greške u log datoteku, dok recimo Internet Eksplorer i Opera generišu obaveštenja za korisnika. Zbog udobnosti rada korisnika potrebni su mehanizmi koji bi omogućili rukovanje s greškama.[46]
Greške se mogu obrađivati u okviru try-catch bloka: ovakve greške pregledači smatraju primećenim pa ne reaguju na njih.
try{...}catch(error){...}
Tipovi grešaka koji mogu da se jave:
Error - osnovni tip greške (svi ostali se nasleđuju) ima svojstvo message sa opisom greške i svojstvo name kojim se određuje tip greške. Pregledači interno obogaćuju ovaj objekat, pa npr. Fajerfoks ima i svojstva fileName sa imenom datoteke u kojoj se javila greška, lineNumber koji sadrži liniju greške i stack koji sadrži stack trace.[46]
EvalError - greška koja se generiše pri radu sa eval() funkcijom koja izvršava Javaskript kod zapisan u vidu niske i prosleđen kao argument, npr. eval("var a,b,c;a=5;b=10;c=a+b"). Ovu funkciju treba koristiti uz oprez ukoliko postoji mogućnost da njen argument postane maliciozni kod koji može da ugrozi podatke i aplikaciju. Uz sve to, eval() se nešto sporije izvršava jer eksplicitno poziva JS interpreter.[46]
RangeError - greška koja se generiše kada vrednost koja se navodi nije u skupu ili opsegu dozvoljenih vrednosti, npr. a=new Array(-20)[46]
ReferenceError - javlja se u slučajevima kada se referiše na nepostojeću promenljivu[46],
npr. a=x;, dok x ne postoji
SyntaxError - obično se javlja kada se prosledi sintaksno neispravan kod funkciji eval(); u svim ostalim slučajevima sintaksne greške automatski prekidaju izvršavanje Javaskript koda[46]
TypeError - tip greške koji se najčešće javlja i to kada je promenljiva neodgovarajućeg tipa ili kada se pokušava sa pristupom metodi koja ne postoji[46]
URIError - greška koja se javlja kao posledica korišćenja funkcija encodeURI() i decodeURI() na URI argumentima koji su pogrešnog formata. Funkcija encodeURI() samo vrši URI kodiranje, kodiraju se svi specijalni karakteri(%HH) osim rezervnih karaktera: ;,/?:@&=+$# slova i karaktera: _ . ! ~ * ' ( )[46]
decodeURI() - inverzna funkcija funkciji encodeURI()
Upisivanje u centralizovani log sistem (na strani servera): svaki put kada se greška javi može se generisati AJAX poziv koji sadrži tip greške i poziv greške; tako se lakše može pratiti ponašanje aplikacije na strani klijenata.[46]
//image pings tj. slanje zahteva preko img objektafunctionlogerror(type,message){varimg=newImage();imgsrc="log.php?type="+encodeURIComponent(type)+"&message="+encodeURIComponent(message);}ukodu...catch(error){if(errorinstanceofSyntaxError){logerror("syntax","Description:"+error.message);}...}
Image pings je jednosmerni vid komunikacije između klijenta i servera koji zaobilazi pravilo istog porekla (može se komunicirati između raznorodnih domena).
često se koriste za praćenje korisničkih klikova
mana im je što ne postoji mogućnost slanja samo GET zahteva, i što ne postoji mogućnost obrade serverskog tekstualnog odgovora.[46]
U ovom delu se razmatraju najosnovnije stvari bez kojih je nemoguće bilo šta kreirati vezano za Javaskript. Tu se pre svega misli na Javaskript sintaksu, tipove promenljivih, operatore itd.
Postoje dve mogućnosti: pisanjem direktno u HTML kod ili smeštanjem u poseban fajl (ekstenzija .js) koji se potom poziva u HTML dokumentu. Oba načina su pravilna i ne postoji razlika u radu skripta. Pozivanje spoljašnjeg fajla je dobro u slučajevima kada se jedna ista skripta koristi u više stranica.[47] Brauzer čita HTML stranicu i prikazuje elemente onako kako oni nailaze. Kada naiđe na skript u stranici, obavlja se njegovo izvršavanje pre nego što se nastavi čitanje ostalih elemenata (tekst, slike...).[47]
Primeri
Javaskript pisan u HTML dokumentu:
<html><body><scripttype="text/javascript">document.write("Ovo je moj prvi JavaScript!");</script></body></html>
Postoje različiti načini pozivanja Javaskript koda, tj. različita mesta gde se on može smestiti u stranici. Prvi način je da se Javaskript kod stavi u <head> sekciji, dok je drugi način smeštanje unutar <body> sekcije dokumenta. Kod prvog načina skripta se učitava odmah, još pre učitavanja čitave stranice, dok se kod drugog načina skripta izvršava čim brauzer naiđe na nju. Moguće je postaviti neograničen broj skripti u stranici, bilo da se radi o prvom ili drugom slučaju.[47]
Komentari se koriste radi lakšeg snalaženja u kodu, i kao podsetnici. To je način za ostavljanje napomena tokom programiranja, čime se olakšava rad na kodu.[47]
Razlikujemo dva tipa komentara:
jednolinijski
//ovo je komentar
višelinijski
/*ovo je dugačak višelinijski JavaScript komentar*/
Javaskript kao i ostali programski jezici, koristi promenljive da bi zapamtio vrednosti, tako da se one kasnije mogu koristiti u drugim delovima programa. Imena promenljivih mogu da počinju velikim slovima (A - Z), malim slovima (a - z), ili donjom crtom (_). Preostali karakteri mogu da se sastoje od malih i velikih slova, donje crte, ili cifara od 0 do 9. Takođe, bitno je napomenuti da Javaskript razlikuje mala i velika slova. Javaskript za razliku od nekih drugih programskih jezika ne zahteva specificiranje tipa vrednosti promenljive, on to čak i ne dozvoljava. Ista promenljiva može da se koristi za smeštanje različitih tipova vrednosti u njoj, kao što su stringovi, celi brojevi, realni brojevi (3.14) ili logičke vrednosti. Javaskript interpretator automatski konvertuje tip podataka koji se nalazi u promenljivoj. Stringovi se moraju navoditi pod navodnicima, dok ostali tipovi to ne zahtevaju.[48]
Za deklarisanje promenljivih koristi se ključna reč var:[47]
lokalne - vidljeve su samo u bloku u kom su deklarisane
globalne - vidljive su u celom programu
Ako se promenljiva deklariše u okviru neke funkcije bez ključne reči var, smatra se da je ta promenljiva globalna, tj. vidljiva je u celom kodu.[47]
functionprimer1(){a=1;}varb=a+2;
Dakle, a je globalna i moguće joj je pristupiti.
vara=1;functionprimer2(){varb=a+2;}
I u ovom primeru je moguće pristupiti promenljivoj a jer je globalna.
Međutim, u sledećem primeru to neće biti moguće, jer se a smatra lokalnom promenljivom.
Operatori u Javaskriptu predstavljaju simbole, koji označavaju određenu operaciju ili relaciju i koje povezuju jedan ili više operanada u jedan izraz (aritmetički, logički...). Za celobrojne tipove te operacije uključuju aritmetičke, relacijske i logičke operacije. Podržani su i operacije koje se primenjuju nad pojedinačnim bitovima celobrojnih vrednosti. Operatori se dele na osnovu svoje parnosti tj. broja operanada na koje se primenjuju. Unarni operatori deluju samo na jedan operand i mogu biti prefiksni kada se navode ispred operanda i postfiksni kada se navode nakon operanda. Binarni operandi imaju dva operanda i obično su infiksni tj. navode se između svojih operanada. Postoji i ternarni operator koji se primenjuje na tri operanda.
Izrazi mogu da obuhvataju više operatora i zagrade i koriste se da bi odredile kojim redosledom ih treba primenjivati. Postoje konvencije koje omogućavaju izostavljanje zagrada. Jedna od osnovnih takvih konvencija je prioritet operatora koji definiše kojim redosledom će se dva različita operatora primenjivati kada se nađu u istom, nezagrađenom izrazu. Naki od osnovnih principa u definisanju prioriteta:
Unarni operatori imaju veći prioritet u odnosu na binarne.
Postfiksni unarni operatori imaju veći prioritet u odnosu na prefiksne unarne operatore.
Aritmetički operatori imaju prioritet u odnosu na relacijske koji imaju prioritet u odnosu na logičke operatore.
Operatori dodele imaju veoma nizak prioritet.
Druga važna konvencija je asocijativnost operatora koja definiše kojim redosledom će se izračunavati dva ista operatora ili operatora istog prioriteta kada se nađu uzastopno u istom, nezagrađenom izrazu. Obično se razlikuju leva asocijativnost, kada se izraz izračunava sleva nadesno, i desna asocijativnost, kada se izraz izračunava zdesna nalevo. Većina operatora ima levu asocijativnost (najznačajniji izuzeci su prefiksni unarni operatori i operatori dodele).
Aritmetički operatori se koriste za izvršavanje aritmetičkih operacija. Aritmetički operatori imaju veći prioritet od relacijskih (operatori poređenja), koji imaju veći prioritet od logičkih operatora.[49]
Operator
Opis
+
unarni plus i sabiranje
-
unarni minus i oduzimanje
*
množenje
/
deljenje
%
moduo
++
inkrementiranje
--
dekrementiranje
**
stepen
Unarni + je ekvivalentan pozivu Number() konstruktora, tj. pretvara svoj operand u brojni tip. Unarni - radi isto to i nakon toga negira vrednost. Unarni - se uglavnom koristi kada želimo da koristimo negativne brojeve.
Binarni + se može koristiti i za konkatenaciju stringova.
Operator inkrementiranja povećava vrednost operanda za 1, a dekrementiranja smanjuje za 1. Ovi operatori mogu biti prefiksni i postfiksni. Prefiksni operator inkrementiranja uveća vrednost operanda i vrati je, a postfiksni operator inkrementiranja prvo vrati vrednost operanda, pa je tek onda uveća. Slično je i sa dekrementiranjem.
vara=3document.write(++a)//postavlja a na 4 i upisuje 4varb=3document.write(b++)//upisuje 3 i postavlja b na 4document.write(b)//upisuje 4document.write(--a)//postavlja a na 3 i upisuje 3document.write(b--)//upisuje 4 i postavlja b na 3document.write(b)//upisuje 3
Vrednosti promenljivama dodeljuju se korišćenjem operatora dodele. Najčešći operator dodeljivanja je znak jednako “=”. Operator dodele može se pisati zajedno sa binarnim aritmetičkim operatorima.[50]
Simbol
Značenje
=
// dodeljuje vrednost promenljive ili izraza s desne strane promenljivoj s leve strane (x=y;)
+=
// sabira dve promenljive (x = x + y;) i dodeljuje zbir promenljivoj s leve strane
-=
// oduzima dve promenljive (x = x - y;) i dodeljuje razliku promenljivoj s leve strane
*=
// množi dve promenljive (x = x * y;) i dodeljuje proizvod promenljivoj s leve strane
/=
// deli dve promenljive (x = x / y;) i dodeljuje količnik promenljivoj s leve strane
%=
// celobrojno deli dve promenljive (x = x % y;) i dodeljuje ostatak pri deljenju promenljivoj s leve strane
Operatori poređenja upoređuju vrednosti dve promenljive ili izraza. Svaki izraz u kome se koriste operatori poređenja ima logičku vrednost: ako je izraz tačan, ima logičku vrednost True, a ako je netačan logičku vrednost False.[51]
Simbol
Značenje
==
// vraća vrednost true ako su promenljive jednake (x == y)
===
// vraća vrednost true ako promenljive iste vrednosti i istog tipa
!=
// vraća vrednost true ako promenljive nisu jednake (x != y)
>
// vraća vrednost true ako je promenljiva s leve strane veća od promenljive s desne strane (x > y)
<
//vraća vrednost true ako je promenljiva s leve strane manja od promenljive s desne strane (x < y)
>=
//vraća vrednost true ako je promenljiva s leve strane veća ili jednaka od promenljive s desne strane (x >= y)
<=
//vraća vrednost true ako je promenljiva s leve strane manja ili jednaka od promenljive s desne strane (x <= y)
Logički operatori primenjuju se nad istinitosnim vrednostima, koje se predstavljaju korišćenjem brojevnih vrednosti. Ukoliko je broj jednak 0, onda je njegova logička vrednost jednaka 0 (netačno), a inače je njegova logička vrednost jednaka 1 (tačno). Rezultat izračunavanja tačno nije proizvoljna vrednost različita od nula, već isključivo jedan. Postoje sledeći logički operatori:[52]
&& - logički AND vraća vrednost true ako su oba izraza true
|| - logički operator OR vraća vrednost true ako je barem jedan izraz true
! - logički operator NOT vraća vrednost true ako je izraz false odnosno false ako je izraz true
Uslovni operator ispituje da li je uslov ispunjen (vrednost true), ako jeste dodeljuje vrednost nakon upitnika, u suprotnom dodeljuje vrednost nakon dvotačke.[53]
poruka=(email=="Da")?"Primio si poštu.":"Nema pošte.";
Ukoliko je vrednost promenljive email jednaka “Da” dodeljujemo promenljivoj poruka vrednost “Primio si poštu.”, u suprotnom dodeljujemo joj vrednost “Nema pošte.”.
Bitovski operatori se koriste za rad sa pojedinačnim bitovima (1 i 0), koji se mogu primenjivati samo na celobrojne argumente.[54]
~ - bitovska negacija - invertuje svaki bit argumenta
& - bitovska konjunkcija - vrši konjunkciju pojedinačnih bitova dva argumenta
| - bitovska disjunkcija - vrši disjunkciju pojedinačnih bitova dva argumenta
^ - bitovska ekskluzivna disjunkcija - vrši ekskluzivnu disjunkciju pojedinačnih bitova dva argumenta
<< - levo pomeranje (šiftovanje) - vrši pomeranje bitova prvog argumenta ulevo za broj pozicija koji je naveden kao drugi argument
>> - desno pomeranje (šiftovanje) - vrši pomeranje bitova prvog argumenta udesno za broj pozicija koji je naveden kao drugi argument
Unarni operator ~ ima najveći prioritet i desno asocijativan je. Prioritet operatora pomeranja je najveći od svih binarnih bitovskih operatora. Nakon toga sledi & koji ima veći prioritet od ^ koji ima veći prioritet od |. Ovi operatori imaju levu asocijativnost.[54]
x=5&1// 5&1=(0101)&(0001)=(0001) pa je razultat 1x=5|1// 5|1=(0101)|(0001)=(0101) pa je razultat 5x=~5// 5=0101 bitovski ~5=1010 sto je 10x=5^1// (0101)^(0001)=(0100) pa je rezultat 4x=5<<1// 5=0101 a kada 5 siftujemo za jedan ulevo dobijamo 1010 sto je 10x=5>>1// 5=0101 a kada 5 siftujemo za jedan udesno dobijamo 0010 sto je 2
Promenljive se u Javaskriptu definišu sa ključnom reči var.[55]
varx;// дефиниција променљиве x. Почетна вредност ове променљиве је недефинисана (eng. undefined).vary=2;// дефиниција променљиве у и додела вредности 2.
Komentari se u Javaskript-u pišu na sledeći na sledeći način.
// кратак коментар у једној линији./* Дугачак, документацијски коментар. Написан у више линија.*//*Коментар /* не сме бити угњежден. */Овојесинтакснагрешка*/
Za ispis teksta na ekranu, koristi se objekat console. U primeru je dato ispisivanje teksta Zdravo Svete.
console.log("Zdravo Svete.");
Iskazi if, else i else if
// if исказ се користи ради активирања одређених наредби ако је одређени услов задовољен.functionfunkcija4(){varboja=prompt("Koju boju najviše voliš?")if(boja=="rozu"){alert("Verovatno si žensko");}}// else исказ се извршава онда када if услов није задовољен.functionfunkcija2(){varbroj=prompt("Unesite bilo koji broj!")if(broj<=10){alert("Uneli ste broj manji od 10");}elsealert("Uneli ste broj veći od 10")}// else if исказ је веома користан јер дозвољава да се наведе више од једног услова.varvisitor="";if(visitor=="Drago"{document.write("Pozdrav Drado...");}elseif(visitor=="Miloje"){document.write("Pozdrav Miloje...");}elseif(visitor=="Laki"){document.write("Pozdrav Laki...");}else{document.write("Pozdrav posetioče...");}
Ovaj uzorak koda prikazuje razne Javaskript funkcije.
functionLCMCalculator(x,y){varcheckInt=function(x){if(x%1!==0){thrownewTypeError(x+" is not an integer");}returnx;};this.a=checkInt(x)this.b=checkInt(y);}LCMCalculator.prototype={constructor:LCMCalculator,gcd:function(){vara=Math.abs(this.a),b=Math.abs(this.b),t;if(a<b){t=b;b=a;a=t;}while(b!==0){t=b;b=a%b;a=t;}this['gcd']=function(){returna;};returna;},lcm:function(){varlcm=this.a/this.gcd()*this.b;this.lcm=function(){returnlcm;};returnlcm;},toString:function(){return"LCMCalculator: a = "+this.a+", b = "+this.b;}};functionoutput(x){document.body.appendChild(document.createTextNode(x));document.body.appendChild(document.createElement('br'));}[[25,55],[21,56],[22,58],[28,56]].map(function(pair){returnnewLCMCalculator(pair[0],pair[1]);}).sort(function(a,b){returna.lcm()-b.lcm();}).forEach(function(obj){output(obj+", gcd = "+obj.gcd()+", lcm = "+obj.lcm());});
Kontrole toka omogućavaju tok programa željenom putanjom u skladu sa određenim uslovima.
Osnovne kontrole toka u Javaskriptu su veoma slične osnovnim kontrolama toka u višim programskim jezicima. Osim njih, postoje i kontrole toka specifične samo za Javaskript jezik.
Omogućava izvršavanje određenog bloka instrukcija, ako je zadati uslov ispunjen.[56]
Sintaksa:if(logičkiizraz)blok1;[elseblok2;]
if...else naredba je proširenje if naredbe. If naredba omogućuje izvršavanje nekog koda ukoliko je uslov zadovoljen, a ukoliko nije neće se izvršiti ništa.[56]
Ako se želi napisati da ukoliko uslov u if izrazu nije zadovoljen, da se izvrši neki drugi kod onda koristi se if...else naredba. Višestruke if…else naredbe se mogu ugnezditi, da bi se napravila else if naredba.[56]
Switch naredba upoređuje izraz u zagradi sa vrednostima u slučajevima, ako je izraz jednak nekoj od vrednosti u slučaju tada se izvršavaju naredbe u okviru njega.[57]
Sintaksa:logičkiIzraz?izraz1:izraz2;
gde je izraz logički_izraz bilo koji izraz čiji rezultat je vrednost logičkog tipa. Ako je rezultat izraza true, onda se izvršava izraz1, u suprotnom izraz2.
Sintaksa:switch(izraz){casevrednost1://Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu1[break;]casevrednost2://Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu2[break;]casevrednost3://Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu3[break;]...casevrednostN://Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscuN[break;]}
Do...while naredbom se kreira petlja koja izvršava naredbe dok je uslovna naredba tačna. Uslov se testira nakon izvršenja naredbe, što znači da se naredba mora izvršiti bar jednom.[58]
For ciklus se zapisuje tako da se iza ključne reči for, zapišu u zagradama tri opciona izraza međusobno odvojena tačka-zarezom, a iza njih naredba koja čini telo petlje.[60]
Izraz1 se tipično koristi za inicijalizaciju brojača, izraz2 za uslov, a izraz3 za inkrementaciju.
Naravno ovi izrazi su opcioni, tako da se mogu i izostaviti u zavisnosti od problema.
Koristi se za obilazak iterabilnog objekta (uključujući niz, mapu, string…), pozivajući posebnu iteraciju i izvršavajući naredbe za svaki član objekta.[62]
Ova naredba zaustavlja izvršavanje petlje na trenutnoj iteraciji i nastavlja njeno izvršavanje na sledećem iteriranom elementu[64]
Sintaksa:continue[labela];
Labela opciona i vezana sa labelom naredbi u petlji. Continue naredba ne zaustavlja izvršavanje kao break već u slučaju while petlje proverava ponovo uslov, a u slučaju for petlje ide na naredbu iteracije.
Klase su posebne “funkcije” koje se definišu u telu programa. Jedan od načina definisanja klase je korišćenjem deklaracije klase. Da bi se deklarisala klasa koristi se ključnu reč class nakon čega sledi ime klase, zatim u zagradama telo klase.[67]
Glavna razlika između deklaracije funkcije i deklaracije klase je u tome što klasu mora prvo da se deklariše pa onda da joj pristupimo, inače će se javiti greška (Reference Error). Klase, kao i funkcije, mogu biti anonimne. Znači, moguće ih je navesti i bez konkretnog naziva, kao i praviti referencu na klasu.
Takođe, klase je moguće i prosleđivati kao parametar ili vraćati kao vrednost funkcije. Funkcija koja prima klasu kao parametar, onda kreira novu klasu koja nasleđuje zadatu klasu i koju onda vraća bi izgledala ovako:
Ukratko, geteri i seteri su funkcije koje služe za napredno definisanje svojstva. One praktično predstavljaju „prvu liniju odbrane” svojstva, tačnije sprečavaju programere da pristupaju svojstvima kao „golim” podacima.[67]Geter je funkcija koja obezbeđuje čitanje svojstva. Šta god da radi, na kraju mora pomoću direktive return da vrati vrednost koja onda predstavlja vrednost svojstva.[67] Slično, seter je funkcija koja se poziva kada se zadaje vrednost svojstva. Ova funkcija mora imati jedan parametar koji predstavlja zadatu vrednost.[67] Negde „u pozadini” se ta vrednost beleži - najčešće u nekom svojstvu objekta, koje se ne „eksponira”. Naravno, Javaskript nema mehanizam kojim bi se svojstvo zaista sakrilo, tako da je u pitanju prosto konvencija - dogovor.
Objekti u Javaskriptu imaju ugrađeni mehanizam nasleđivanja kroz takozvano prototipsko nasleđivanje. To je poseban stil objektno-orijentisanog programiranja koji čak nije ni jedinstven za Javaskript. Prototipsko nasleđivanje se zasniva na delegiranju. Svaki objekat ima svoja svojstva i metode, ali i posebnu vezu ka roditeljskom objektu koji onda predstavlja njegov prototip od koga nasleđuje svojstva i metode. Suvišno je reći - i taj roditeljski objekat takođe ima svoj prototip i tako dalje. Kada se pristupa npr. određenom metodu objekta, ako ga objekat nema, on se „traži” u njegovom prototipu, pa u prototipu prototipa i tako sve do kraja lanca.[68]
Konstruktor je posebni metod koji se koristi da bi se inicijalizovao objekat kreiran u klasi. U klasi može postojati samo jedan konstruktor inače program će javiti da postoji greška.
Osnovni domen primene Javaskript programskog jezika jeste veb programiranje. Pre nego što pregledač učita stranicu, mora da napravi DOM i CSSOM stabla. Pregledač analizira fajl, zapravo analizira bajtove i od njih pravi karaktere, zatim grupisanjem karaktera pravi tokene, od tokena čvorove, a od čvorova objekte.[69] HTML etikete se transformišu u Objektni model dokumenta (DOM), a CSS etikete u CSS objektni model (CSSOM). DOM i CSSOM su nezavisne strukture i njihovim spajanjem nastaje render drvo, koje se zatim koristi za izračunavanje osobina svakog vidljivog elementa, npr. veličina elementa, boja pozadine itd. Optimizacija svakog od ovih koraka je od ključne važnosti za postizanje optimalnih performansi pregledanja. DOM opisuje sadržaj, a CSSOM opisuje stil koji se primenjuje. Render drvo sadrži samo čvorove potrebne za prikazivanje stranice i vodi računa o rasporedu i tačnoj veličini svakog objekta.[70] Prilikom kreiranja render stabla, pregledač otprilike radi sledeće:
Kreće od korena DOM stabla i posećuje svaki vidljivi čvor
Neki čvorovi nisu vidljivi (npr. skript etiketa, meta tagovi itd.) i njih ne prikazuje u DOM drvetu jer nisu vidljivi na stranici
Neki čvorovi su sakriveni preko CSS-a (display: none) i oni se, takođe, ne prikazuju u DOM drvetu
Za svaki vidljivi čvor pregledač pronalazi odgovarajuća CSSOM pravila i primenjuje ih
Prikazuje vidljive čvorova sa sadržajem i stilizuje ih[70]
Pregledač stranu koju treba da prikaže tretira kao document, i elementima DOM stabla može se pristupiti pomoću document.getElemenstByTagName(). Metod .getElementsByTagName() vraća niz elemenata sa tagom koji mu prosledimo. Slični metodi su .getElementById(), .getElementsByClassName() i .getElementsByName(). Od prethodne verzije JS elementima je moguće pristupiti pomoću document.querySelector() koji dohvata samo prvi element koji se podudara sa prosleđenim CSS selektorom ili document.querySelectorAll() koji dohvata sve elemente koji se podudaraju sa prosleđenim selektorom. Ukoliko se želi da se dođe do HTML sadržaja nekog elementa, to radimo pomoću metoda .innerHTML.
Pomoću metoda .textContent ispisuje se tekstualni sadržaj nekog elementa, a novi element se pravi pomoću .createElement(). Na primer:
varp=document.createElement("p");//atributu title dodeljujemo vrednost Napravljen pomocu JS-ap.setAttribute("title","Napravljen pomocu JS-a");//pravimo cvor koji sadrzi Zdravo svimavartext=document.createTextNode("Zdravo svima");//da bi ovaj cvor bio vidljiv potrebno je da ga nadovezemo na pp.appendChild(text);//medjutim, ovo i dalje nije vidljivo jer nismo sve to nadovezali na bodydocument.body.appendChild(p);
Pomoću ovog mehanizma mogu se kreirati svi elementi (npr. neuređenu/uređenu listu), ali sve to se može uraditi i samo pomoću HTML-a i CSS-a. Ono što Javaskript razlikuje od HTML-a i CSS-a jeste činjenica da JS podržava i akcije, odnosno, događaje koji se realizuju kada se klinke ne neki element ili se stranica zatvori itd. To je pokazano na sledećem primeru:[71]
<!DOCTYPEhtml><html><head><title>Pridruživanjedogađaja</title><metacharset='UTF-8'><styletype='text/css'>.dugme{width:200px;height:50px;line-height:50px;text-align:center;background-color:green;color:white;}.dugme:hover{cursor:pointer;background-color:blue;}</style></head><body><inputtype='button'id='dugme'value='klik za pregled poruke'onclick='prikazi_poruku()'><br/><br/><divclass='dugme'id='moderno_dugme'>klikzapregledporuke</div>;<br/><!--thisprilikomovognavodjenjapredstavljaceoinputelementpasemozepristupitisvimnjegovimsvojstvima-uovomslucajusefunkcijiprikaziprosledjujetekucitekstualnisadrzajelementa-->Unesitetekst(kadaelementizgubifokusprikazacesenjegovsadrzaj):<br/><inputtype='text'id='unos1'onblur='prikazi(this.value)'><br/>/*Preporuka je da script tag uvek pisemo na kraju body sekcije jer zelimo da imamo DOM drvo u celosti kreirano pre nego sto izvrsimo neke manipulacije*/<scripttype='text/javascript'>/* Ovakav nacin pridruzivanja podrazumeva postojanje odgovarajućih atributa na nivou elementa. Neki od atributa koji postoje su: onclick - definiшe sta se dogadja kada korisnik klikne na povrsinu elementa onchange - definise sta se dogadja kada korisnik promeni vrednost npr. input elementa ili select elementa onfocus - definise sta se dogadja kada element dobije fokus (kada se korisnik pozicionira bilo misem bilo tab tasterom na ovo polje) onblur - definise sta se dogadja kada element izgubi fokus onhover - definise sta se dogadja kada se predje preko povrsine elementa onkeydown - definise sta se dogadja kada korisnik pritisne taster na tastaturi (spust tastera) onkeyup - definise sta se dogadja kada korisnik pusti pritisnuti taster na tastaturi ..... ..... */functionprikazi_poruku(){//window je objekat koji predstavlja ceo prozor pregledacawindow.alert("Poruka!");}/* Ovakav nacin pridruzivanja zahteva pristup elementu i definisanje odgovarajuceg svojstva - vrednost svojstva je funkcija pa postojanje omotaca sprecava da se funkcija izvrsi odmah nakon pridruzivanja */varmoderno_dugme=document.querySelector('#moderno_dugme');moderno_dugme.onclick=function(){window.alert("Poruka!");}functionprikazi(tekst){window.alert("Novi sadrzaj je: "+tekst);}</script></body> </html>
U nastavku slede neki jednostavniji primeri primene JSa kroz veb programiranje.[72]
<!DOCTYPEhtml><html><head><title>Kalkulator</title></head><body>a:<inputtype="text"id="a"onkeyup="izracunaj()"><br/>b:<inputtype="text"id="b"onkeyup="izracunaj()"><br/>rez:<outputid="rez"for="a b"></output><br/><!--Inacin:<inputtype="button"value="+"onclick="izracunaj('+')"><inputtype="button"value="-"onclick="izracunaj('-')"><inputtype="button"value="*"onclick="izracunaj('*')"><inputtype="button"value="/"onclick="izracunaj('/')"><inputtype="button"value="koren"onclick="izracunaj('koren')">--><!--IInacin:--><selectid="operacija"onchange="izracunaj()"><optionvalue="+">+</option><optionvalue="-">-</option><optionvalue="*">*</option><optionvalue="/">/</option><optionvalue="koren">koren</option></select><br/><spanid="greska"></span><scripttype="text/javascript">functionizracunaj(){vara=document.getElementById("a");varb=document.getElementById("b");varop=document.getElementById("operacija").valuevarrez=document.getElementById("rez");varerr=document.getElementById("greska");a1=parseInt(a.value);b1=parseInt(b.value);if(isNaN(a1)||isNaN(b1)){if(isNaN(a1))a.focus();elseb.focus();err.textContent="Neispravni argumenti!";return;}else{switch(op){case'+':rez.value=a1+b1;break;case'-':rez.value=a1-b1;break;case'*':rez.value=a1*b1;break;case'/':if(b1==0){err.textContent="Deljenje nulom!";b.focus();return;}elserez.value=(a1/b1).toPrecision(2);break;case'koren':if(a1<0){err.textContent="Vrednost ne sme biti negativna!";a.focus();return;}elserez.value=Math.sqrt(a1);break;}}err.innerHTML="Sve je ok!";}</script></body></html>
<!DOCTYPEhtml><html><head><title>Godisnjadoba></title><styletype="text/css">img{height:200px;width:200px;}</style></head><body><imgsrc='prolece.jpg'alt="prolece"><br/><inputtype="button"value="napred"onclick="napred()"><inputtype="button"value="nazad"onclick="nazad()"><inputtype="button"value="start slideshow"onclick="slideshow()"id="slide"><scripttype="text/javascript">window.slike=newArray("prolece.jpg","leto.jpg","jesen.jpg","zima.jpg");//ovo je globalnovari=0;//ovo je takodje globalnovarelem=document.getElementsByTagName("img")[0];vartimer;functionnapred(){i=(i+1)%slike.length;elem.src=slike[i];elem.alt=slike[i];}functionnazad(){if(i-1==-1)i=slike.length-1;elsei=i-1;elem.src=slike[i];elem.alt=slike[i];}functionslideshow(){timer=setInterval("napred()",1000);varelem=document.getElementById("slide");elem.value="stop slideshow";elem.onclick=stopslideshow;}functionstopslideshow(){clearInterval(timer);varelem=document.getElementById("slide");elem.value="start slideshow";elem.onclick=slideshow;}</script></body></html>
<!DOCTYPEhtml><html><head><metacharset='UTF-8'><title>Pogadjanjereci</title></head><body>trenutnarec:<br/><inputtype="text"id="trenutnaRec"><br/>slovo:<br/><inputtype="text"id="slovo"><br/>brojpokusaja:<br/><inputtype="text"id="brojPokusaja"readonly><br/><inputtype="button"value="zameni"onclick="zameni()"id="zameni"><scripttype="text/javascript">window.tacnaRec="programiranje";window.trenutnaRecNiz=newArray();for(vari=0;i<window.tacnaRec.length;i++)window.trenutnaRecNiz[i]="*";document.getElementById("trenutnaRec").value=window.trenutnaRecNiz.join("");window.brojPokusaja=0;document.getElementById("brojPokusaja").value=window.brojPokusaja;window.brojPogodaka=0;functionzameni(){varslovo=document.getElementById("slovo").value.trim();//izdvajamo slovo i usput izbaucjemo vodece belineif(slovo.length!=1){window.alert("Morate uneti slovo!");return;}for(vari=0;i<window.tacnaRec.length;i++){if(window.tacnaRec.charAt(i)==slovo){window.trenutnaRecNiz[i]=slovo;window.brojPogodaka++;}}window.brojPokusaja++;document.getElementById("trenutnaRec").value=window.trenutnaRecNiz.join("");document.getElementById("brojPokusaja").value=window.brojPokusaja;document.getElementById("slovo").value="";if(window.brojPogodaka==window.tacnaRec.length){window.alert("Cestitamo!");return;}if(window.brojPokusaja>8){window.alert("Potrosili ste sve pokusaje.");document.getElementById("zameni").disabled=true;return;}}</script></body></html>
Neke Javaskript biblioteke:
jQuery - biblioteka čija je svrha da olakša upotrebu Javaskripta na veb stranicama. Slogan ove biblioteke je „piši manje, uradi više”
AJAX (asynchronous JavaScript and XML) - grupa međusobno povezanih tehnika za razvoj veba korišćenih na klijentskoj strani za pravljenje sinhronih i asinhronih veb aplikacija
Angular JS - strukturalni okvir za kreiranje dinamičkih veb stranica
Modernizr - Javaskript biblioteka koja detektuje „Html5” i Css3 svojstva u korisničkom brauzeru.
Najčešća upotreba Javaskript-a je dodavanje dinamičnosti HTML stranicama na klijentskoj strani. Skripte se uključuju u HTML stranice i vrše interakciju sa objektnim modelom dokumenata (engl. Document Object Model). Neki od primera upotrebe Javaskript-a su:
Učitavanje određenog dela stranice ili dostavljanje podataka serveru preko AJAKSA (engl. AJAX) bez ponovnog osvežavanja cele stranice (na primer društvena mreža vam omogućava ažuriranje novog statusa bez osvežavanja cele stranice).
Animiranje elemenata na stranici, čineći ih vidljivim i nevidljivim, menja elementima veličinu, pomera njihov sadržaj.
Validacija unetog sadržaja unutar formi, kako bi bili sigurni da su ispravni podaci poslati serveru.
Internet pretraživač je najčešće okruženje za izvršavanje Javaskript koda. Internet pretraživači obično prave host objekte za predstavljanje objektnog modela dokumenata u Javaskript-u. Pored internet pretraživača, Javaskript kod se može izvršiti i na serveru.[73]
Ispod je minimalistički primer internet stranice koja koristi Javaskript i objektni model dokumenata.
<!DOCTYPE html><html><metacharset="utf-8"><title>Minimal Example</title><body><h1id="header">Ovo je Javaskript</h1><script>document.body.appendChild(document.createTextNode('Zdravo Svete!'));varh1=document.getElementById('header');h1=document.getElementsByTagName('h1')[0];</script><noscript>Vaš pretraživač ne podržava Javaskript ili je trnutno isključen.</noscript></body></html>
S obzirom da Javaskript kod može da se izvrši u različitim okruženjima, važan deo testiranja koda je i provera da li Javaskript kod radi na više različitih pretraživača.
Interfejs objektnog modela dokumenata za manipulaciju sa internet stranicama nije deo Ekmaskript standarda odnosno samog Javaskript-a, već je definisan posebnim standardom. U praksi, implementacija internet pretraživača se razlikuje u standardima, i samim tim ne izvršava svaki pretraživač Javaskript kod isto.
Da bi se ove razlike anulirale, Javaskript programeri mogu da pokušaju da napišu kod koji će se u većini pretraživača izvršavati isto. Ako se ne izvrši, moguće je napisati kod koji proverava prisustvo određenih funkcija pretraživača.[74] U nekim slučajevima, dva pretraživača mogu izvršiti istu funkciju ali sa različitim ishodom. Tako da programer može praktično otkriti šta pretraživač radi i shodno tome izmeniti svoju skriptu kako bi je pretraživač izvršio na odgovarajući način.[75][76]
Osim toga, skripte ne mogu da rade za određene korisnike. Na primer korisnik može da:
Koristi stari ili redak internet pretraživač sa nepotpunom ili neobičnom podrškom za objektni model dokumenata.
Koristi PDA (engl. personal digital assistant) ili pretraživač na mobilnom telefonu koji ne može da izvrši Javaskript kod.
Da ima onemogućeno izvršavanje Javaskript-a kao meru predostrožnosti.
Kako bi pomogli ovim korisnicima, programeri mogu da naprave internet stranice koje degradiraju pretraživače da ne koriste Javaskript. Konkretno, strana bi trebalo da ostane upotrebljiva bez dodatnih elemenata Javaskript-a. Alternativni pristup rešavanju ovog problema jeste da prvi autor sadržaja koristi osnovne tehnologije koje rade u svim pretraživačima, a zatim poboljša sadržaj namenjen korisnicima koji podržavaju Javaskript. Ovo je poznato kao progresivno poboljšanje.
Javaskript je prvobitno razvijen 1996. godine radi korišćenja u veb pretraživaču Netskejp navigator. Iste godine Majkrosoft je predstavio implementaciju Internet eksplorera. Ona je nazvana JSkript zbog problema sa autorskim pravima. Godine 1997. je predstavljena prva standardizovana verzija jezika pod nazivom EKMASkript u okviru prvog izdanja standarda EKMA-252. Eksplicitno verzionisanje i uključivanje novih komponenti jezika je bilo karakteristično samo za Mozilu i kasnije je napušten ovaj princip. Fajerfoks 4 je poslednja verzija ovog pretraživača koja je bila vezana za verziju Javaskripta (1.8.5). Sa novim verzijama EKMA-262 standarda, komponente Javaskript jezika se pominju zajedno sa početnom definicijom EKMA-262 izdanja.
Sledeća tabela se zasniva na informacijama iz više izvora.[77][78][79]
Shelly, Gary B.; Cashman, Thomas J.; Dorin, William J.; Quasney, Jeffrey J. (2000). JavaScript: Complete Concepts and Techniques. Cambridge: Course Technology. ISBN978-0-7895-6233-3.
Vander Veer, Emily A. (2004). JavaScript For Dummies (4th izd.). Wiley Pub. ISBN978-0-7645-7659-1.