Uvod

javascript_konverzija

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”
  1. Ako su istog tipa => izvršava striktno poredjenje “===”
  2. Ako je promenjiva “x” null ili undefined =>vraća True
  3. Ako je promenjiva “x” undefined a promenjiva “y” null =>vraća True
  4. Ako je promenjiva “x” Number a promenjiva “y” String onda vraća rezultat komparacije x ==ToNumber(y)
  5. Ako je promenjiva “x” String a promenjiva “y” Number onda vraća rezultat komparacije ToNumber(x)=y
  6. Ako je promenjiva “x” Boolean a promenjiva “y” Number onda vraća rezultat komparacije ToNumber(x)=y
  7. Ako je promenjiva “x” Number a promenjiva “y” Boolean onda vraća rezultat komparacije x=ToNumber(y)
  8. Ako je promenjiva “x” Number ili String ili Symbol a promenjiva “y” Objekat onda vraća rezultat komparacije x ==ToPrimitiv(y)
  9. Ako je promenjiva “x” Objekat a promenjiva “y” Number ili String ili Symbol onda vraća rezultat komparacije ToPrimitiv(x)=y
  10. 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”
  1. Ako je “x” NaN vraća False
  2. Ako je “y” NaN vraća False
  3. Ako je “x” isti broj kao i “y” vraća True
  4. Ako je “x” +0 a “y” -0 vraća True
  5. Ako je “x” -0 a “y” +0 vraća True
  6. Nije ništa od navedenog vraća False

c) Relaciono poredjenje “<" ili ">” ili “>=” ili “<="

Algoritam pri relacionom poredjenju
  1. 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

  2. Ako su oba tipa String => izvršava se “alfabetsko poredjenje”
    Primer

  3. 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.

    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.

  4. 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

Primer

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

Primer: Niz u string pa u broj

Pri konverziji nizova u broj se prvo niz prebacuju u string (medjukorak), a zatim stringovi u brojeve.

f) Korišćenje unarnih operatora

Korišćenjem unarnih operatora (+ ili -) ispred nekog podatka, operator će pokušati da ga kovertuje u broj!

g)Korišćenjem operatora && i || pri izračunavanju uslova

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.
  • 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.
Podelite:

One Response to “Konverzija tipova u JavaScript-u”

Ostavite komentar