Andrise programmeerimisalane WIKI
Operaatorid
Operaatorid on erinevad sümbolid ja märgendid, mis võimaldavad JavaScripti programmil teostada mitmesuguseid tegevusi - kontrollida tingimuste vastavust, muuta väärtusi ja muud sellist. Reeglina on operaatoril kaks operandi, vasak ja parem. Näiteks a + b, kus a on operaatori + vasak operand ning b siis vastavalt parem. Eksisteerib ka kolme operandiga operaator (?:, ternaarne tingimuslause) ning ühe operandiga (-, unaarne - või ++ inkrement).
Operatsioone saab ka liita. a + b + c - sellisel juhul pole tegu mitte kolme operandiga operatsiooniga vaid kahe liidetud operatsiooniga. Pikemalt saab selle operatsiooni lahti kirjutada nii
(a + b) + c;
(kus (a+b) on esimene operatsioon ja (a + b) + c on teine operatsioon)
või
z = a + b; z + b;
Aritmeetika
+ Liitmistehe
m1 + m2; 5 + 2 // 7
Juhul kui üks liidetavatest on string, teisendatakse mõlemad operandid tekstikujule. Sellisel juhul ei liideta operandide numbrilisi väärtusi, vaid liidetakse stringid üksteise järele. Seega tuleb selle tehte juures olla ettevaatlik ning vajadusel teisendada operandid näiteks parseInt funktsiooniga eelnevalt numbriteks.
3 + 4 = 7; "3" + 4 = "34";
Üks situatsioon kus väärtus tuleks kindlasti enne numbrilisi tehteid teisendada, on andmete lugemine veebilehe vormiväljadest. Kõik vormiväljadelt loetud väärtused on alati tekstikujul ning seega nendega väärtustega liitmisel, ilma eelneva teisendamiseta, võib tekkida ootamatuid probleeme.
- - Lahutustehe
m1 - m2; 5 - 2 // 3
* - Korrutustehe
m1 * m2; 5 * 2 // 10
/ - Jagamistehe
m1 / m2; 5 / 2 // 2.5
Jagamisel nulliga ei ole tulemuseks mitte viga, vaid eritüübiline väärtus +/- Infinity (lõpmatus).
% - Jääk
Jäägioperaatorit kasutatakse järgnevalt: m1 % m2, tulemuseks on jääk muutuja m1 jagamisel muutujaga m2.
m1 % m2; 5 % 2 // 1
++ - Inkrement
Inkrement ++ suurendab operandi väärtust 1 võrra. Juhul kui operand asub operaatorist vasakul m++, on operatsiooni tagastusväärtuseks esialgne väärtus m (kõigepealt tagastatakse väärtus ja siis liidetakse muutujale 1). Juhul kui operand asub paremal, siis on tagastusväärtuseks m+1 (kõigepealt liidetakse muutujale 1 ning seejärel tagastatakse selle väärtus).
var m1 = 0; alert(m1++) // 0; alert(m1) // 1; alert(++m1) // 2;
-- - Dekrement
Dekrement -- vähendab operandi väärtust 1 võrra. Juhul kui operand asub operaatorist vasakul m--, on operatsiooni tagastusväärtuseks esialgne väärtus m. Juhul kui operand asub paremal, siis on tagastusväärtuseks m-1.
var m1 = 5; alert(m1--) // 5; alert(m1) // 4; alert(--m1) // 3;
Unaarne -
Muudab väärtuse negatiivseks.
-m1;
Omistamine
= - Väärtuse omistamine
Operaatorist vasakul olevale muutujale omistatakse operaatorist paremal asuv väärtus.
var a = 123;
Järgmised operaatorid on omistamise lühivormid operaatorist vasakul oleva muutuja suhtes.
+= - Väärtuse liitmine muutujale
x += y; x = x + y;
-= - Väärtuse lahutamine muutujast
x += y; x = x + y;
*= - Väärtuse korrutamine muutujale
x *= y; x = x * y;
/= - Väärtuse jagamine muutujast
x /= y; x = x / y;
>>= - Bittide nihutamine
Operaator nihutab bitid muutujas väärtuse võrra paremale, säilitab märgi.
x >>= y; x = x >> y;
<<= - Bittide nihutamine
Operaator nihutab bitid muutujas väärtuse võrra vasakule, säilitab märgi.
x <<= y; x = x << y;
>>>= - Bittide nihutamine
Operaator nihutab bitid muutujas väärtuse võrra paremale, vasakud bitid täidetakse nullidega.
x >>>= y; x = x >>> y;
&= - Bitioperatsioon JA (AND)
x &= y; x = x & y;
|= - Bitioperatsioon VÕI (OR)
x |= y; x = x | y;
^= - Bitioperatsioon välistav VÕI (XOR)
x ^= y; x = x ^ y;
Võrdlemine
== - Võrdne
Operatsiooni tagastusväärtus on tõene, kui operaatori mõlemad pooled on võrdsed. Juhul kui väärtused on eri tüüpi, teisendatakse kõigepealt tüübid. Kui üks operand on number või loogiline muutuja, teisendatakse operandid numbriteks. Juhul kui üks operand on string, teisendatakse ka teine stringiks.
var m1 = 5; m1 == 5 // tõene, 5 == 5 "5" == m1 // tõene, "5" == "5" m1 == '5' // tõene, "5" == "5" m1 == m1 + 0 // tõene, 5 == 5
!= - Ei ole võrdne
Operatsiooni tagastusväärtus on tõene, kui operaatori pooled ei ole võrdsed.
var m1 = 5; m1 != 5 // väär "4" != m1 // tõene m1 == '3' // tõene m1 != m1 + 2 // tõene
=== - Jäigalt võrdne
Operatsiooni tagastusväärtus on tõene, kui operaatori mõlemad pooled on võrdsed ning sama tüüpi.
var m1 = 5; m1 === 5 // tõene "5" === m1 // väär m1 === '5' // väär m1 === m1 + 0 // tõene
!== - Jäigalt mittevõrdne
Operatsiooni tagastusväärtus on tõene, kui operaatori pooled ei ole võrdsed või on eri tüüpi.
var m1 = 5; m1 !== 5 // väär m1 !== '5' // tõene
> - Suurem kui
Operatsiooni tagastusväärtus on tõene, kui operatsiooni vasaku operandi väärtus on suurem kui parema operandi väärtus.
5 > 3; // tõene 5 > 5 // väär
>= - Suurem-võrdne kui
Operatsiooni tagastusväärtus on tõene, kui operatsiooni vasaku operandi väärtus on suurem või võrdne parema operandi väärtusega.
5 >= 3; // tõene 5 >= 5 //tõene
< - Väiksem kui
Operatsiooni tagastusväärtus on tõene, kui operatsiooni vasaku operandi väärtus on väiksem kui parema operandi väärtus.
3 < 5; // tõene 5 < 5 // väär
<= - Väiksem-võrdne kui
Operatsiooni tagastusväärtus on tõene, kui operatsiooni vasaku operandi väärtus on väiksem või võrdne parema operandi väärtusega.
3 <= 5; // tõene 5 <= 5 // tõene
Loogilised operaatorid
&& - Loogiline JA (AND)
Operatsioon on tõene, kui mõlemad operandid on tõesed - sellisel juhul on tagastusväärtuseks viimase operandi väärtus.
3 && 5; //tõene, 5 4 && 0 //väär
Kuna vaadatakse vaid esimese ebatõese operandini, on see hea viis kontrollida mingi alamväärtuse kehtivust.
if(a && a.b);
Näites kontrollitakse väärtust a.b ainult juhul, kui a on defineeritud.
Kuna kontrollitakse vaid esimese väära operandini, siis tuleb operaatori puhul olla parempoolse operandiga ettevaatlik - sealne avaldis täidetakse vaid juhul, kui vasak operand tagastab tõese väärtuse. Probleem võib tekkida, kui parempoolne operand peab sooritama mingit tegevust iga iteratsiooni ajal.
var c = 10, a = false; while(c){ if(a && c--){}; }
Näites olev tsükkel ei jõua kunagi lõpuni, kuna käsk c– jääb alati täitmata. Muutuja a väärtus on false ning seega tingimust edasi ei kontrollita.
Samuti tasub ette vaadata tekstiliste väärtustega "0" ning "false" - JavaScripti arvates on nende stringide väärtus võrdlustehetes true, kuigi osad teised keeled, näiteks PHP peavad antud väärtusi samas kontekstis ebatõesteks.
|| - Loogiline VÕI (OR)
Tagastusväärtus on tõene, kui üks operandidest on tõene. Tagastusväärtuseks on esimene tõene operand.
3 || 5; //tõene (3) 0 || 4; //tõene, 4
Juhul kui vasak operand on tõene, siis parem operand jääb täitmata.
Operaatorit || saab kasutada ka mugavaks muutujate lähtestamiseks funktsioonide parameetritena - juhul kui väärtus on seadmata, saab muutuja väärtuseks mingi vaikimisi suuruse.
function test(nr){ nr = nr || 12; }
Näites kontrollitakse parameeter nr väärtust ning kui seda pole seatud, saab väärtuseks vaikimisi suurus 12. Sama saaks kirjutada ka tingimuslausega if(!nr){nr = 12;} või nr = nr?nr:12, kuid loogilise operaatoriga on lause mugavam kirja panna ning koodi lugedes on see ka kergemini mõistetav.
! - Loogiline eitus
Tagastusväärtus on tõene kui operandi väärtus on väär.
!false; //tõene !10 //väär
Operaatoriga ! saab teisendada suvalist väärtust loogiliseks väärtuseks true või false, kui kasutada operaatorit topelt - esimese korraga kontrollitakse, kas väärtust ei eksisteeri ning teise korraga kontrollitakse väärtuse mitte-eksisteerimise eksisteerimist
!!10 //tõene, väärtuseks true !!0 //väär, väärtuseks false
Bitioperatsioonid
& - Bitioperatsioon JA (AND)
x = x & y
= - Bitioperatsioon VÕI (OR)
x = x | y
^= - Bitioperatsioon välistav VÕI (XOR)
x = x ^ y
~ - Bitioperatsioon EI (NOT)
x = x ~ y
<< - Bittide nihutamine vasakule
Operaator nihutab bitid muutujas väärtuse võrra vasakule, säilitab märgi.
x = x << y
>> - Bittide nihutamine paremale
Operaator nihutab bitid muutujas väärtuse võrra paremale, säilitab märgi.
x = x >> y
>>> - Bittide nihutamine paremale
Operaator nihutab bitid muutujas väärtuse võrra paremale, vasakud bitid täidetakse nullidega.
x = x >>> y
Bitioperatsioonide kohta loe lähemalt bitioperatsioonide peatükist.
Tekst
+ - Stringide liitmine
Juhul kui üks operandidest on string, teisendatab operaator kõik operandid stringideks ning järjestab need stringid üheks kokku. Juhul kui sooviks on siiski liita operande kui numbreid, tuleks stringi kujul number ennem teisendada numbriks funktsiooniga parseInt().
"abc" + "def"; //"abcdef" 3 + "3" // "33"
''+='' - Stringide liitmise lühivorm
var a = "abc"; a += "def"; // a=="abcdef"
Objektide elemendid
. - Punktnotatsioon
Punkt objekti ning elemendi nime vahel tagastab objekti elemendi.
var z = document.getElementById('x');
Näites saab muutuja z väärtuseks objektis document oleva meetodi getElementById tagastusväärtus.
Kuna punkt on tavaline operaator, siis võib operandide ja operaatori vahel olla ka tühikuid. Mõnel juhul on see isegi kohustuslik - näiteks kui soovime objektina kasutada tavalist numbrit. Selliselt peab numbri ja punkti vahele jääma tühik, kuna vastasel korral peetakse punkti mitte notatsioonioperaatoriks, vaid komakoha eraldajaks.
5.toFixed(2) // SyntaxError 5 . toFixed(2) // "5.00"
[] - Nurksulud
Nurksulud objekti nime järel elemendi tekstikujul nimetusega tagastavad objekti elemendi. Sama mis punktnotatsioon, erinevusega et täiendavalt saab kasutada genereeritud elemendi nimetust (elemendi nimetus ei pea olema programmikoodis defineeritud).
var z = document['getElementById']('x'); // või var n = 'getElementById'; var z = document[n]('x');
Spetsiaalsed operaatorid
?: - Ternaarne tingimuslause
(tingimus ? kuiTõene : kuiVäär). tingimus - avaldis, mis tagastab väärtusena tõese true või väära false. kuiTõene ja kuiVäär võivad olla suvalised avaldised.
alert( a>b?"a on suurem kui b":"a ei ole suurem kui b");
, (koma)
Operaatorina käivitab koma avaldistena mõlemad operandid ning tagastusväärtusena väljastab parempoolse avaldise väärtuse. Operaatorit on kõige parem kasutada olukordades, kus on vaja käivitada mitu avaldist ühe lausena - näiteks for tsükli lähtestamisel.
for(var i=0, len=arr.length; i<len; i++);
delete
Operaator delete kustutab objekti, objekti elemendi või massiivi kindlal indeksil asuva elemendi, v.a. need muutujaid, mis on deklareeritud käsuga var. Operaator delete kustutab tegelikult muutuja väärtuse asemel ainult viite selle väärtuse juurde, väärtust ennast ta ei eemalda. Väärtuse tegelikuks kustutamiseks on JavaScriptis olemas „prügikoristaja“ (garbage collector), mis käivitudes kustutab mälust kõik väärtused, mille juurde ei ole ühtegi töötavat viidet. Seega programmeerija ei pea ise muretsema kasutuks muutunud objektide eemaldamise pärast.
a = {sisu: "see on objekt"}; b = a; delete a; alert(b.sisu); // "see on objekt"
Antud näites „kustutasime“ küll esialgse objekti, kuid tegelikult kadus vaid esialgne viide objekti juurde. Hiljem loodud viide b = a jäi siiski kasutatavaks.
in
Elemendi olemasolu kontroll objektis. „element“ in objekt väljastab tõese tagastusväärtuse juhul kui objektis on olemas element või numbriline indeks nimega „element“.
if ("getElementById" in document){ document.getElementById("elemendi_id"); }
instanceof
Objekti tüübi vastavuse kontroll. objekt instanceof tyyp väljastab tõese tagastusväärtuse juhul kui objekti tüüp on tyyp.
new String("abc") instanceof String //true
this
Viide hetkel aktiivsele objektile, meetodi sees viitab this kutsuvale objektile.
var Auto = function(mark){ this.mark = mark; // this viitab hetkel aktiivsele funktsioonile Auto } Auto.prototype.getMark = function(){ return this.mark; // Kuna tegu on meetodiga, viitab this meetodi omanikule - funktsioonile Auto } var auto = new Auto('Audi'); alert(auto.mark); // Audi alert(auto.getMark()); // Audi
this võib tekitada probleeme sulundite korral - kui objekti sees on defineeritud anonüümne funktsioon, on selle anonüümse funktsiooni this viiteks mitte väline objekt, vaid hoopis globaalne objekt window. Anonüümsele funktsioonile saab õige viite edastada läbi mõne muutuja, mis on defineeritud välise objekti skoobis.
var Auto = function(mark){ this.mark = mark; var that = this; (function(){ alert(that.mark); // anonüümses funktsioonis viitab this enesele, kasutada tuleb välise skoobi muutujat })(); // pane tähele lõpetavaid sulge, mis käivitavad esimestes sulgudes tagastatud anonüümse funktsiooni } new Auto('Toyota'); // Toyota
Teine võimalus on siduda this sulundfunktsiooniga läbi funktsiooni meetodi apply või call (loe lähemalt funktsioonide peatükist).
var Auto = function(mark){ this.mark = mark; (function(){ alert(this.mark); // seekord on this "õige" }).apply(this); } new Auto('Toyota'); // Toyota
typeof
Väljastab avaldise tüübi stringi kujul.
typeof "tekst" // "string"; typeof 2 // "number"
void
Käivitab etteantud avaldise ning väljastab tulemusena undefined. Avaldise parameeter on kohustuslik.
void (a = 2); void; // SyntaxError, parameeter on kohustuslik
new
Konstruktoroperaator, mis loob paremal olevast objektist uue instantsi ning omistab vasakul olevale muutujale loodud instantsile suunatud viite this.
var objekt = new Konstruktor(); var aeg = new Date();
Kommentaarid
Kommentaarid on koodiblokid, mille interpretaator jätab vahele ning mida on mugav kasutada programmi töö kohta selgituste lisamiseks.
// kommenteerib rea lõpuni, lõpetavat märgendit ei vaja /* kommenteerib kuni kommentaari lõpetava märgendini */
Erinevad minimeerimisprogrammid, mis on mõeldud JavaScript failide suuruse vähendamiseks (vähendamaks serveri koormust failide laadimisel), kustutavad kommentaarid koodist automaatselt ise ära.
Operatsioonide järjekord
Erinevate operatsioonide korral ühes lauses tekib alati küsimus, missugune operatsioon nendest kõigepealt teostatakse? Näiteks kas lauses a + 4 / 5 teostatakse esiteks kõige vasakpoolsem st. esimene operatsioon lauses (+) või mingi muu (/). Allolevast tabelist leiabki vastava järjestuse, kus eelistuse number näitab järjekorda mille alusel erinevaid operatsioone koheldakse. Mida väiksem number, seda eelistatum operatsioon teistega võrreldes on. Eelnenud näites oleks seega esimeseks operatsiooniks jagamine / (5) ja teiseks liitmine + (6).
| Eelistus | Operatsioon | Operaatorid |
|---|---|---|
| 1 | objekti element | ., [] |
| 1 | uus objekt | new |
| 2 | funktsiooni käivitus | () |
| 3 | inkrement | ++ |
| 3 | dekrement | – |
| 4 | loogiline NOT | ! |
| 4 | bitioperaator NOT | ~ |
| 4 | unaarne + | + |
| 4 | unaarne - | - |
| 4 | tüübi kontroll | typeof |
| 4 | tühi | void |
| 4 | muutuja kustutamine | delete |
| 5 | korrutustehe | * |
| 5 | jagamistehe | / |
| 5 | jäägi leidmine | % |
| 6 | liitmistehe | + |
| 6 | jagamistehe | - |
| 7 | bittide nihutamine | <<, >>, >>> |
| 8 | väärtuste suhted | <, <=, >, >= |
| 8 | elemendi kontroll objektist | in |
| 8 | isendi konstruktori kontroll | instanceof |
| 9 | väärtuste võrdsus | ==, !=, ===, !== |
| 10 | bitioperatsioon JA (AND) | & |
| 11 | bitioperatsioon välistav VÕI (XOR) | ^ |
| 12 | bitioperatsioon VÕI (OR) | | |
| 13 | loogiline JA (AND) | && |
| 14 | loogiline VÕI (OR) | || |
| 15 | ternaarne tingimuslause | ?: |
| 16 | omistamine | =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |= |
| 17 | koma | , |
Tabel 2. Operaatorite järjekord
Käidud rada: • events • whois • numbrid • objektid • advanced • stringid • massiivid • script_tag • nimeruumid • operaatorid