Professional Documents
Culture Documents
Java Script
Java Script
Java Script
Komentari
Java Script komentari predstavljaju isto što i komentari u drugim programskim jezicima,
mehanizam pomoću koga linije koda koje ne želimo da se posmatraju kao JS kod pretvaramo u
komentare ili koristimo sa opisivanje koda kako bismo kasnije mogli da ga razumemo.
Osnovni Java Sckript komentar je jednolinijski komentar. To je linija teksta ili kod koji počinje sa
dve kose crte u napred //. Sve što sledi posle njih pa do kraja linije neće se posmatrati kao JS kod,
već kao komentar.
Primer:
// ova linija teksta predstavlja jednolinijski komentar
Pored ove vrste komentara postoje i višelinijski komentari. To su komentari pomoću kojih više
linija koda ili teksta pretvaramo u komentare. Sav tekst/kod koji počinje sa /* i završava se sa */
predstavlja višelinijski komentar, kod napisan između ili tekst se neće posmatratio kao JS kod već
će biti prilikom izvršavanja JS preskočen.
Primer:
/*
ova linija teksta
predstavlja višelinijski
komentar
*/
Prilikom upotrebe komentara treba napomenuti da se komentari mogu koristiti unutar linije
koda, i to tako što se navode posle naredbe.
Primer:
alert("Zdravo svete“); // komentari se mogu staviti pri kraju linije
Kod gore prikazanog primera deo alert("Zdravo svete“); posmatra se kao JavaScript kod, dok sve
što sledi nakon // predstavlja deo komentara i ne posmatra se kao JS kod. Funkcija alert će kasnije
biti objašnjena i na nju u ovom trenutku ne treba obraćati pažnju.
Promenljive
Java Script promenljive se deklarišu sa var rezervisanom reči. Prilikom deklaracije promenljive ne
navodi se tip promenljive, zato što u JS ne postoje tipovi promenljivih. Sve promenljive su var
tipa, odnosno mogu da čuvaju u sebi bilo koji tip podataka. Pisanje rezevisane reči var prilikom
deklaracije promenjive nije obavezno. Međutim, u tom slučaju treba biti oprezan, zato što može
da dođe do neželjenih rezultata. Prilikom deklarisanja promenljivih treba znati da postoje dva
opsega promenljivih: lokalni i globalni. Lokalno deklarisana promenljiva živi, odnosno postoji,
samo unutar njenog opsega vidljivosti i to tek nakon linije njene deklaracije. Primer lokalnog
opsega bi bila promenljiva deklarisana unutar funkcije. Globalno deklarisana promenljiva vidljiva
je dok postoji program. To je promenljiva koja je deklarisana van bilo koje funkcije, nema svoj
opseg. Ukoliko se prilikom deklarisanja promenljive izostavi rezervisana reč var pokušava se da
pronađe promenljiva za istim identifikatorom kroz sve slojeve sve do globalnog sloja (opsega
vidljivosti). Ukoliko se prilikom pretrage ne pronađe promenljiva sa istim identifikatorom ,
promenljiva se deklariše sa globalnim opsegom viljivosti. Deklarisanje promenljivih istog
identifikatora (imena) unutar lokalnog i globalnog opsega vidljivosti može dovesti do
neočekivanih rezultata o čemu će malo kasnije biti reči unutar ovog dokumenta.
Primer:
<script> <script>
var i = 4; i = 4;
var j = 6; j = 6;
var n = i + j; n = i + j;
</script> </script>
Gore prikazani primeri, sa i bez upotrebe rezervisani reči var, su isti. Biće deklarisane tri
promenljive, pri čemu promenljive i i j se definišu sa sadržajima 4 i 6, a promenljiva n sa sadržajem
izraza i + j. Nakon izvršavanja ovog izraza promenljiva n će u oba slučaja u sebi čuvati celobrojnu
vrednost 10. Sve tri promenljive će biti tipa number.
Primer:
<script> <script>
var ime = "Imenković"; ime = "Imenković";
var prezime = "Prezimenković"; prezime = "Prezimenković";
var spojeno = ime + prezime; spojeno = ime + prezime;
</script> </script>
Promenljive ime, prezime i spojeno biće tipa string. Promenljiva spojeno u sebi će čuvati string
ImenkovićPrezimenković.
Globalne promenljive su promenljive kojima se može pristupiti sa bilo koje tačke unutar
programa. Generalno, trebalo bi izbegavati deklarisanje promenljivih sa globalnim opsegom
vidljivosti uvek ako se isti posao može obaviti upotrebom lolanih promenljivih, zato što to može
dovesti do problema preklapanja. Takve promenljive su teške za razumevanje i debagovanje.
Primer:
<script>
function saberiDvaBroja(prvi, drugi){
p = prvi;
return p + drugi;
}
Prvi test koji je napisan je pokušaj čuvanja povratnog sadržaja funkcije saberiDvaBroja u
promenlivu broj1, u nju će biti sačuvan broj 7. U promenljivu broj2 će biti sačuvan sadržaj
globalne promenljive p, i to je broj 3. Promenljiva p je deklarisana kao globalna prilikom prvog
poziva njenog opsega vidljivosti, to je poziv funkcije saberiDvaBroja, i tom prilikom je definisana
sa sadržajem prvog parametra ove funkcije čiji je identifikator prvi. Sledeći poziv funkcije
saberiDvaBroja će svom pozivaocu, promenljivoj broj3, vratiti povrati sadržaj 3 koji predstavlja
zbir prosleđenih brojeva (1 i 2). Promenljivoj broj4 biće dodeljen sadržaj broj 1, zato što je kod
drugog poziva sadržaj globalne promenljive p 3 pregažen sa novim sadržajem, i to sa vrednosti
prosleđenog prvog parametra drugog poziva funkcije (prosleđeno je 1 i 2).
Primer:
<script>
function saberiDvaBroja(prvi, drugi){
var p = prvi;
return p + drugi;
}
Ovaj primer prijaviće grešku zato što je promenljiva p za razliku od prethodnog primera
deklarisana upotrebom rezervisane reči var. Kao takva ona predstavlja lokalnu promenljivu sa
opsegom vidljivosti funkcije saberiDvaBroja. Odnosno, njen sadržaj se može pročitati/promeniti
samo unutar funkcije. Svaki pokušaj čitanja/menjanja sadržaja spolja prouzrokovaće grešku, tip
greške je prikazan u nastavku.
Null i Undefine
Primer:
<script>
var val1 = null;
if( !val1 ){ // proverava se da li je sadržaj val1 jednak false
document.write("promenljiva <b>val1</b> je false <br>");
}
</script>
Za sad ne treba obraćati pažnju na poziv sistemske funkcije document.write(...) jer će ona kasnije
biti objašnjena.
Primer:
<script>
var val2 = 1;
if( val2 ){ // proverava se da li val2 ima vrednost
document.write("promenljiva <b>val2</b> ima vrednost");
}
</script>
Tip undefine predstavlja nedefinisan, odnosno nepoznat sadržaj. Vraća se kad se pokuša da
pozove svojstvo objekta koji ne postoji. Kao prilikom rada sa null vrednostima, prilikom provere
sadržaja promenljive koja ima undefine sadržaj, u boolean izrazima on se prevodi kao false.
Primer:
<script>
var value;
document.write(value + "</br>");
if( !value ){
document.write("Promenljiva value je bez sadržaja </br>");
}
// pravljenje objekta Osoba koji
// u sebi ima samo jedno svojstvo - ime
var Osoba = {
ime: "Imenković"
}
document.write("Svojstvo age objekta Osoba ne postoji: " + Osoba.age);
</script>
Kasnije u dokumentu biće razmatran rad sa objektima.
Objekti
Polako smo došli do objekata... Prilikom rada sa Java Script jezikom treba znati da je skoro sve u
JS objekat, osim jednostavnih tipova podataka kao što su: stringovi (tip string), brojevi (tip
number), bulean (tip boolean), odustvo vrednosti (tip null), i nepoznati sadržaj (tip undefine).
Kada se radi sa objektima u JS treba ih posmatrati kao kolekcije svojstava. Sadržaj svojstva može
biti bilo kog tipa, i objekat može imati svojstava koliko je potrebno.
U JS objekti se deklarišu navođenjem rezervisane reči var (nije obavezna, važe ista pravila kao za
promenjive) nakon čega sledi identifikator objekta. Telo objekta se definiše sa parom vitičastih
zagrada {} unutar koji se navodi lista svojstava. Prilikom definisanja sadražaja nekog svojstva
nakon identifikatora svojstva mora se staviti : , zato što ona razdvaja svojstvo od njenog sadržaja.
Svojstvo sa svojim sadržajem se od drugih svojstava sa svojim sadržajima unutar istog objekta
razdvajaju zarezom , čije pisanje je obavezno.
Primer:
<script>
// prazan objekat
var prazanObjekat = {};
document.write(prazanObjekat.toString() + "</br>");
</script>
Postoji više načina za pravljenje objekata koje JS nudi. Jedan od načina je pravljenje praznog
objekta i to se postiže sledećom linijom koda:
var prazanObjekat = {}
Zato što se ništa ne nalazi između vitičastih zagrada biće napravljen prazan objekat, objekat bez
i jednog svojstva. Prilikom ispisa sadržaja objekta podrazumevano ponašanje je pozivanje
toString metoda, ne mora ekpislicitno da se naglasi. Zbog tog ponašanja naredne dve linije koda
su iste.
document.write( prazanObjekat );
document.write( prazanObjekat.toString() );
Postoji alternativni način pravljenja objekta koji podrazumeva pravljenje objekta sa naknadnim
dodavanjem svojstava.
var Osoba = {
ime: "Ivan",
prezime: "Ivanović",
godina: 23
}
Sadržaju svojstva nekog objekta pristupa se pomoću operatora tačka . - kao u OOP C++, Java, C#...
Rezervisana reč this predstavlja objekat za koji se nadjačava funkcija. Red koda this.ime znači
pristupi sadržaju svojstva this objekta.
Napravljeni objekat Lice sastoji se iz svojstva osoba kome je dodeljen predefinisan sadržaj
promenljive Osoba, i svojstva adresa koje predstavlja objekat koji se sastoji iz svojstva ulica i broj
sa svojim predefinisanim sadržajima.
Jednakost (Equality)
U Java Script-u postoje dva operatora za proveru jednakosti == i ===. Ponašanje ovih operatora
je različito ako su operandi primarnog tipa ili ako su u pitanju objekti. Ako su operani objekti oni
su jednaki jedno sami sebi, dok ako su operandi primarnog tipa oni su jednako ako su vrednosti
jednake.
Primer:
<script>
document.write("------------ ''pas === ''pas'' -------------</br>");
if("pas" === "pas")
document.write("String ''pas'' je jednak stringu ''pas'' </br>");
else
document.write("String ''pas'' nije jednak stringu ''pas'' </br>");
Razlika između operatora == i === je u tome što operator == vrši konverziju što može dovesti do
neželjenih rezultata. Zbog toga bi trebalo izbegavati upotrebu != i ==, i umesto njih koristiti !== i
===.
Upotreba operatora == u izrazu 1 == "1" vratiće true, zato što će izvršiti konverziju broja 1 u string
koji se sastoji iz jednog karaktera "1", i nakon izvršene konverzije zapravo će se izvršiti izraz za "1"
== "1".
Primer:
<script>
var Osoba_1 = {
ime: <script>
var Osoba_1 = {
ime: "Ivan",
prezime: "Ivanović",
godina: 23
}
var Osoba_2 = {
ime: "Ivan",
prezime: "Ivanović",
godina: 23
}
// različiti objekti nisu jednaki čak i ako imaju iste vrednosti sadržaja
// jer su to u pitanju različiti objekti
document.write("Osoba_1 == Osoba_2: " + (Osoba_1 == Osoba_2) + " </br>");
document.write("Osoba_1 === Osoba_2: " + (Osoba_1 === Osoba_2) + " </br></br>");
// provera da li su različiti
document.write("Osoba_1 != Osoba_1: " + (Osoba_1 != Osoba_1) + " </br>");
document.write("Osoba_1 !== Osoba_1: " + (Osoba_1 !== Osoba_1) + " </br></br>");
Kao što je ranije rečeno objekti su jedno jednaki sami sebi, dok različiti objekti iako imaju iste
nazive svih svojstava i njihove sadržaje oni nisu jednaki jer su to zasebni objekti.
Funkcije
Funkcije u Java Scriptu se ponašaju drugačije od funkcija u drugim programskim jezicima kao što
su C, C++, Java, C#... Zbog toga da bi mogli ispravno da se koriste trebalo bi prvo razumeti neke
stvari.
Java Script nudi više pristupa za deklarisanje funkcija koje će biti prikazane u nastavku ovog
poglavlja.
Malo ranije u ovom dokumentu je rečeno da je u javi skoro sve objekat. To je tačno jer su čak i
funkcije objekti.
Funkcije ćemo razmatrati na jednom veoma jednostavnom primeru - funkciji koja kao povrati
sadržaj vraća za prosleđeni broj njegov kvadrat.
<script>
function brojNaKvadrat(x){
return x * x;
};
document.write( brojNaKvadrat( 5 ) );
</script>
Funkcije uvek počinju sa rezervisanom reči function, zatim sledi identifikator funkcije koji je
opcionog karaktera. Ukoliko se ne navede pravi se anonimna funkcija - funkcija bez identifikatora.
Nakon identifikatora između običnih zagrada ( ) navodi se nula ili više parametara, i nakon toga
telo funkcije koje počinje sa otvorenom vitičastom zagradom i koje se završava sa zatvorenom
vitičastom zagradom. Reč return je opcionog karaktera. Rezervisana reč return se ne navodi
ukoliko nije potrebno da funkcija vrati sadrža svom pozivaocu. Na primer:
<script>
function brojNaKvadrat(x){
document.write( x * x );
};
brojNaKvadrat( 5 );
</script>
Gore prikazana deklaracija funkcije predstavlja standardnu deklaraciju funkcije. U nastavu je dat
primer deklarisanja iste funkcije sa identifikatorom i njene dodele promenljivoj.
<script>
var kvadratFunkcija = function brojNaKvadrat(x){
return x * x;
};
</script>
Ovako deklarisana funkcija ne može se pozvati preko svog identifikatora, već mora preko
promenljive.
document.write( brojNaKvadrat(5) );
Ovako pozvana funkija brojNaKvadrat nije ispravna jer se mora pozvati preko svoje promenljive
kojoj je dodeljena.
document.write( kvadratFunkcija(5) );
Ako se funkcije deklarišu na ovaj način onda može da se izostavi njen idetifikator, zato što se
može pozvati preko promenljive kojoj je dodeljena.
<script>
var kvadratFunkcija = function (x){
return x * x;
};
document.write( kvadratFunkcija(5) );
</script>
Anonimne funkcije se mogu odmah pozvati tako što se njihova deklaracija smesti unutar para
običnih zagrada, a nakon zatvorene obične zagrade unutar para novih obinih zagrada prosledi
lista parametara.
<script>
( function (x){
document.write( x * x );
} ) (5) ;
</script>
Kad se funkciji prosleđuju parametri treba znati da se primitivni tipovi uvek prosleđuju po
vrednosti, dok se objekti uvek prosleđuju po referenci.
<script>
// primitivni tipovi se uvek prenose po vrednosti
var value = "Kurs iz JS";
function obrniKaraktere(temp){
temp = temp.split('').reverse().join('');
return temp;
}
<script>
function prebrojKaraktere1(){
document.write( arguments.length + "</br>");
}
function prebrojKaraktere2(){
document.write( arguments[0].length + "</br>");
}
function suma(){
var ukupno = 0;
for(var i = 0; i < arguments.length; ++i){
ukupno += arguments[i];
}
return ukupno;
}
prebrojKaraktere1();
prebrojKaraktere1(1);
prebrojKaraktere1(1, 2, 3);
prebrojKaraktere1(23, 3442, "a", 4234, "sdadas", 23.01);
prebrojKaraktere2("abcd");
prebrojKaraktere2("abc453d", 23, "rt");
Java Script funkcije podržavaju rekurziju. Rekurzija predstavlja funkciju koja poziva samu sebe. U
tako napisanim funkcijama veoma je važno napisati kod koji će predstavljati siguran izlaz iz
rekurzije jer u suprotnom može da dođe do prenapunjena memorije steka što dovodi do greške.
U nastavku je dan primer funkcije koja upotrebom rekurzije izračunava faktorijel broja 5.
Faktorijel nekog broja su sve cifre pomnožene međusobno. Fakotrijel broja 5 je: 1 * 2 * 3 * 4 * 5
<script>
function faktorijel(n){
if(n === 0 || n === 1){
return 1;
}
return n * faktorijel(n - 1);
}
document.write( "Faktorijel broja 5 je: " + faktorijel(5) );
</script>
Blokovi
Blokovi predstavljaju načinu grupisanja više linija koda. To se postiže navođenjem linija koda
unutar para vitičastih zagrada { }. Kad se radi sa blokovima veoma je važno znati da u JS blokovi
ne predstavljaju novi opseg viljivosti za promenljive. Ovo znači da ako se deklariše promenljiva
unutar bloka da će biti viljiva i van bloka.
If blok
if ( 2 === (1+1) ){
// izvrši ovaj blok ako je uslov tačan
}
if..else blok
if ( false ){
...
}else{
// izvrši ovaj blok
}
if...else if...else blok
if ( false ){
...
}else if(true){
// izvrši ovaj blok
}else{
...
}
Switch blok
Postoji nekoliko vrsta petlji i one funkcionišu isto kao i u većini ostalih programskih jezika: for,
while, do-while.
<script>
// for petlja
// sastoji se iz 3 delja: inicijalizatora petlja, uslova,
// i inkrementatora/dekrementarotra
document.write("----- FOR PETLJA ----- </br>");
for(i = 0; i < 10; ++i){
document.write(i + "</br>");
}
// do petlja
i = 0;
document.write("----- DO PETLJA ----- </br>");
do{
document.write(i + "</br>");
++i;
}while(i < 10);
// while petlja
i = 0;
document.write("----- DO PETLJA ----- </br>");
while(i < 10){
document.write(i + "</br>");
++i;
}
</script>
JS podržava i for-in petlju koja se koristi za kretanje kroz kolekcije objekta. Slična je C# for-each
petlj, s tim što ova može da se kreće samo kroz svojstva objekta i da pročita sadržaj trenutnog
svojstva.
<script>
var Osoba = {
ime: "Ivan",
prezime: "Ivanović",
godina: 23,
pol: "Muški"
}
Obrada izuzetaka
Java Script ima u sebi ugrađen mehanizam za obradu izuzetaka try-catch-finally. Izuzetak se
ispaljuje upotrebom rezervisane reči throw. Prilikom ispaljivanja izuzetka program zaustavlja
izvršavanje u toj tački. Prilikom rada sa izuzecima može se pristupiti Excetion objektu greške. Blok
finally osigurava da će se linije koda u njemu izvršiti čak i ako dođe do greške unutar try-catch
bloka.
<script>
try{
throw{
name: "Desila se neka greška.",
message: "Grešku smo izazvali da bi testirali try-catch-finnaly"
}
}catch(e){
document.write(e.name + ": " + e.message + "</br>");
}finally{
document.write("Izvršio se finnaly blok</br>");
}
</script>
JS biblioteke
U ovom poglavlju biće obrađene ne sve već samo najčešće korišćene biblioteke u JS i neke
dodatne koje se uvoze:
- String
- Number
- Array
- Regularni izrazi
- Datumi
- Funkcije biblioteka
- Math objekat
String
JS String predstavlja primitivni tip podataka koji predstavlja uređen skup karaktera. Ne postoji
sintaksa sa pravljenje višelinijskih stringova.
JS String dozvoljava upotebu specijalnih karaktera koji počinju sa kosom crtom \ i nakon toga
sledi neki od specijalnih karaktera. Kao što je karakter n koji predstavlja prednos kursora u novi
red.
alert("Prva linija teksta\nDruga linija teksa");
Konkatenacija stringova se obavlja kao i u C# uppotrebom operatora +.
Primer:
<script>
var str = "Prva linija teksta\nNovi tekst";
alert(str);
document.write(s[0] + "</br>");
document.write(s[1] + "</br>");
document.write(s[2] + "</br>");
document.write(s[3] + "</br>");
document.write("H)9z7adfe(67guad)".toLowerCase() + "</br>");
document.write("H)9z7adfe(67guad)".toUpperCase() + "</br>");
</script>
Number
Array
Nizovi predstavljaju jednu od 2 ugrađene strukture podataka u JS. Oni predstavljaju indeksirane
kolekcije koje u sebi mogu imati sadržaje različitog tipa.
<script>
// elementi niza kreću da se indeksiraju od 0
var prazanNiz = [];
document.write("Dužina praznog niza je " + prazanNiz.length + "</br>");
slova.reverse();
document.write( slova + "</br>");
</script>