Symbol

Karakteristike

Symbol je novi tip podataka koji je došao sa ES2015 standardom. Symbol predstavlja jedinstveni token. Simbol se kreira koristeći funkciju Symbol().

Symbol može biti kreiran i sa label-om, koji mu se prosledi kao string. Taj label ne utiče na vrednost symbola, ali je koristan pri debagovanju i može da prikaže koristeći metod toString() nad symbol-om.

Namena: Ključ svojstva objekta

Uglavnom se “symbol” koristi kao ključ svojstva objekta, kada želimo da zaštitimo to svojstvo. Kada se koristi “symbol” kao ključ svojstva objekta, potrebno je da se koriste uglaste zagrade za pristup svojstvu (tzv. “bracket notation”). Takva svojstvo imaju sledeće karakteristike:

  • Jedinstveno svojstvo
  • Svojstvo ne može da se nabraja (eng. enumerated) kroz “for…in” petlju
  • Svosjtvo ignorišu metode: Object.keys(), Object.getOwnPropertyNames() i JSON.stringify()

Treba napomenuti da privatnost ovoga svojstva nije 100%, jer ipak postoji način za pristup svojstvu preko metoda “.getOwnPropertySymbols()” i .ownKeys():

Map

Karakteristike

es2015

Map je kolekcija parova kluč/vrednost (key/value), gde ključ može biti bilo koji tip podataka za razliku od objekta gde ključ može bit ili string ili symbol. Ima ceo set igradjenih metoda za rad sa elementima kolekcije:

  • .set() – definisanje novog para
  • .delete() – brisanje para
  • .get() – dobijanje vrednosti ključa
  • .keys() – lista svih ključeva
  • .values() – lista svih vrednosti
  • .entries() – vraća sve key/value parove u odvojenim nizovima
  • .clear() – brisanje sadržaja objekta
Primer

Razlika izmedju objekta i Map

Map je novi objektni podtip koji je veoma sličan objektu ali sa par bitnih razlika:

Objekt Map
Ključ može biti jedino String ili Symbol. Map ključ može biti bilo koga tipa, čak i tipa “NaN”.
Dedeljivanje vrednosti ključu sa = operatorom. Dodeljivanje vrednosti ključu sa ugradjenim metodama: .set() i .get().
Svojstva objekta nisu iterable kolekcija (pa ne može da se koristi forEach() ili for..of metoda za iteraciju kroz svojstva). Map je iterable kolekcija (pa može da se koristi forEach ili for of za iteraciju kroz elemente) .
Ne možemo jednostavno dobiti veličinu objekata. .size svojstvo jednostavno vraća veličinu.
Ključevi moraju biti jedinstveni inače dobijamo grešku. Ključevi su ne moraju biti jedinstveni, jer ukoliko se definišu dva člana sa istim ključem, noviji “pregazi” stari
Za brisanje svojstava mora da se napiše kod. Map ima ugradjenu metodu .clear() sa kojom jednostavno briše sve.
If all keys are strings, and you just use get and set, Objects are more performant. If you focus on iterating, map will be more performant. (TEST)

Iteracija kroz Map

Za iteraciju kroz parove je dostupna standardna petlja for..of kao i metoda forEach()

Konvertovanje objekta u “map”

Možemo da konvertujemo objekat u novi JavaScript tip “map”. Map konstruktor new Map() prihvata kao argumente samo iteratibilne kolekcije, stoga je potrebno da od svojstava objekta kreiramo niz [key, value] parova koristeći metodu “Object.entries(obj)”:

Primer

WeakMap

WeakMap je takodje kolekcija parova kluč/vrednost (key/value), ali upravo “ključ” pravi glavnu razliku izmedju Map i WeakMap. Ključ u slučaju WeakMap-e ne može biti ni jedan drugi tip podataka osim “objekta”. WeakMap ima isti API kao Map: set(), delete( get(), keys(), values(), entries(), clear().

Razlika izmedju Map i WeakMap

Map WeakMap
Ključ može biti bilo koji tip podataka. Ključ može biti “samo tipa “Object”” (ali ne “null”).
Map ima metodu za veličinu .size WeakMap ima metodu za veličinu .length
Iteracija sa metodom .forEach(). Kjuč WeakMap tipa nije “enumerable” pa nema metodu za izlistavanje ključeva tj. ne može da se koristi metoda .foreach() za iteraciju.
Ništa nije “auto destroy”. Ako se obriše objekat koji je ključ u WeakMap paru, vrednost dodeljena tom ključu će biti takodje obrisana i neće zauzimati memoriju.
Primer

Ova poslednja razlika je najbitnija, i nju ću detaljno objasniti kroz primer. Posmatraćemo slučaj kada i Map i WeakMap imaju za kluč svojstva objekat

Map i garbage collector

Kod kompajler dodje do linije gde je IIFE i izvrši je nama više nije potrebna promenjiva “a”, ali garbage collector je neće obrisati iz memorije.

WeakMap i garbage collector

Kod kompajler dodje do linije gde je IIFE i izvrši je nama više nije potrebna promenjiva “b”, pošto je referenca na taj objekat “labava” (eng. weak), garbage collector će obrisati datu promenjivu i osloboditi memoriju.

Zaključak iz prethodnog primera je da je WeakMap ima bolje iskorišćenje memorije nego kod Map tipa podataka gde može doći do “curenja” memorije (eng. memory leak).

Set

Karakteristike

Set tip podataka je veoma sličan nizovima, stim što ne dozovoljava dupliranje vrednosti. Metode dostupne kroz objekat “Set.prototype” su:

  • .add() – dodavanje novog člana
  • .delete(value) – brisanje odgovarajućeg člana
  • .has(value) – vraća booleanovu vrednost
  • .values() – lista svih vrednosti
  • .entries() – vraća sve key/value parove u odvojenim nizovima
  • .clear() – brisanje sadržaja objekta
  • .forEach(callback) – Iteracija kroz objekat

A svojstva:

  • .size – ukupan broj parova
  • .constructor – vraća funkciju koja je kreirala instancu
Primer

Razlika izmedju nizova i Set kolekcije

Array Set
Vrednost elemenata može biti duplirana Sadrži samo jedinstvene vrednosti
Fokusiran na index i potrebno je napisati kod da se pronadje odredjeni element i obriše Fokusiran na vrednost elementa. Vresnost se može veoma lako naći i obrisati.
Metoda .push() za dodavanje elemenata Metoda .add() za dodavanje elemenata
Provera postojanja elementa sa metodom .includes() (ES7) Provera postojanja elementa sa metodom .has()
Svojstvo .length se koristi za odredjivanje broja elemenata Svojstvo .size se koristi za odredjivanje broja elemenata
Za pražnjenje kolekcije se koristi metoda arr.splice(0,arr.length) Za pražnjenje kolekcije se koristi metoda mySet.clear()

Iteracija kroz Set

Iteracija je moguća koristeći petlju for..of:

ili dostupnu metodu forEach():

Konvertovanje u nizove

Korišćenjem metode “from()” možemo od set objekta napraviti niz:

Takodje važi i obrnuto:

pa čak i ovo:

WeakSet

WeakSet je specifičan podtip Set tipova podataka jer može samo da sadrži kolekciju objekata.

Razlika izmedju Set i WeakSet

Set WeakSet
Mogu da sadrže bilo koji tip podatak Mogu da čuvaju samo objekte
Broj članova kolekcije se dobija koristeći svojstvo .size Broj članova kolekcije se dobija koristeći svojstvo .length
Iterabilna kolekcija, može da se koristi .forEach() ili for..of Nije iterabilna kolekcija i ne može da se koristi .forEach() ili for..of
Nije auto destroyed Ako objekat više nema referencu pokupiće ga garbage collector
Primer

Ova poslednja razlika je najbitnija, i nju ću detaljno objasniti kroz primer. Posmatraćemo slučaj kada i Set i WeakSet imaju za kluč svojstva objekat

Set i garbage collector

Kod kompajler dodje do linije gde je IIFE i izvrši je nama više nije potrebna promenjiva “a”, ali garbage collector je neće obrisati iz memorije.

WeakSet i garbage collector

Kod kompajler dodje do linije gde je IIFE i izvrši je nama više nije potrebna promenjiva “b”, pošto je referenca na taj objekat “labava” (eng. weak), garbage collector će obrisati datu promenjivu i osloboditi memoriju.

Zaključak iz prethodnog primera je da je WeakSet ima bolje iskorišćenje memorije nego kod Set tipa podataka gde može doći do “curenja” memorije (eng. memory leak).

Podelite:

Ostavite komentar