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!