Uvod
JavaScript je slabo (eng. loosely) tipiziran jezik, što znači da ne zahteva da se jasno deklarišete vrsta podataka pri deklarisanju promenjive. Kod JavaScript-a se tip promenjive implicitno deklariše sa pridruživanjem odredjene vrednosti datoj promenjivoj.
Javascript je takodje jezik dinamičkih tipova jer je moguća promena tipa u toku izvršenja programa. Rezultat konverzije je uvek neka primitivna vrednost, tj. ne postoji konverzija čiji je rezultat neka složena vrednost (kao što je objekat ili funkcija). Za razliku od JavaScript-a, TypeScript (JavaScript superset jezik) je “strongly typed” jezik koji zahteva da se pri deklaraciji promenjive definiše tip i ne dozvoljava implicitno menjanje tipova.
Eksplicitna konverzija
Kada mi želimo da promenimo tip podataka neke promenjive to se zove eksplicitna (očigledna) konverzija tipova i vrši se koristeći neku od ugradjenih funkcija za konverziju:
- Konvertovanje u “string”: “String()” ili “toString()”
- Konvertovanje u “number”: “Number()” ili “parseFloat()” ili “parseInt()”
- Konvertovanje u “boolean”: “Boolean()”
Implicitna (prikrivena) konverzija tipova
Implicitna (prikrivena) konverzija tipova se odnosi na konverzije koje nisu očigledne, a izvšava ih JavaScript engine u hodu kao sporedni efekat nekih drugih radnji. Implicitna konverzija se najčešće javlja kada se vrednost nekog tipa koristi na način koji automatski prouzrokuje njenu konverziju.
Tabela implicitnih konverzija
Original Vrednost | Konverzija u Number | Konverzija u String | Konverzija u Boolean |
---|---|---|---|
false | 0 | “false” | false |
true | 1 | “true” | true |
0 | 0 | “0” | false |
1 | 1 | “1” | true |
“0” | 0 | “0” | true |
“000” | 0 | “000” | true |
“1” | 1 | “1” | true |
NaN | NaN | “NaN” | false |
Infinity | Infinity | “Infinity” | true |
-Infinity | -Infinity | “-Infinity” | true |
“” | 0 | “” | false |
“20” | 20 | “20” | true |
“twenty” | NaN | “twenty” | true |
[] | 0 | “” | true |
[20] | 20 | “20” | true |
[10,20] | NaN | “10,20” | true |
[“twenty”] | NaN | “twenty” | true |
[“ten”,”twenty”] | NaN | “ten,twenty” | true |
function(){} | NaN | “function(){}” | true |
{} | NaN | “[object Object]” | true |
null | 0 | “null” | false |
undefined | NaN | “undefined” | false |
Razlozi za implicitnu konverziju
Najčešće su razlozi za implicitnu konverziju poredjenje ili neka druga matematička operacija izmedju različitih tipova promenjivih. Pored ovoga implicitna konverzija se dešava i usled potrebe za izračunavanje nekog uslova. Navešću uslove kojima je potrebna logička vrednost za razrešenje uslova, pa zbog toga može da se javi potreba za konverzijom u logički tip:
- uslov u iskazu if (..)
- uslov (druga odredba) u petlji for (.. ; .. ; ..)
- uslov u petljama while(..)
- uslov (prva odredba) u ternarnim izrazima ..?.. :..
- operandi kao uslov kod logičkih operatora && ili || pogledaj više o ovome ovde.
a) Abstraktno poredjenje “==”
Jedan od najpoznatijih primera implicitne konverzije je “poredjenje prama jednakosti”, nakon čega se dobija logička vrednost. Algoritam pri odredjivanju logičke vrednosti je sledeći:
Algoritam pri abstraktnom poredjenju “x==y”
- Ako su istog tipa => izvršava striktno poredjenje “===”
- Ako je promenjiva “x” null ili undefined =>vraća True
- Ako je promenjiva “x” undefined a promenjiva “y” null =>vraća True
- Ako je promenjiva “x” Number a promenjiva “y” String onda vraća rezultat komparacije x ==ToNumber(y)
- Ako je promenjiva “x” String a promenjiva “y” Number onda vraća rezultat komparacije ToNumber(x)=y
- Ako je promenjiva “x” Boolean a promenjiva “y” Number onda vraća rezultat komparacije ToNumber(x)=y
- Ako je promenjiva “x” Number a promenjiva “y” Boolean onda vraća rezultat komparacije x=ToNumber(y)
- Ako je promenjiva “x” Number ili String ili Symbol a promenjiva “y” Objekat onda vraća rezultat komparacije x ==ToPrimitiv(y)
- Ako je promenjiva “x” Objekat a promenjiva “y” Number ili String ili Symbol onda vraća rezultat komparacije ToPrimitiv(x)=y
- Ako nije ništa od navedenog vraća False
NAPOMENA:
Za sve zahteve za promenom odredjenog tipa konsultujete prethodnu tabelu implicitnih konverzija
b) Striktno poredjenje “===”
Algoritam pri striktnom poredjenju “x===y”
- Ako je “x” NaN vraća False
- Ako je “y” NaN vraća False
- Ako je “x” isti broj kao i “y” vraća True
- Ako je “x” +0 a “y” -0 vraća True
- Ako je “x” -0 a “y” +0 vraća True
- Nije ništa od navedenog vraća False
c) Relaciono poredjenje “<" ili ">” ili “>=” ili “<="
Algoritam pri relacionom poredjenju
- Ako je nekji od operanda “objekat”, prvo se pokuša da sa “pretvori” u primitivnu vrednost tako što se poziva
nekiObjekat.valueOf(), a zatim ako je to moguće pokuša se transformisati u tip “Number”
Primer
12345var oVal1 = { valueOf: function() { return 1; } };console.log(oVal1 > null)var oVal0 = { toString: function() { return "0"; } };console.log(oVal0 < true); //prints true - Ako su oba tipa String => izvršava se “alfabetsko poredjenje”
Primer
12"a" < "b" // Vraća TRUE"a" < "aa" //Vraća TRUE - Ako neka od promenjivih nije tipa “Number” a druga jeste, onda se pokušava implicitna konverzija u Number
Primer
Kada se koriste operatori poredjenja pri čemu jedan od operanada je logička vrednost a drugi tipa Number dolazi do konverzije logičke vrednosti u broj. Logička vrednost TRUE se konvertuje u broj 1, a logička vrednost FALSE se konvertuje u nulu.
1FALSE < 1 // Prvo se vrsi konverzija u broj pa dobijamo "0 < 1" nakon cega vraca "TRUE"Napomena:
Ukoliko se pri konverziji dobije NaN (npr. pri konverziji undefined u broj ili neuspešna konverzija String-a u Number) uvek poredjenje uvek vraća FALSE. - Ako su oba tipa Number => izvršava se standardno poredjenje
d) Operacija “+” a jedan od operanada je string
Ova konverzija se javlja pri korišćenju operatora “+”, kada je jedan od operanada string. Pravilo je da se operand (element nad kojim se izvršava operacija) čiji tip nije “string” konvertuje u string a zatim se vrši spajanje dva string-a (spajanje znakovnih nizova).
Primer
1 2 3 |
var a = 5; var b = "0"; a + b = "50" |
Primer
1 2 3 |
var a = [5, 6]; var b = [7, 8]; a + b = "5,67,8" |
e) Operacije množenja, deljenja i oduzimanja
Operatori za oduzimanje (–), množenje (*) i deljenje (/) namenjeni samo za rad sa brojevima, stoga jedan od operanada nije broj, dolazi do implicitne konverzija u broj. Takodje su brojevi potrebni kada se koriste operatori poredjenja (“==” ili “<" ...), stoga i tada dolazi do konverzije u broj.
Primer: String u broj
1 2 3 |
var a = "3.14"; var b = 0 a - b = 3.14 |
Primer: Niz u string pa u broj
Pri konverziji nizova u broj se prvo niz prebacuju u string (medjukorak), a zatim stringovi u brojeve.
1 2 3 |
var a = [7, 8]; var b = [5, 6]; a - b = 22 // 78-56 |
f) Korišćenje unarnih operatora
Korišćenjem unarnih operatora (+ ili -) ispred nekog podatka, operator će pokušati da ga kovertuje u broj!
1 2 |
+"3"; // Vraca broj 3 2+ +"3" // Vraća broj 5 |
Kada jedan ili čak oba operanda nisu logičkog tipa pri korišćenju operatora && i || dolazi do konverzije u logički tip ali nakon razrešenja uslova ne vraćaju logičku vrednost, već vraćaju vrednost jednog od dva operanda. Šta će da bude razultat uslova se odredjuje prema sledećim pravilima:
- Za operator || nakon konverzije “ne logičkog” tipa u logički pri razrešenju uslova važi:
ukoliko je krajnje rešenje uslova operatora TRUE on vraća vrednost prvog operanda, a u slučaju FALSE vraća vrednost drugog operanda.
1234console.log(3 || true); //rezultat je 3console.log(3 || false); //rezultat je 3console.log(true || 3); //rezultat je TRUEconsole.log(false || 3); //rezultat je 3 - Za operator && nakon konverzije “ne logičkog” tipa u logički pri razrešenju uslova važi:
ukoliko je krajnje rešenje uslova operatora TRUE vraća vrednost drugog operanda i obrnuto.
1234console.log(3 && true); //rezultat je trueconsole.log(3 && false); //rezultat je falseconsole.log(true && 3); //rezultat je 3console.log(false && 3); //rezultat je false
Svaka čast, odličan članak, sve sam brzo skontala!