Izrazi
Izraz je sestavljen iz vrednosti, spremenljivk in operatorjev, ki so
med seboj povezani na predpisane načine. Ko izraz izračunamo, dobimo
neko vrednost (vrednost izraza), katere tip je odvisen od tipov
posameznih operandov in uporabljenih operatorjev.
Ločimo dve vrsti izrazov. Vsi izrazi imajo vrednost, nekateri pa dodatno
spremenijo še vrednost kakšne spremenljivke. Izraz 3 + 4 ima vrednost
7, izraz x = 5 pa vrednost 5. Pri tem drugi izraz še spremeni
vrednost spremenljivke x (priredi ji vrednost 5).
Pri sestavljanju izrazov je zelo pomembno poznavanje operatorjev, zato si jih
poglejmo podrobneje. Operatorje delimo v več skupin: prireditveni, primerjalni,
logični, aritmetični, bitni in posebni operatorji.
Prireditveni operatorji
Osnovni prireditveni operator je =, ki spremenljivki na levi strani
priredi vrednost izraza na desni strani operatorja. Če napišemo x = y,
bomo spremenljivki x priredili vrednost spremenljivke y.
Drugi prireditveni operatorji so samo kratice za kombinacije operatorja
= z drugimi operatorji.
x = y |
|
x += y |
x = x + y |
x -= y |
x = x - y |
x *= y |
x = x * y |
x /= y |
x = x / y |
x %= y |
x = x % y |
x <<= y |
x = x << y |
x >>= y |
x = x >> y |
x >>>= y |
x = x >>> y |
x &= y |
x = x & y |
x |= y |
x = x | y |
x ^= y |
x = x ^ y |
Vrednost prireditvenega izraza je enaka vrednosti izraza, ki ga prirejamo
spremenljivki. Ker ima svojo vrednost, lahko prireditveni izraz uporabimo
kot del drugega izraza, torej tudi na desni strani novega prireditvenega izraza.
Primerjalni operatorji
Primerjalni operator primerja vrednosti svojih operandov in vrne logično vrednost
true ali false, odvisno od rezultata primerjave. Operanda sta
lahko poljubna izraza. Če sta enakega tipa, je false manjše od true,
števila primerja po velikosti, nize pa leksikografsko (po abecedi).
Poglejmo si še nekaj primerov, ko operanda nista enakega tipa. Operator ===
bo v takem primeru vedno vrnil false, operator !== pa true.
Vrednost undefined je enaka vrednosti null, ta pa je manjša od
vrednosti true (undefined in true pa nista primerljiva).
Pri primerjanju števila z nizom poskuša JavaScript niz pretvoriti v število.
Če mu uspe, primerja števili, sicer pa vrne false.
x == y |
ali je x enak y |
x != y |
ali je x različen od y |
x === y |
ali sta x in y enaka po vrednosti in tipu |
x !== y |
ali sta x in y različna po vrednosti ali tipu |
x < y |
ali je x manjši od y |
x > y |
ali je x večji od y |
x <= y |
ali je x manjši ali enak y |
x >= y |
ali je x večji ali enak y |
Logični operatorji
Z uporabo logičnih operatorjev sestavljamo bolj zapletene primerjave.
Operandi so običajno logične vrednosti, oziroma izrazi, katerih vrednosti
so true ali false. Preverimo lahko, ali sta oba operanda
enaka true (logični in), ali je vsaj en operand enak true
(logični ali), ali pa spremenimo veljavnost operanda (logična negacija).
x && y |
logični in |
x || y |
logični ali |
!x |
logična negacija |
Operandi pa niso nujno samo logične vrednosti. Operator &&
vrne vrednost levega operanda, če jo je mogoče pretvoriti v false
(take vrednosti so na primer število 0, prazen niz, null in undefined),
sicer pa vrne vrednost desnega operanda. Operator || vrne vrednost
levega operanda, če jo je mogoče pretvoriti v true, sicer pa vrne
vrednost desnega operanda. Operator ~ pa vrne false, če je
vrednost njegovega edinega operanda mogoče pretvoriti v true, sicer
pa vrne true.
Opozoriti pa velja še na eno podrobnost. Če je vrednost levega operanda operatorja
&& enaka false, bo vrednost izraza tudi false,
ne glede na vrednost desnega operanda. JavaScript zato v tem primeru vrednosti
desnega operanda sploh ne izračuna. Podobno velja za operator || v primeru,
ko je vrednost njegovega levega operanda enaka true.
Aritmetični operatorji
Osnovnih aritmetičnih operatorjev (+, -, *, /)
verjetno ni treba posebej predstavljati. Malo manj znan aritmetičen operator je
%, ki vrne ostanek pri deljenju. Pozabiti pa ne smemo še na eniški
operator -, ki spremeni predznak operanda. Obstaja tudi eniški operator
+, ki na številskem operandu ne naredi ničesar, ostale pa pretvori v število.
Operandi omenjenih operatorjev so lahko poljubni izrazi.
Obstajata še dva aritmetična operatorja, ki delujeta na spremenljivkah (njun edini
operand). Operator ++ poveča, operator -- pa zmanjša vrednost
spremenljivke za ena. Oba lahko napišemo pred ali za imenom spremenljivke.
x + y |
vsota |
x - y |
razlika |
x * y |
produkt |
x / y |
kvocient |
x % y |
ostanek pri deljenju |
+x |
|
-x |
aritmetična negacija |
x++ |
poveča vrednost spremenljivke x za 1 |
++x |
poveča vrednost spremenljivke x za 1 |
x-- |
zmanjša vrednost spremenljivke x za 1 |
--x |
zmanjša vrednost spremenljivke x za 1 |
Če kakšen operand aritmetičnih operatorjev ni številskega tipa, ga JavaScript
poskusi pretvoriti v število. Vrednosti null, false in prazen
niz pretvori v število 0, vrednost true v število 1, vrednost
undefined pa v število NaN.
Izjema k zgornjemu pravilu o pretvorbi operandov v števila je pri seštevanju.
Kadar je eden od operandov pri seštevanju niz, bo JavaScript tudi drugega
najprej pretvoril v niz, nato pa bo oba niza staknil. Tako je vrednost izraza
"123" + 4 enaka "1234", in ne 127.
Za stikanje nizov lahko uporabimo tudi prireditveni operator +=.
Opišimo še razliko med ++x in x++. Na spremenljivko x
imata oba izraza enak učinek. Njeno vrednost povečata za ena. Razlika je v vrednosti
izraza samega, ki postane zelo pomembna, če ga uporabimo kot del večjega izraza.
Vrednost izraza ++x je nova (že povečana) vrednost spremenljivke x,
vrednost izraza x++ pa je stara (še nepovečana) vrednost spremenljivke x.
Podobno velja tudi za operator --.
Bitni operatorji
Bitni operatorji obravnavajo svoje operande kot 32 bitna cela števila.
Če kateri od operandov ni celo število, ga JavaScript ustrezno pretvori.
Pri tem realnemu številu odreže števke za decimalno piko, niz predela
v število (če mu ne uspe, ga obravnava kot število 0), vrednosti
undefined, null in false predela v število 0,
true pa v število 1. Vrednost, ki jo dobimo kot rezultat bitne
operacije, je vedno številska.
x & y |
bitni in |
x | y |
bitni ali |
x ^ y |
bitni ekskluzivni ali |
~x |
bitna negacija |
x << y |
pomik bitov števila x za y mest v levo |
x >> y |
pomik bitov števila x za y mest v desno |
x >>> y |
pomik bitov števila x za y mest v desno |
Rezultati operacij &, | in ^ so 32 bitna cela
števila, ki imajo na 1 nastavljene natanko tiste bite, ki so bili 1 pri
obeh operandih, vsaj enem operandu oziroma natanko enem od operandov. Rezultat
operacije ~ dobimo tako, da spremenimo vse bite njegovega edinega
operanda.
Med bitne operatorje spadajo tudi operatorji za pomik, ki pomaknejo bite
levega operanda za določeno število mest (desni operand) v levo ali desno.
Operator << je pomik v levo. Pri tem izgubimo nekaj bitov
na levi (toliko, kolikor je dolg pomik), nova mesta na desni strani pa se
napolnijo z ničlami. Operatorja za pomik v desno sta kar dva. Pri obeh
izgubimo nekaj bitov na desni (toliko, kolikor je dolg pomik), razlikujeta
pa se načinu, kako se napolnijo nova mesti na levi. Operator >>
nova mesta napolni z bitom, ki je bil najbolj levi že pred pomikom, operator
>>> pa z ničlami.
Posebni operatorji
Posebne operatorje bomo podrobneje opisali kasneje, ko jih bomo potrebovali.
Tukaj so samo našteti, da bo seznam operatorjev popoln.
x ? y : z |
pogojni operator |
x , y |
vejični operator |
delete x |
|
x in y |
|
x instanceof y |
|
new x |
|
typeof x |
|
void x |
|
x.y |
|
x[y] |
|
x() |
|
Prednost
Kadar v enem izrazu uporabimo več operatorjev, je dobro vedeti,
kateri operator bo imel prednost pri izračunu vrednosti izraza.
V spodnji tabeli so našteti vsi operatorji glede na svojo prioriteto.
Operatorji z višjo prioriteto so v tabeli višje.
. [] |
() new |
! ~ + - ++ -- typeof void delete |
* / % |
+ - |
<< >> >>> |
< <= > >= in instanceof |
== != === !== |
& |
^ |
| |
&& |
|| |
?: |
= += -= *= /= %= <<= >>= >>>= &= |= ^= |
, |