Podela tipova podataka

tipovi podataka u javascriptu

U okviru JavaScript-a ima 7 vrsta podataka. Podaci mogu da se podele u dve grupe:
a) Podaci koji čuvaju primitivni tip vrednosti:

  • 1) string
  • 2) number
  • 3) boolean
  • 4) undefined
  • 5) null
  • 6) symbol (ES2015)

b) Podaci koji čuvaju referentni tip vrednosti:

  • 7) objekat
    • array
    • Map (ES2015)
    • WeekMap (ES2015)
    • Set (ES2015)
    • WeekSet (ES2015)

Karakteristike primitivnog tipa vrednosti

Primitivni tip vrednosti se čuva u brzom delu memorije koja se naziva “stack” i ima nepromenjivu (“immutable“) vrednost. To znači da nakon stvaranja i skladištenja u memoriju ta vrednost na tom mestu se više ne može menjati. Upravo je njihova nepromenjivost razlog što je za poredjenje promenjivih koje sadrže primitivan tip vrednosti, dovoljno da porede samo vrednosti. Karakteristike primitivnih vrednosti se najbolje opisuje kroz primer:

Primer

a) slučaj: Dodeljivanje primitivnog tipa vrednosti promenjivoj. Ovaj postupak podrazumeva:

  • Generisanje vrednosti “Dragoljub”, koja zauzima odredjeni prostor u memoriji
  • Definisanje pointera promenjive “osoba1” da ukazuje na to mesto

b) slučaj: Dodeljivanje već postojeće promenjive novoj promenjivoj. Ovaj postupak podrazumeva:

  1. Zauzimanje novog mesta u memoriji u koje se kopira dodeljena vrednost druge promenjive
  2. Definisanje pointera promenjive da ukazuje na to novo mesto u memoriji

Potrebno je naglasiti da dve promenjive iz prethodnih primera (osoba1, osoba2) ukazuju na dva različita mesta u memoriji sa jednakim vrednostima. Ako promenjivoj “osoba1” dodelimo neku novu vrednost, to neće imati uticaja na promenjivu “osoba2”, jer ona ukazuje na mesto u memoriji gde čuva vrednost “Dragoljub”:

Karakteristike referentnog tipa vrednosti

Referentani tip vrednosti se čuva u sporijem delu memorije koja se naziva “heap”, i za razliku od primitivnog tipa vrednosti referentni tip vrednost može da se menja tokom vremena. Dodeljivanje referentne vrednosti promenjivoj izvršava istu akciju kao i kod primitiva: vrednost zauzima mesto u memoriji, a pointer promenjive se definiše da ukazuje na to mesto u memoriji.

Da bi dva objekta bila jednaka, nije dovoljno da imaju isti sadržaj već moraju da ukazuju i na isto mesto u memoriji.

Primer

Kod referentnog tipa vrednosti dodeljivanje postojeće promenjive nekoj novoj promenjivoj samo kreira pointer nove promenjive na isto mesto na koje već ukazuje postojeća promenjiva(ne kopira njegovu vrednost i ne zauzima novo mesto u memoriji):

Stoga nakon neke promene referente vrednosti dolazi do promene obe promenjive jer obe pokazuju na isto mesto u memoriji:

NAPOMENA:

Treba naglasiti da kada god kreiramo objekat preko konstruktora “new” ili “object literal”, zauzima se novo mesto u memoriji i taj objekat je različit od svakog drugog objekta:

Primer

U narednom primeru osoba2.ime vraća “Dragoljub” iako bi neko očekivao da to bude “Pera” upravo iz prethodno pomenutog razloga jer se dodeljivanjem object literal-a zauzima novo mesto u memeoriji, dok osoba2 i dalje ukazuje na prethodnu poziciju u kojoj je još uvek vrednost imena “Dragoljub”.

Iz istog razloga i naredni primer vraća FALSE

Da li je sve u JavaScript-u objekat?

Programeri često navode da je sve u JavaScriptu objekat, ali to nije tačna izjava jer objekat je samo jedan od tipova podataka u JavaScriptu, a pored objekta postoje još 6 primitivnih tipova. Zbrku pravi i činjenica da postoje objekti ugradjeni u core javascript-a čija su imena ista kao imena prostih primitiva (mada nazivi počinju sa velikim slovom!).

  • String
  • Number
  • Boolean

Pored “nesrećnih” naziva za ugradjene objekte dodatnu pometnju pravi automatska konverzija primitivnog tipa u njegov “parnjak” objekat. Konverzija i nije najbolji izraz, preciznije bi bilo da se kaže da kompajler automatski privremeno “obavije” primitiv u parnjak objekat. Automatska konverzija se najčešće dešava kada programer na primitiv nadoveže neku od metoda objekta “parnjaka”.

Primer

U ovom primeru nad primitivom tipa “string” se poziva metoda objekta “String”. Kompajler automatski privremeno “pretvara” primitiv tipa “string” u objekat tipa String, nakon čega su mu dostupne sve metode ugradjenog objekta, pa i metoda lenght:

Dodatni razlog zašto programeri mešaju primitive sa objektima je:

Prethodni izraz je jedan od najpoznatijih bug-ova u JavaScript-u, smatra se da ovaj bug verovatno nikada neće biti rešen, jer je za to već kasno, citiraću:

“Too much code on the Web relies on the bug and thus fixing it would cause a lot more bugs!”

A šta su Funkcije?

Izraz typeof vraća “function”, stoga se sa sigurnošću može reći da funkcija nije tipa “objekat” nego da je tipa “function”.

Pošto je u JavaScriptu funkcija tzv. “first class citizen”, ona ima osobine svih primitiva kao i sve osobine objekta!

OBJAŠNJENJE:
Pojam “first class citizen” znači da takav entitet podržava sve operacije dostupne drugim tipovima, i može da se ponaša kao bilo koja druga vrsta entiteta. Sve u svemu, pošto su funkcije “first class citizen” u JavaScriptu, kod njih ne postoji restrikcija kako se kreiraju ili koriste.

Funkcija ima sve osobine drugih primitiva, pa je možemo proslediti kao argument, možemo je vratiti (return) kao vrednost iz neke druge funkcije ili je možemo dodeliti nekoj promenjivoj. Pored nabrojanih osobina funkcije imaju i sve osobine objekata. Funkcije su “više od objekta” jer pored svih osobina objekta, imaju i osobine primitiva, kao i dodatu semantiku za pozivanje (eng. invoke).

Podelite:

3 Responses to “Tipovi podataka u JavaScriptu”

  1. Dejana

    var osoba1 = {
    ime: Dragoljub,
    prezime: Zivanovic
    }
    var osoba2 = osoba1

    var osoba1 = {
    ime: Pera,
    prezime: Perić
    }
    console.log (osoba2);
    Meni ne vraća Pera Perić

    • Dragoljub

      Dejane u pravu si, ovo nije dobar primer za ovu namenu jer u ovom slučaju koristeći “object literal” pravimo potpuno novi objekat sa drugim mestom u memoriji pa osoba2 više ne pokazuje na istu referencu.
      Da bi ovaj primer objasnio karakteristiku referentnog tipa vrednosti dovoljno je promeniti bilo koju od vrednosti osobe1: npr. osoba1.ime = “Pera” pa će i osoba2 to “osetiti” i nakon toga će console.log (osoba2.ime) stvarno vraćati “Pera”

      Hvala na komentaru, ažurirao sam primer.

Ostavite komentar