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.

Medjutim dodeljivnje postojeće promenjive novoj promenjivoj ne kopira tu vrednost i ne zauzima novo mesto u memoriji, već samo definiše pointer promenjive na to isto mesto:

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

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:

ili

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

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

Pogledajte slične članke...

Podelite:

Ostavite komentar