<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Slaven Bunijevac</title>
    <description>The latest articles on Forem by Slaven Bunijevac (@bslaven).</description>
    <link>https://forem.com/bslaven</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F935210%2F206ac042-35b1-4558-b81f-10f62807e3a0.jpg</url>
      <title>Forem: Slaven Bunijevac</title>
      <link>https://forem.com/bslaven</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bslaven"/>
    <language>en</language>
    <item>
      <title>Razlika između 'type' i 'interface' u TypeScriptu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Sat, 13 Apr 2024 12:52:47 +0000</pubDate>
      <link>https://forem.com/bslaven/razlika-izmedu-type-i-interface-u-typescriptu-4jha</link>
      <guid>https://forem.com/bslaven/razlika-izmedu-type-i-interface-u-typescriptu-4jha</guid>
      <description>&lt;h2&gt;
  
  
  TypeScript je sjajan alat koji donosi nove mogućnosti, koje ne postoje u JavaScriptu. Glavna stvar koju TypeScript razlikuje od JavaScripta je to što možemo definisati tipove podataka sa kojim radimo.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Jedan od načina da se definiše tip podataka je korištenje tipa, odnosno &lt;code&gt;type&lt;/code&gt; aliasa, a drugi je korištenje interfejsa, odnosno &lt;code&gt;interface&lt;/code&gt;. Upravo razlika između ova dva načina je tema ovog teksta.
&lt;/h2&gt;




&lt;h4&gt;
  
  
  Uvod
&lt;/h4&gt;

&lt;p&gt;U ovom uvodu ću da postavim osnovno okruženje i kontekst koji će biti isti za sve sljedeće primjere, da se ne bi ponavljao u narednim poglavljima.&lt;/p&gt;

&lt;p&gt;Recimo na primjer da imam neku komponentu &lt;code&gt;User&lt;/code&gt; koja će dobiti podatke o korisniku u &lt;code&gt;props&lt;/code&gt; objektu koji ćemo prema TypeScript konvenciji opisati/definisati sa &lt;code&gt;UserProps&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63d03rht5xgiw6ycqh8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63d03rht5xgiw6ycqh8e.png" alt="react component with ts props example" width="702" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ako pokušam da opišem objekat sa &lt;code&gt;UserProps&lt;/code&gt;, a taj &lt;code&gt;UserProps&lt;/code&gt; ne postoji nigdje TypeScript će me upozoriti.&lt;/p&gt;




&lt;h4&gt;
  
  
  Osnovna sintaksa
&lt;/h4&gt;

&lt;p&gt;Postoje dvije osnovne sintaksičke razlike. Tip koristi ključnu riječ &lt;code&gt;type&lt;/code&gt;, a interfejs &lt;code&gt;interface&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgd0m2fn7v9imsu7psit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgd0m2fn7v9imsu7psit.png" alt="Basic example of types and interfaces" width="780" height="421"&gt;&lt;/a&gt;&lt;br&gt;
Druga razlika je što tip koristi znak jednakosti, a interfejs ne koristi.&lt;/p&gt;

&lt;p&gt;U narednim primjerima ću nazive tipova počinjati sa slovom 'T', a interfejse sa slovom 'I'. Ovo se može pronaći negdje kao konvencija, ali nije neophodno raditi.&lt;/p&gt;




&lt;h4&gt;
  
  
  Proširivanje i naslijeđivanje
&lt;/h4&gt;

&lt;p&gt;Recimo na primjer da imam nekog korisnika kog sam definisao preko tipa kao &lt;code&gt;TUserProps&lt;/code&gt;, ali kasnije dodajem definiciju za administratora koji ima sva svojstva kao i korisnik, plus još neka.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j3wiw0y0jei9i2sv5aw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j3wiw0y0jei9i2sv5aw.png" alt="ts type intersection example" width="661" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kod tipova se ovo zove ukrštanje ili preklapanje (ENG: 'intersection'), odnosno dva tipa se preklapaju po nekim svojstvima. Znak ampersand ('&amp;amp;') sam iskoristio da spojim već definisani TUserProps i nova svojstva koja želim da dodati administratoru.&lt;/p&gt;

&lt;p&gt;Interfejs sa druge strane koristi ključnu riječ &lt;code&gt;extends&lt;/code&gt; da spoji dvije definicije. Ova sintaksa će biti poznata ljudima koji koriste klase u JavaScriptu/TypeScriptu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg07sc9l7g8qlmvq9vy05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg07sc9l7g8qlmvq9vy05.png" alt="ts interface extends example" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kod interfejsa se ova tehnika zove naslijeđivanje. Dakle, objekat IAdminProps će naslijediti sva svojstva koja postoje u objektu IUserProps &lt;code&gt;ime&lt;/code&gt; i &lt;code&gt;godine&lt;/code&gt;, pa sam mu dodao &lt;code&gt;ulogu&lt;/code&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  Objekti i sve ostalo
&lt;/h4&gt;

&lt;p&gt;Interfejsom se mogu definisati samo objekti, dok se tipom mogu definisati objekti, ali i sve ostalo.&lt;/p&gt;

&lt;p&gt;Ako želim da definišem objekat mogu koristiti interfejs ili tip.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feibtcmgge5kyxvfqewxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feibtcmgge5kyxvfqewxv.png" alt="interface example to create an object in ts" width="690" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Međutim, ako želim da definišem bilo šta drugo moram koristiti tip.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbeie43d70n5xsv3536we.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbeie43d70n5xsv3536we.png" alt="define a primitive with type alias" width="800" height="224"&gt;&lt;/a&gt;&lt;br&gt;
Nije moguće koristiti interfejs za definisanje primitivnih tipova.&lt;/p&gt;




&lt;h4&gt;
  
  
  Unije
&lt;/h4&gt;

&lt;p&gt;Tipove je moguće koristiti da definisanje unija (skupova). Lako se može dogoditi na primjer da želimo da pohranimo neku primitivnu vrijednost, ali i da eventualno pratimo niz takvih vrijednosti. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7rpi93td26rblz1dxe4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7rpi93td26rblz1dxe4.png" alt="types with unions example" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Utility tipovi
&lt;/h4&gt;

&lt;p&gt;U TypeScriptu postoje 'utility' tipovi koji nam omogućuju neke posebne funkcionalnosti. Recimo da npr. želim da iskoristim &lt;code&gt;Omit&lt;/code&gt; utility tip kako bi izostavio neko svojstvo objekta.&lt;/p&gt;

&lt;p&gt;Sa &lt;code&gt;type&lt;/code&gt; aliasom bi to izgledalo ovako.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewfkroc9xs7qjz6lsotc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewfkroc9xs7qjz6lsotc.png" alt="type alias with utility types" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo je tehnički moguće uraditi i sa interfejsom, ali uz mnogo ružniju sintaksu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyoyt0978e03x9f1ohk83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyoyt0978e03x9f1ohk83.png" alt="interface with utility types in ts" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Morao sam iskoristiti ključnu riječ &lt;code&gt;extends&lt;/code&gt;, a morao sam staviti i prazne vitičaste zagrade na kraju deklaracije.&lt;/p&gt;




&lt;h4&gt;
  
  
  Tuple
&lt;/h4&gt;

&lt;p&gt;Tupl (ENG. Tuple) je specijalna vrsta niza u TypeScriptu. To je niz koji ima fiksno definisanu dužinu. Dužina tupla se ne može naknadno mijenjati.&lt;/p&gt;

&lt;p&gt;Ako bi želio definisati neki tip kao tupl preko &lt;code&gt;type&lt;/code&gt; aliasa, to je lako uraditi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tb2qi9ylcd05orube7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tb2qi9ylcd05orube7j.png" alt="example of defining tuples with interfaces and types" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se vidi iz primjera korištenje interfejsa je mnogo obimnije i teže za čitanje. Tip je za ove situacije mnogo bolje rješenje.&lt;/p&gt;




&lt;h4&gt;
  
  
  Izvlačenje
&lt;/h4&gt;

&lt;p&gt;Tip se može iskoristiti da se izvuče neka struktura iz objekta. Recimo na primjer da imam neki objekat &lt;code&gt;stan&lt;/code&gt;. Ako želim da izvučem npr. svojstvo 'specifikacije' iz tog objekta tip je sjajno rješene.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs43ldz1h7wd2n0ci8z0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs43ldz1h7wd2n0ci8z0k.png" alt="extraction with type alias in typescript" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iskoristio sam svojstvo iz objekta kako bi definisao tip.&lt;/p&gt;

&lt;p&gt;Ovo je moguće i sa interfejsom, ali kao što se vidi iz primjera sa unijama i tuplovima mora se koristiti ključna riječ &lt;code&gt;extends&lt;/code&gt;, tako da je pristup sa tipovima mnogo bolji.&lt;/p&gt;




&lt;h4&gt;
  
  
  Spajanje i ponovna deklaracija
&lt;/h4&gt;

&lt;p&gt;Jedna od situacija na koje se sasvim realno može naići je da se na projektu nađu definisane dvije strukture sa istim imenom. Ako se to dogodi sa interfejsom one će jednostavno biti spojene.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwsus0gmxpwake1th27q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwsus0gmxpwake1th27q.png" alt="Image description" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se vidi u primjeru sva svojstva iz svakog interfejsa su obavezna u novom objektu &lt;code&gt;user&lt;/code&gt;. Ovo može biti korisno, ako se na primjer koristi neka biblioteka iz koje dobijamo neki interfejs, pa želimo da ga proširimo.&lt;/p&gt;

&lt;p&gt;Međutim, može biti i veoma loše jer lako može doći do neželjenih izmjena interfejsa.&lt;/p&gt;

&lt;p&gt;Sa tipovima ovo nije moguće. TypeScript će odmah izbaciti grešku ukoliko se pojave dva tipa sa istim nazivom.&lt;/p&gt;




&lt;h4&gt;
  
  
  Klase
&lt;/h4&gt;

&lt;p&gt;Postoji jedno pogrešno mišljenje na koje se može naići kada se radi sa TypeScriptom, a to je da je klase moguće opisati/definisati samo pomoću interfejsa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrfg37t0c75w2fewip1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrfg37t0c75w2fewip1l.png" alt="class with interfase example" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Klasu je najnormalnije moguće definisati sa tipom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecyi87pkpoq44lx7ocp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecyi87pkpoq44lx7ocp3.png" alt="class with type example" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bilo koja od ove dvije opcije je validna.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ukratko
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interfejs može definisati samo objekte, tip može objekte i sve ostalo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sintaksa za proširivanje, unije, utility tipove je mnogo bolja ako se koristi &lt;code&gt;type&lt;/code&gt; alias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interfejsi su otvoreni i podložni neželjenim izmjenama, dok su tipovi zatvoreni.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nije tačno da se klase mogu definisati samo pomoću interfejsa. Klase bez problema mogu biti definisane tipom.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Samo nešto malo o 'useEffect' u Reactu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Fri, 05 Apr 2024 08:06:25 +0000</pubDate>
      <link>https://forem.com/bslaven/samo-nesto-malo-o-useeffect-u-reactu-4mn0</link>
      <guid>https://forem.com/bslaven/samo-nesto-malo-o-useeffect-u-reactu-4mn0</guid>
      <description>&lt;h2&gt;
  
  
  Tokom svog životnog ciklusa komponenta će često koristiti neke eksterne sisteme ili API-eve radi funkcionalnosti koju oni donose.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  S obzirom da te konekcije često zavise od dinamičnih dijelova aplikacije ili komponente, npr. state-a koji se mijenja, potrebno je omogućiti komponenti da prati te dijelove, te da se u skladu sa potrebama reaguje, da se ponovo izvrši poziv na eksterni sistem ili eventualno da se prekine konekcija sa nekim eksternim sistemom.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Tu na scenu stupa &lt;code&gt;useEffect&lt;/code&gt; hook.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NAPOMENA&lt;/strong&gt;: &lt;em&gt;Termin 'eksterni sistem' sam pozajmio iz React-ove &lt;a href="https://react.dev/reference/react/useEffect"&gt;dokumentacije&lt;/a&gt;. Oni 'eksternim sistemom' smatraju sve šta nije pod kontrolom React-a. To podrazumjeva dodavanje &lt;code&gt;eventListenera&lt;/code&gt;, &lt;code&gt;setInterval()&lt;/code&gt; metoda, te eventualni poziv na neki REST API resurs.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Šta možete ovdje pročitati?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Šta je &lt;code&gt;useEffect&lt;/code&gt; hook?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Koji su parametri u &lt;code&gt;useEffect&lt;/code&gt; hook?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primitivni i referentni tipovi.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Šta radi &lt;code&gt;return&lt;/code&gt; dio?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zaključak.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Šta je &lt;code&gt;useEffect&lt;/code&gt; hook?
&lt;/h4&gt;

&lt;p&gt;Jedna od specijalnih funkcija koje komponenta ima na raspolaganju je &lt;code&gt;useEffect&lt;/code&gt;. Ove specijalne funkcije se u React-u zovu hooks, pa ću ih i ja u ovom tekstu tako zvati.&lt;br&gt;
Ova funkcija nam omogućuje da pratim bilo kakve sporedne efekte u komponenti. Svaki put kada pokušamo da se konektujemo na neki eksterni sistem vjerovatno će biti potrebno koristiti &lt;code&gt;useEffect&lt;/code&gt;.&lt;br&gt;
Svaki put kada se promijeni neki dinamični dio, npr. &lt;code&gt;state&lt;/code&gt;, komponente/aplikacije &lt;code&gt;useEffect&lt;/code&gt; će se koristiti da se prati da li treba nešto uraditi na osnovu izmijenjenih vrijednosti.&lt;br&gt;
Kao i svaki hook u React-u, &lt;code&gt;useEffect&lt;/code&gt; je neophodno koristiti, unutar komponente, na najvišem nivou (&lt;em&gt;top level&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs9t66vv6j333uetsvdr.png" alt="basic useEffect component with comments" width="800" height="557"&gt;
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Koji su parametri u &lt;code&gt;useEffect&lt;/code&gt; hook?
&lt;/h4&gt;

&lt;p&gt;Prvi parametar je funkcija koja će biti pozvana jednom sigurno, kada se komponenta prvi put postavi. U ovoj funkciji je sva funkcionalnost koju želim da obavim kada &lt;code&gt;useEffect&lt;/code&gt; registruje promjenu. U ovoj funkciji mogu da spojim komponentu nekim eksternim sistemom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90udf0zs28igvdeofdv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90udf0zs28igvdeofdv9.png" alt="Some examples of events in useEffect" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo su samo neke od stvari koje se mogu uraditi unutar &lt;code&gt;useEffect&lt;/code&gt; hook-a, s tim da neke od njih dolaze i sa određenim 'dodatnim objašnjenima'. Npr. slanje zahtjeva na neki API resurs (&lt;em&gt;red 9&lt;/em&gt;) bi trebalo da se razdvoji od same logike komponente ili kroz neki drugi hook ili korištenjem neke dodatne biblioteke, ali o tome u nekom drugom tekstu.&lt;br&gt;
Drugo objašnjenje je što svaki put kada se postavi neki 'event listener' (&lt;em&gt;red 6&lt;/em&gt;) isti taj 'event listener' bi treblao skinuti kada se komponenta ukloni sa stranice. Više o tome u dijelu 'Šta radi &lt;code&gt;return&lt;/code&gt; dio?'.&lt;/p&gt;

&lt;p&gt;Drugi parametan prilikom pozivanja &lt;code&gt;useEffect&lt;/code&gt; hooka je niz 'dependency-a' (&lt;em&gt;red 12&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAPOMENA&lt;/strong&gt;: &lt;em&gt;Riječ 'zavisnost' jeste nezgodan prevod za 'dependency' u ovom kontekstu, ali ona odlično označava ono šta te vrijednosti predstavljaju i za šta služe. Više o tome u daljem tekstu. Treba imati u vidu da se u ovom tekstu mogu naći obije verzije, 'dependency' i 'zavisnost'.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Prvo šta treba naglasiti je da drugi parametar, niz dependency-a, nije neophodno navesti, kao što se vidi u ovom primjeru.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5osygh2omkdw9828albe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5osygh2omkdw9828albe.png" alt="useEffect example without a dependency array" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nedostatak ovog niza će značiti da će funkcija koja je prvi parametar biti pozvana svaki put kada se komponenta ponovo renderuje. U velikoj većini slučajeva, ako ne i uvijek, to ne želimo. Hook &lt;code&gt;useEffect&lt;/code&gt; se bavi sporednim efektima, situacijama kada želimo da izađemo iz React-ovog ekosistema, te bi bilo previše da se to svaki put radi kada se komponenta renderuje.&lt;/p&gt;

&lt;p&gt;Druga opcija za ovaj niz je da se ostavi prazan. Dakle, &lt;code&gt;useEffect&lt;/code&gt; nema nikakvih dependency-a. Evo primjera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ztudmgk75s42hbd6cz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ztudmgk75s42hbd6cz3.png" alt="useEffect example witha an empty dependecy array" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U slučaju kada postavimo prazan niz, funkcija koja je prvi parametar će biti pozvana samo jednom, kada komponenta bude prvi put renderovana. Evo jednog primjera gdje imam &lt;code&gt;count&lt;/code&gt; varijablu čiju vrijednost povećavam za jedan kada kliknem na &lt;code&gt;button&lt;/code&gt;. Pored toga imam i &lt;code&gt;useEffect&lt;/code&gt; sa praznim nizom dependency-a.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhiu9ln5ytjb3fqq48f6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhiu9ln5ytjb3fqq48f6.png" alt="useEffect example with empty dependency array and state change" width="800" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što sam naveo u komentarima u primjeru, promjena state-a će uzrokovati da se komponenta ponovo renderuje, ali &lt;code&gt;useEffect&lt;/code&gt; funkcija neće biti ponovo pozvana zato što je niz dependecy-a prazan.&lt;/p&gt;

&lt;p&gt;Sada se postavlja pitanje šta se može staviti u ovaj niz? Odgovor je bilo šta, odnosno bilo koju vrijednost/varijablu koju želim da &lt;code&gt;useEffect&lt;/code&gt; prati. Kao što prevod 'zavisnost' govori, u tom slučaju moj &lt;code&gt;useEffect&lt;/code&gt; će &lt;strong&gt;zavisiti&lt;/strong&gt; od te vrijednosti/varijable. Iskoristiću gore navedeni primjer i postaviti da varijablu &lt;code&gt;count&lt;/code&gt; kao zavisnost u &lt;code&gt;useEffect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23tl7xwb6ey9nqnwzaiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23tl7xwb6ey9nqnwzaiw.png" alt="useEffect tracks state change and reruns the function example" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U ovom slučaju &lt;code&gt;useEffect&lt;/code&gt; zavisi od varijable &lt;code&gt;count&lt;/code&gt; i pozvaće svoju funkciju prvi put kada se komponenta prvi put renderuje, te svaki put kada registruje promjenu u vrijednosti varijable &lt;code&gt;count&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Prilikom postavljanja vrijednosti u niz dependency-a treba obratiti pažnju da sama funkcija ne mijenja tu varijablu. Jer ako funkcija mijenja varijablu od koje &lt;code&gt;useEffect&lt;/code&gt; zavisi to će uzrokovati beskonačnu petlju.&lt;/p&gt;




&lt;h4&gt;
  
  
  Primitivni i referentni tipovi
&lt;/h4&gt;

&lt;p&gt;U JavaScriptu postoje dvije vrste tipova podataka. Svi koji koriste React vjerovatno su u poznati sa referentnim i primitivnim tipovima. Detaljnije o razlikama između ova dva tipa sam pisao u tekstu koji možete pročitati &lt;a href="https://dev.to/bslaven/tipovi-u-javascriptu-eef"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Evo kratkog sažetka razlike koja nam je bitna za današnju temu.&lt;/p&gt;

&lt;p&gt;Primitivni tipovi u Javascriptu su &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;. Oni se porede po vrijednosti. Ako na primjer imam dvije varijable i obije nose vrijednost npr. broja 4 i probam da ih uporedim dobiću &lt;code&gt;true&lt;/code&gt;. Evo još nekoliko primjera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8w8xw00kdlrwdm9gcl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8w8xw00kdlrwdm9gcl3.png" alt="Iprimitive comparison in JavaScript example" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo je očekivano ponašanje. Međutim, referentni tipovi se prilikom poređenja ponašaju malo drugačije. Referentni tipovi u JavaScriptu su objekti, nizovi i funkcije. Recimo npr. da imam dva objekta u primjeru dole:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyfhizflolzh01jw6jp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyfhizflolzh01jw6jp3.png" alt="object comparison in JavaScritp example" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poređenje dva objekta koji su po sadržaju identični daje &lt;code&gt;false&lt;/code&gt; jer se objekti ne porede po vrijednosti/sadržaju, nego po referenci. Referenca upućuje na njihovu lokaciju u memoriji, a lokacija u memoriji dva objekta nije ista. Ovo je izuzetno važna poenta prilikom korištenja &lt;code&gt;useEffect&lt;/code&gt; hook-a.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3cbsnnxzeo9pp89rgf0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3cbsnnxzeo9pp89rgf0.png" alt="object as a dependency in useEffect" width="800" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U ovom primjeru &lt;code&gt;useEffect&lt;/code&gt; će biti pozvan svaki put kada promijenim 'count' iako taj &lt;code&gt;useEffect&lt;/code&gt; uopšte ne koristi &lt;code&gt;count&lt;/code&gt;, odnosno ne zavisi od njega. To se dešava zato što će se komponenta svaki put ponovo renderovati kada se promijeni state. Svaki put kada se komponenta ponovo renderuje ona će kreirati novi objekat &lt;code&gt;person&lt;/code&gt;, sa novom referencom.&lt;/p&gt;

&lt;p&gt;Prilikom novog renderovanja komponente &lt;code&gt;useEffect&lt;/code&gt; će uporediti prethodnu vrijednost objekta i novu vrijednost objekta i oni će biti drugačiji. Biće drugačiji jer su to dva različita objekta po referenci. Kao što sam rekao, njihov sadržaj se nije promijenio, ali referenca jeste. Objekti po tome nisu isti i &lt;code&gt;useEffect&lt;/code&gt; će bit ponovo pozvan.&lt;/p&gt;

&lt;p&gt;Rješenje za ovo je da se pobrinemo da naš &lt;code&gt;useEffect&lt;/code&gt; zavisi isključivo od primitivnih vrijednosti, koje se porede po vrijednosti, a ne po referenci.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer7abqathospkc598m6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer7abqathospkc598m6t.png" alt="object property as a dependency in useEffect" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U ovom slučaju iako je objekat &lt;code&gt;person&lt;/code&gt; kreiran svaki put kada se komponenta ponovo renderuje, &lt;code&gt;useEffect&lt;/code&gt; ne zavisi od objekta nego od primitivne vrijednosti &lt;code&gt;name&lt;/code&gt; unutar tog objekta. Ako se vrijenost za &lt;code&gt;name&lt;/code&gt; ne promijeni funkcija u &lt;code&gt;useEffect&lt;/code&gt; neće biti pozvana prilikom novog renderovanja komponente.&lt;/p&gt;




&lt;h4&gt;
  
  
  Šta radi &lt;code&gt;return&lt;/code&gt; dio?
&lt;/h4&gt;

&lt;p&gt;Kao i svaka funkcija, funkcija koja je prvi parametar unutar &lt;code&gt;useEffect&lt;/code&gt; ima svoju &lt;code&gt;return&lt;/code&gt; vrijednost. Postavljanje &lt;code&gt;return&lt;/code&gt; dijela &lt;strong&gt;nije&lt;/strong&gt; obavezno. To je funkcija koja će biti pozvana kada se komponenta skine/obriše (&lt;em&gt;unmount&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2zcjdfoeajta4m8xmk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2zcjdfoeajta4m8xmk8.png" alt="example of useEffect cleanup function" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upravo u ovoj funkciji će se skinuti &lt;code&gt;eventListener&lt;/code&gt; o kom sam govorio u ranijem dijelu ovog teksta. Ovdje se može prekinuti konekcija sa nekom sobom za chat ili će se zaustaviti neki postavljeni interval.&lt;/p&gt;




&lt;h4&gt;
  
  
  Zaključak
&lt;/h4&gt;

&lt;p&gt;Iako na prvi pogled djeluje kao da su &lt;code&gt;useEffect&lt;/code&gt; i neki drugi 'hooksi' zamjena za ono šta rade metode životnog ciklusa u &lt;code&gt;class&lt;/code&gt; komponentama, najbolje je razmišljati o njima kao potpuno drugačiji pristup životnom ciklusu metoda. Oba pristupa imaju svoju primjenu u zavisnosti koje komponente se koriste. Više o osnovnim razlikama između funkcijskih i &lt;code&gt;class&lt;/code&gt; komponenti u React-u sam pisao u tekstu koji možete pročitati &lt;a href="https://dev.to/bslaven/class-komponente-i-funkcijske-komponente-u-reactu-52og"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  U kratkim crtama:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Obavezno navedite niz dependecy-a/zavisnosti, makar on bio prazan.&lt;/li&gt;
&lt;li&gt;Nemojte stavljati objekte u niz dependecy-a.&lt;/li&gt;
&lt;li&gt;Ne dozvolite da &lt;code&gt;useEffect&lt;/code&gt; zavisi od vrijednosti/varijable koju sam mijenja.&lt;/li&gt;
&lt;li&gt;Uvijek očistite/uklonite konekciju sa eksternim sistemom prije skidnaja komponente.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Ukratko o useState hook u Reactu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Tue, 26 Mar 2024 07:21:06 +0000</pubDate>
      <link>https://forem.com/bslaven/ukratko-o-usestate-hook-u-reactu-2mcc</link>
      <guid>https://forem.com/bslaven/ukratko-o-usestate-hook-u-reactu-2mcc</guid>
      <description>&lt;h2&gt;
  
  
  Pitanje kontrole state-a u Reactu je jedno od najvažnijih kada radimo sa ovom bibliotekom. U ovom tekstu ću se baviti &lt;code&gt;useState&lt;/code&gt; funkcionalnošću, koja je donijela kontrolu state-a (&lt;em&gt;state management&lt;/em&gt;) u funkcijske komponente koju do uvođenja &lt;code&gt;hooks-a&lt;/code&gt; nije imala mogućnost postavljanja i kontrole state-a.
&lt;/h2&gt;




&lt;h3&gt;
  
  
  Šta možete ovdje pročitati:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Šta je useState hook?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Osnovna upotreba.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promjena statea.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Šta je &lt;code&gt;useState&lt;/code&gt; hook?
&lt;/h4&gt;

&lt;p&gt;Ovaj &lt;code&gt;useState&lt;/code&gt; hook je funkcionalnost koja nam omogućuje da postavljamo i kontrolišemo (mijenjamo) state u funkcijskim kompoentama.&lt;br&gt;
State u suštini čine svi podaci u komponenti koji se će možda mijenjati vremenom, odnosno od jednog rendera do drugog.&lt;/p&gt;




&lt;h4&gt;
  
  
  Osnovna upotreba
&lt;/h4&gt;

&lt;p&gt;Prva stvar koju treba istaći vezano za &lt;code&gt;useState&lt;/code&gt; hook je da on može biti korišten samo u funkcijskim komponentama. Class komponente imaju drugačiji način postavljanja i kontrole statea i to kroz &lt;code&gt;this.state&lt;/code&gt; objekat u konstruktoru.&lt;br&gt;
Više o osnovnim razlikama, uključujući i state, između funkcijskih i class komponenti možete pročitati u &lt;a href="https://dev.to/bslaven/class-komponente-i-funkcijske-komponente-u-reactu-52og"&gt;ovom&lt;/a&gt; tekstu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VAŽNA NAPOMENA&lt;/strong&gt;: &lt;em&gt;Veoma važna stavka za korištenje bilo kog hooks-a, pa samim time i &lt;code&gt;useState&lt;/code&gt;, je da njih obavezno treba pozivati na vrhu komponente, odnosno na najvišem nivou. Hooks-i se nikako ne mogu koristiti unutar petlji, funkcija, uslovno ili unutar bilo kog drugog bloka koda. Isključivo u najvišem nivou komponente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Da bi se koristio &lt;code&gt;useState&lt;/code&gt; potrebno ga je uvesti iz &lt;code&gt;react&lt;/code&gt; biblioteke. Najčešća konvencija je da to bude na vrhu fajla u kom se koristi (&lt;em&gt;red 1&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgvm1su1le3ywzezphno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgvm1su1le3ywzezphno.png" alt="basic example of a functional react component with useState hook" width="766" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prilikom postavljanja statea u funkcijskim komponentama &lt;code&gt;useState&lt;/code&gt; se poziva kao funkcija koja može dobija jedan argument. Ja sam u ovom primjeru kao kao taj argument postavio prazan string (&lt;em&gt;red 4&lt;/em&gt;). Upravo taj argument će biti inicijalna vrijednost varijable &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ista ta funkcija vraća dvije vrijednosti, koje sam destrukturisanjem izvukao u jedan niz. Detaljnije o destrukturisanju u JavaScriptu sam pisao u tekstu koji možete pročitati &lt;a href="https://dev.to/bslaven/destrukturisanje-u-javascriptu-tvoj-dobar-drugar-m9p"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Postoji i drugi način korištenja &lt;code&gt;useState&lt;/code&gt; hooka, a to je da se veže direktno na React objekat kao &lt;code&gt;React.useState()&lt;/code&gt;. Ja lično smatram da je sintaksa sa uvozom mnogo ljepša za korištenje i čitanje.&lt;/p&gt;

&lt;p&gt;Inicijalna vrijednost može biti bilo šta, string, broj, boolean, objekat ili niz. Inicijalna vrijednost može čak biti i rezultat pozivanja neke funkcije. Na primjer ovako:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztoglmwh3dn84yybnbls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztoglmwh3dn84yybnbls.png" alt="example of useState initialization in react with a function call" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imam jedan jednostavan primjer funkcije (&lt;em&gt;red 4&lt;/em&gt;) koja vraća prazan string. Onda sam tu funkciju jednostavno pozvao unutar &lt;code&gt;useState&lt;/code&gt; funkcije da dobijem gore navedeni prazan string kao inicijalnu vrijednost mog statea (&lt;em&gt;red 9&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Međutim, ovakva inicijalizacija statea nosi jedan problem. Taj problem je što je pozivanje ove funkcije &lt;code&gt;customNameSetter&lt;/code&gt; potencijalno skupa/spora operacija. To je problem jer će ova funkcija biti pozivana svaki put kada se komponenta renderuje. Ne želimo da se potencijalno skupa operacija ponavlja svaki put kada se komponenta renderuje, ako nema potrebe za tim.&lt;/p&gt;

&lt;p&gt;Rješenje za to je da se umjesto skupe operacije kao argument proslijedi obična funkcija koja će vratiti rezultat pozivanja skupe operacije.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90s61hat1jy9dto3ep68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90s61hat1jy9dto3ep68.png" alt="use function to call initialize state with a potentially expensive function" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
Ovo će osigurati da potencijalno skupa funkcija &lt;code&gt;customNameSetter&lt;/code&gt; bude pozvana samo jednom, kada se komponenta prvi put renderuje.&lt;/p&gt;




&lt;h4&gt;
  
  
  Promjena statea
&lt;/h4&gt;

&lt;p&gt;Jedna od osnovnih karakteristika statea u Reactu je da će se vremenom mijenjati. Upravo zato je default ponašanje &lt;code&gt;useState&lt;/code&gt; hook-a da vrati i drugu vrijednost u našem nizu, a to je funkcija kojom se mijenja state.&lt;/p&gt;

&lt;p&gt;Kako bi na najbolji način prikazao promjenu statea, primijeniću primjer. Neću više koristiti varijablu &lt;code&gt;name&lt;/code&gt; nego &lt;code&gt;count&lt;/code&gt;, dakle neki brojač koji se stalno mijenja. Postaviću njegovu početnu vrijednost na nulu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7fht4hnoudzlfbexti3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7fht4hnoudzlfbexti3.png" alt="replace name with count as state" width="800" height="391"&gt;&lt;/a&gt;&lt;br&gt;
Funkcija &lt;code&gt;setCount&lt;/code&gt; će biti pozvana svaki put kad želim da promijenim vrijednost za &lt;code&gt;count&lt;/code&gt;. To ću uraditi tako što ću na klik tastera '+' povećati vrijednost varijable &lt;code&gt;count&lt;/code&gt; za jedan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpqkg1rtmuuu4cd36fsa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmpqkg1rtmuuu4cd36fsa.png" alt="change count state on button click example" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U gornjem primjeru vidim da ću trenutnoj vrijednosti za &lt;code&gt;count&lt;/code&gt; dodati jedan. Dakle nula plus jedan je jednako jedan. Jedan će onda biti prikazano na ekranu.&lt;br&gt;
Ovakav pristup je sasvim ispravan, ali postoji jedna začkoljica. Ako pokušam, iz bilo kog razloga, da vežem više ovih promjena state jednu za drugom to neće funkcionisati.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffq2hp0lbppjc9a32e3dk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffq2hp0lbppjc9a32e3dk.png" alt="multiple consecutive state changes in react" width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo neće promijeniti vrijednost &lt;code&gt;count&lt;/code&gt; varijable za četiri kako bi se moglo očekivati jer sam četiri puta pozvao &lt;code&gt;setCount&lt;/code&gt;. Vrijednost &lt;code&gt;count&lt;/code&gt; koja će biti prikazana na ekranu će biti 1.&lt;/p&gt;

&lt;p&gt;Ovo se dešava jer React sakuplja sve ove pozive zajedno i svi pozivi &lt;code&gt;setCount&lt;/code&gt; funkcije mijenjaju state za sljedeći render.&lt;br&gt;
Svaki poziv &lt;code&gt;setCount&lt;/code&gt; funkcije koristi inicijalnu vrijednost varijable &lt;code&gt;count&lt;/code&gt; koju povećava za jedan. Operacija će uvijek biti nula plus jedan daje jedan.&lt;/p&gt;

&lt;p&gt;Da bi se ovo izbjeglo potrebno je koristiti funkcijsku verziju izmjene statea. Proslijedim 'updater' funkciju u &lt;code&gt;setCount&lt;/code&gt; i unutar nje mijenjam state na osnovu prethodnog statea. Ta funkcija ima automatski jedan parametar, taj parametar je prethodna vrijednost state, odnosno u našem primjeru varijable &lt;code&gt;count&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vggdz9jo0znkax8tx99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vggdz9jo0znkax8tx99.png" alt="multiple consecutive state changes in react with a function example" width="800" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovdje je razlika u tome što React ne sakuplja ove 'updater' funkckije nego će ih u sljedećem renderu pozvait istim redoslijedom.&lt;/p&gt;

&lt;p&gt;Imam funkciju koja vraća prethodni &lt;code&gt;count&lt;/code&gt; uvećan za jedan. Na ovaj način svaki sljedeći poziv &lt;code&gt;setCount&lt;/code&gt; funkcije će koristiti 'najsvježiju', odnosno posljednju vrijednost za &lt;code&gt;count&lt;/code&gt;. Kada prvi poziv &lt;code&gt;setCount&lt;/code&gt; poveća &lt;code&gt;count&lt;/code&gt; za jedan, sljedeći poziv će uzeti rezultat prethodnog poziva i njega uvećati za jedan, itd. itd.&lt;/p&gt;

&lt;p&gt;Još jedna stvar kod izmjene statea na koju moramo obratiti pažnju je izmjena objekata i nizova. Recimo na primjer da imam state koji nosi podatke za jednog korisnika, &lt;code&gt;user&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favmzjr2btgr6ef83d8es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favmzjr2btgr6ef83d8es.png" alt="object as state example" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postavio sam inicijalnu vrijednost varijable da bude objekat koji ima dva elementa &lt;code&gt;name&lt;/code&gt; i &lt;code&gt;age&lt;/code&gt;. Obije ove vrijednosti će biti ispravno prikazane u ovom primjeru.&lt;/p&gt;

&lt;p&gt;Međutim, ako pokušam na klik tastera da promijenim &lt;code&gt;age&lt;/code&gt; na 35, ne mogu jednostavno pozvati &lt;code&gt;setUser&lt;/code&gt; i promijeniti &lt;code&gt;age&lt;/code&gt; na 35.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2aw7ule2v4f9p0xo88h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2aw7ule2v4f9p0xo88h.png" alt="change object state example" width="800" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo ne mogu uraditi jer ću izgubiti &lt;code&gt;name&lt;/code&gt; iz svog statea. Mora se navesti ostatak objekta, pa onda dodati svojstvo koje mijenjam. Da bi to postigao moram ponovo koristiti funkcijsku verziju izmjene statea. Koristiću funkciju koja kao parametar dobija prethovnu verziju statea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gd0v2gt4xam8g6skv6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gd0v2gt4xam8g6skv6z.png" alt="change object state functionally example" width="800" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iskoristio sam &lt;code&gt;spread (...)&lt;/code&gt; operator kojim sam sačuvao sva neizmjenjena svojstva, pa ih zajedno sa izmijenjenim vratio kao jedan objekat. Ovdje sam za primjer koristio objekat, ali sva ista pravila važe i za nizove.&lt;/p&gt;

&lt;p&gt;U ranijem primjeru promjene &lt;code&gt;count&lt;/code&gt; varijable, kao i u ovom posljednjem primjeru sa promjenom &lt;code&gt;user&lt;/code&gt; varijable vidi se jedan zajednički obrazac kog se treba pridržavati kad je promjena statea u Reactu u pitanju. Taj obrazac je da se uvijek koristi funkcijska verzija izmjene statea kada nova zavisi od toga koja je bila prethodna vrijednost.&lt;/p&gt;

&lt;p&gt;Na osnovu ovog se lako može postaviti pitanje zašto ne bi uvijek koristili funkcijsku verziju izmjene statea da bi bili sigurni. To se svakako može uraditi, ali u nekiim situacijama zaista nema potrebe. Ako nova vrijednost ne zavisi od stare ne mora se koristiti funkcijska verzija izmjena statea.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>web3</category>
      <category>react</category>
    </item>
    <item>
      <title>Class komponente i funkcijske komponente u Reactu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Mon, 26 Feb 2024 21:08:46 +0000</pubDate>
      <link>https://forem.com/bslaven/class-komponente-i-funkcijske-komponente-u-reactu-52og</link>
      <guid>https://forem.com/bslaven/class-komponente-i-funkcijske-komponente-u-reactu-52og</guid>
      <description>&lt;h4&gt;
  
  
  Komponente su osnovni element React biblioteke. Međutim, kada je  u pitanju kreiranje komponenti u Reactu, postoje dva pristupa: class komponente i funkcijske kompontente.
&lt;/h4&gt;

&lt;h4&gt;
  
  
  U ovom tekstu ću objasniti osnovne razlike između ova dva načina kreiranja komponenti.
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Napomena&lt;/strong&gt;: &lt;em&gt;Kada je React u pitanju često će se istovremeno koriste termini biblioteka i 'framework'. React-ova dokumentacija ga navodi kao biblioteka, tako da ću ja u ovom tekstu koristiti taj termin. Međutim, često se može naći da React nazivaju 'framework'.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Osnovna sintaksa
&lt;/h3&gt;

&lt;p&gt;Prva razlika između class i funkcijskih komponenti je način na koji se kreiraju.&lt;br&gt;
Class komponenta je obična klasa iz JavaScripta koja ima &lt;code&gt;render()&lt;/code&gt; metodu koja vraća &lt;code&gt;jsx&lt;/code&gt; u &lt;code&gt;return&lt;/code&gt; dijelu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvwtb4udt0or89dpn27b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvwtb4udt0or89dpn27b.png" alt="base class component in react" width="774" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Treba obratiti pažnju na to da class komponenta koristi osnovnu komponentu &lt;code&gt;Component&lt;/code&gt; koja se uvozi iz 'reacta'. U funkcijskim komponentama ovo nije potrebno.&lt;/p&gt;

&lt;p&gt;Funkcijska komponenta je obična JavaScript funkcija koja vraća &lt;code&gt;jsx&lt;/code&gt;. Treba obratiti pažnju da u funkcijskim komponentama &lt;strong&gt;nema&lt;/strong&gt; &lt;code&gt;render()&lt;/code&gt; metode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r3acqzwazmpm419gotu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r3acqzwazmpm419gotu.png" alt="Ibasic example of functional component in react" width="748" height="246"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  State
&lt;/h3&gt;

&lt;p&gt;Druga značajna razlika je način na koji se postavlja i koristi &lt;code&gt;state&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;U class komponentama state mora biti definisan unutar konstruktor metode.&lt;/p&gt;

&lt;p&gt;Da bi se koristio state u class komponentama potrebno mu je pristupiti kao i svakom drugom objektu uz korištenje ključne riječi &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5dah0ctnz7po03wubwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5dah0ctnz7po03wubwu.png" alt="example of state in react class components" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Promjena 'state-a' u class komponentama donosi nove 'probleme'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For15bvptk2drg7h3v7h7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For15bvptk2drg7h3v7h7.png" alt="change state in react class components example" width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što može da se vidi potrebno je prvo kreirati funkciju koja mijenja godine sa 33 na 34. Ali ono šta je neophodno uraditi nakon toga je vezati tu funkciju za tu instancu klase. To se radi pomoću &lt;code&gt;.bind()&lt;/code&gt; metode unutar konstruktora.&lt;/p&gt;

&lt;p&gt;Ako želite da saznate više o &lt;code&gt;bind&lt;/code&gt; metodi, pisao sam o njoj u tekstu koji možete pročidati &lt;a href="https://dev.to/bslaven/call-apply-i-bind-metode-u-javascriptu-3pdj"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kod funkcijskih komponenti definisanje i korištenje state-a je mnogo elegantnije. Prije svega funkcijske komponente nemaju konstruktor jer nisu klasa. State se definiše uz pomoć &lt;code&gt;useState&lt;/code&gt; hook-a u vidu obične varijable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nex4d48r7cf6c1o3ju9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6nex4d48r7cf6c1o3ju9.png" alt="react functional component state in one line" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vrijedi naglasiti da se state u funkcijskim komponentama ne mora navoditi pojedinačno kao u vom primjeru, nego sve može da se stavi u jedan npr. objekat. To je čak i preferirani način ako su podaci koji se deklarišu usko povezani.&lt;/p&gt;

&lt;p&gt;Kao što se vidi pozivanje &lt;code&gt;useState&lt;/code&gt; hook-a vraća dvije vrijednosti. Prva vrijednost je varijabla (ili konstanta) koju mogu koristiti u drugim dijelovima komponente, druga vrijendost je funkcija koja mijenja prvu vrijednost. Te dvije vrijednosti sam destrukturisanjem definisao u jednom redu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqc40hn229p8u5ah1t93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqc40hn229p8u5ah1t93.png" alt="react functional component state example" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U praktičnim okolnostima pozivanje setGodine metode najčešće neće biti obavljeno direktno u &lt;code&gt;onClick&lt;/code&gt; 'event-u', nego će biti kreirana posebna funkcija unutar koje će se mijenjati 'state', pa onda tu novokreiranu funkciju dodati na &lt;code&gt;onClick&lt;/code&gt; event.&lt;/p&gt;




&lt;h3&gt;
  
  
  Props
&lt;/h3&gt;

&lt;p&gt;Props objekat je skup informacija koje komponente koriste da komuniciraju međusobno, da razmjenjuju podatke. Svaka 'parent' komponenta može proslijediti svojoj 'child' komponenti neke atribute sa vrijednostima, a ti atributi i vrijednosti će biti dostupni 'child' komponenti u objektu 'props'.&lt;/p&gt;

&lt;p&gt;Recimo na primjer da imamo ovakvu 'parent' komponentu, koja isto tako može biti class komponenta ili funkcijska komponenta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp0yaiqdghbxsitp8skc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp0yaiqdghbxsitp8skc.png" alt="react parent component passing props to children example" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vidimo da ova 'parent' komponenta na identičan način proslijeđuje props svojim 'child' komponentama, bez obzira da li su one class ili funkcijska komponenta.&lt;/p&gt;

&lt;p&gt;Korištenje objekta &lt;code&gt;props&lt;/code&gt; je, međutim, drugačije među ove dvije verzije komponenti u React-u.&lt;/p&gt;

&lt;p&gt;Class komponente dobijaju props objekat kao parametar u konstruktor metodi. Kao i kod state-a objekat props se koristi pomoću ključne riječi &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j164ul0pujvv8n1hlek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7j164ul0pujvv8n1hlek.png" alt="react class component props example" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U funkcijskim komponentama &lt;code&gt;props&lt;/code&gt; objekat je automatski parametar u funkciji. Kao i kod state-a, nema potrebe da se koristi ključna riječ &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl260idc27ke9k653695.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl260idc27ke9k653695.png" alt="react functional components props example" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kod funkcijskih komponenti korisno je to što se &lt;code&gt;props&lt;/code&gt; objekat, kao i u bilo kojoj drugoj funkciji, može odmah destrukturisati direktno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F941dzqwxfls5q6dwjcrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F941dzqwxfls5q6dwjcrw.png" alt="destructuring props in react functional component example" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Destrukturisanje objekta &lt;code&gt;props&lt;/code&gt; nije moguće u klasama u JavaScriptu, pa samim tim nije moguće ni u React-ovim class komponentama.&lt;/p&gt;




&lt;h3&gt;
  
  
  'Lifecycle' metode i hooks
&lt;/h3&gt;

&lt;p&gt;U suštini sve komponente, kako class tako i funkcijske komponente, imaju svoj takozvani životni ciklus. To su faze kroz koju komponenta prolazi dok je prikazana u aplikaciji (riječ na Engleskom je 'mount'). Te faze najprostije rečeno su kada se komponenta postavi (&lt;em&gt;mounted&lt;/em&gt;), kada se komponenta ažurira (&lt;em&gt;updated&lt;/em&gt;) i kada se komponenta ukloni (&lt;em&gt;unmounted&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Class komponente imaju na raspolaganju nešto što se zove 'lifecycle' metode, odnosno metode životnog ciklusa. One se koriste da bi se pratilo u kojoj fazi životnog ciklusa se nalazi. Shodno tome unutar tih metoda se može raditi nešto što želimo da se desi u bilo kojoj od tih faza.&lt;br&gt;
Te metode su, između ostalih: &lt;code&gt;componentDidMount&lt;/code&gt;, &lt;code&gt;componentDidUpdate&lt;/code&gt;, &lt;code&gt;shouldComponentUpdate&lt;/code&gt;, &lt;code&gt;componentWillUnmount&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedr0eh7r96svispwgoh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedr0eh7r96svispwgoh9.png" alt="a few examples of react class component lifecycle methods" width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo su samo neke od metoda. Ima dosta drugih metoda, od kojih su neke čak i statičke metode. Čak &lt;code&gt;constructor&lt;/code&gt; i &lt;code&gt;render&lt;/code&gt; metode koje smo vidili ranije dio su životnog ciklusa komponente.&lt;/p&gt;

&lt;p&gt;Funkcijske komponente, s druge strane, nemaju na raspolaganju ove metode za praćenje životnog ciklusa. U ranijim verzijama React-a funkcijske komponente su bile samo prezentacijske komponente, te nije bilo potrebe da se bilo šta radi u njihovom životnom ciklusu. &lt;br&gt;
Nisu imale svoj 'state', pa nije bilo potrebe da se prati da li je 'state' promijenjen, pa da se poziva nešto šta bi ličilo na npr. &lt;code&gt;shouldComponentUpdate&lt;/code&gt; ili &lt;code&gt;componentDidUpdate&lt;/code&gt;. Funkcijske komponente su se mijenjale samo kada se promijenio njihov &lt;code&gt;props&lt;/code&gt; objekat koji su dobijale od svoje 'parent' komponente.&lt;/p&gt;

&lt;p&gt;Međutim, dolaskom hooks-a i ovo se promijenilo. Funkcijske komponente mogu nositi/držati svoj 'state', ali što je još važnije došao je &lt;code&gt;useEffect&lt;/code&gt; hook.&lt;/p&gt;

&lt;p&gt;Ovaj &lt;code&gt;useEffect&lt;/code&gt; hook, može da se iskoristi da se uradi nešto kada se komponenta postavi ili da se prate neki sporedni efekti koji se prate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5o2ly2fmb3zg4pykb8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5o2ly2fmb3zg4pykb8z.png" alt="react functional component useEffect example" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hook &lt;code&gt;useEffect&lt;/code&gt; dobija dva paremetra. Prvi parametar je funkcija koja će bit pozvana minimalno jednom, kada se komponenta prvi put postavi. Drugi parametar je niz koji će pratiti vrijednosti nakon čije promjene će funkcija iz prvog parametra biti ponovo pozvana. Ako niz ostane prazan, funkcija iz prvog parametra će biti pozvana samo jednom, na početku života komponente, kada se postavi.&lt;/p&gt;

&lt;p&gt;Važno je naglasiti da &lt;code&gt;useEffect&lt;/code&gt;, kao ni druge hooks-e, ne treba posmatrati kao zamjenu za metode životnog ciklusa u class komponentama, nego kao jedan drugi način posmatranja životnog ciklusa komponente.&lt;/p&gt;




&lt;h3&gt;
  
  
  Zaključak
&lt;/h3&gt;

&lt;p&gt;Funkcijske komponente su budućnost React-a. Čak i u &lt;a href="https://react.dev/"&gt;React-ovoj dokumentaciji&lt;/a&gt; rijetko ili nikako nećete naići na class komponente. To ne znači da class komponente ne treba naučiti koristiti, jer postoji vjerovatnoća da ćete nekada naići na neki 'legacy' kod na kom treba raditi.&lt;/p&gt;

&lt;p&gt;Class komponente su zaostavština iz ranijih verzija React-a kada su samo class komponente mogle nositi &lt;code&gt;state&lt;/code&gt;, a funkcijske komponente su služile samo za prezentaciju.&lt;/p&gt;

&lt;p&gt;Verzija React-a 16.8 je po prvi put uvela pojam/ideju 'hooks'. Hooks-i su, najprostije rečeno, funkcije koje omogućavaju funkcijskim komponentama da koriste neke funkcionalnosti React-a koje su do tog trenutka bile dostupne samo class komponentama. Dva takva 'hooks-a' sam pominjao u ovom tekstu to su &lt;code&gt;useState&lt;/code&gt; hook koji omogućava funkcijskim komponentama da nose/drže &lt;code&gt;state&lt;/code&gt;, te &lt;code&gt;usEffect&lt;/code&gt; koji služi sa praćenje takozvanih sporednih efekata.&lt;/p&gt;

&lt;p&gt;Neki drugi hooks-i su &lt;code&gt;useContext&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, itd. Međutim, svaki od ovih hooks-a je tema za sebe, pa ću se njima baviti u zasebnim tekstovima.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Kopiranje i kloniranje objekata u JavaScriptu. Jedan 'novi' trik za pomoć svima nama.</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Thu, 16 Mar 2023 13:52:56 +0000</pubDate>
      <link>https://forem.com/bslaven/kopiranje-i-kloniranje-objekata-u-javascriptu-jedan-novi-trik-za-pomoc-svima-nama-5g4m</link>
      <guid>https://forem.com/bslaven/kopiranje-i-kloniranje-objekata-u-javascriptu-jedan-novi-trik-za-pomoc-svima-nama-5g4m</guid>
      <description>&lt;p&gt;Kada se radi sa JavaScriptom, u bilo kom okruženju, jedan od prijedloga ili nepisanih pravila je da se ne mutira/mijenja originalni objekat. Najčešće je u pitanju npr. neki objekat koji je došao sa nekog endpointa, ali ne nužno. Može biti u pitanju bilo koji objekat, sa bilo kog izvora. Razlog je jednostavno u tome što je moguće da će neki drugi dio aplikacije odnosno programa koristiti isti taj objekat i nije dobro da se on mijenja.&lt;/p&gt;

&lt;p&gt;Rješenje za takvo nešto je da se, naizgled jednostavno, napravi kopija tog objekta i da se mutira/mijenja ta kopija. Ali ovdje se radi o JavaScriptu, objekti su referentni tipovi, te stoga njihovo kopiranje nije tako jednostavna tema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Šta ćete ovdje pročitati?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kako se objekti kopiraju u JavaScriptu?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kombinacija metoda &lt;code&gt;JSON.stringify&lt;/code&gt; i &lt;code&gt;JSON.parse&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spread &lt;code&gt;(...)&lt;/code&gt; operator.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nova metoda &lt;code&gt;structuredClone()&lt;/code&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Kako se objekti kopiraju u Javascriptu?
&lt;/h4&gt;

&lt;p&gt;Objekti u JavaScriptu su referentni tipovi podataka (za razliku od primitivnih; više o tipovima možete pričitati u &lt;a href="https://dev.to/bslaven/tipovi-u-javascriptu-eef"&gt;ovom&lt;/a&gt; tekstu). Jedna od karakteristika referentnih tipova je da se oni kopiraju po referenci. Odnosno kada kopiramo jedan objekat u drugi, to znači da nismo kopirali njegov sadržaj u drugi objekat nego njegovu lokaciju u memoriji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlw534yh19nca7sljogo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlw534yh19nca7sljogo.png" alt="copy an object to another one in JavaScript" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovdje smo kopirali objekat &lt;code&gt;osoba1&lt;/code&gt; u &lt;code&gt;osoba2&lt;/code&gt; ali smo kopirali njegovu referencu na lokaciju u memoriji. Ova dva objekta dijele sada tu referencu. Zato ako pokušamo da promijenimo jedan od ovih objekata automatski ćemo promijeniti i drugi. Zato što smo promijenili objekat u memoriji, a oba ova objekta upućuju na istu lokaciju u memoriji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faimxfr35d88zwcy4jrek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faimxfr35d88zwcy4jrek.png" alt="change value in copied object in JavaScript" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Promjena godina u objektu &lt;code&gt;osoba2&lt;/code&gt; je promijenila godine i u objektu &lt;code&gt;osoba1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dakle, u pokušaju da se pridržavamo pravila da ne mutiramo originalni objekat pravljenje obične kopije tog objekta neće funkcionisati. Zato je potrebno napraviti &lt;strong&gt;klon&lt;/strong&gt; tog objekta, objekat koji ima sva svojstva kao i originalni objekat, ali koji ne dijeli njegovu referencu.&lt;/p&gt;




&lt;h4&gt;
  
  
  Kombinacija metoda &lt;code&gt;JSON.stringify&lt;/code&gt; i &lt;code&gt;JSON.parse&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Jedno od rješenja za pravljenje klon objekta u JavaScriptu je kombinovanje metoda &lt;code&gt;JSON.stringify&lt;/code&gt; i &lt;code&gt;JSON.parse&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;JSON.stringify&lt;/code&gt; metoda u JavaScriptu će uzeti objekat i pretvoriti ga u obični tekst, a &lt;code&gt;JSON.parse&lt;/code&gt; metoda će ga vratiti iz teksta u obični JavaScript objekat. Koristićemo naš postojeći objekat &lt;code&gt;osoba1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxq0a4jmhrtih2ejf8zv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxq0a4jmhrtih2ejf8zv.png" alt="parse and stringify to clone an object in JavaScript" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ova kombinacija metoda funkcioniše za neke osnovne potrebe. Međutim, problem kod ovog pristupa je što ne funkcioniše sa npr. datumima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwsig2kuzo1vgwufslsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwsig2kuzo1vgwufslsx.png" alt="parsing date from string in JavaScript" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što možemo viditi iz ovog primjera primjena metoda &lt;code&gt;stringify&lt;/code&gt; i &lt;code&gt;parse&lt;/code&gt; na datumu je promijenila taj datum. Naime, &lt;code&gt;stringify&lt;/code&gt; metoda je pretvorila datum u string u punom formatu, ali &lt;code&gt;parse&lt;/code&gt; metoda nije vratila taj string u puni datum, nego u ISO format.&lt;/p&gt;

&lt;p&gt;Dakle, &lt;code&gt;JSON.stringify&lt;/code&gt; metoda je dobra kada radimo sa primitivnim tipovima kao što su &lt;code&gt;string&lt;/code&gt;, 'number' ili 'boolean'.&lt;br&gt;
Evo nekliko primjera čudnog ponašanja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8un4z37kwy6malbmtel0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8un4z37kwy6malbmtel0.png" alt="JSON.stringify in JavaScript bad behaviour" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kada &lt;code&gt;JSON.stringify&lt;/code&gt; ne zna šta da radi sa nekim podacima može se lako dogoditi ili da izgubimo neke podatke ili da dobijemo nešto potpuno drugačije.&lt;/p&gt;




&lt;h4&gt;
  
  
  Spread &lt;code&gt;(...)&lt;/code&gt; operator
&lt;/h4&gt;

&lt;p&gt;Sa ES6 standardom JavaScripta došao je jedan odličan operator koji se može koristiti za kloniranje objekata. To je 'spread' (...) operator. Kao što se vidi on izgleda kao obične tri tačke. Koristi se tako što se jednostavno postave tri tačke ispred objekta koji želimo da kopiramo i to dodamo kao vrijednost novom objektu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwz1q3mbov998rcfihms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwz1q3mbov998rcfihms.png" alt="spread object into another object in JavaScript" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se vidi iz osnovnog primjera moguće je koristiti i druge vrijednosti sa kojim smo imali problema u prethodnim primjerima. Vrijednosti su prenesene u drugi objekat onakve kakve su bile i u originalnom objektu. Datumi su u formatu koji smo imali i u originalnom objektu.&lt;/p&gt;

&lt;p&gt;Naravno, ako promijenimo nešto u kloniranom objektu ta promjena se neće viditi u originalnom objektu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuo9kxyiqdwiim3bf1x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuo9kxyiqdwiim3bf1x4.png" alt="change key in object after spread in JavaScript" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Međutim, spread operator ima jednu, ali prilično veliku manu kada je kloniranje objekata u pitanju. Ta mana je što on pravi samo takozvane plitke kopije objekata. To znači da, ako neki objekat ima svojstvo koje je opet objekat, samo referenca tog 'unutrašnjeg' objekta će biti kopirana. Samim tim bilo koja promjena u tom unutrašnjem objektu će se odraziti i u unutrašnjem objektu originalnog objekta.&lt;/p&gt;

&lt;p&gt;Ovo je veoma važna razlika jer ćete u stvarnosti često raditi sa objektima koji imaju više nivoa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgj4da1n7ob0wq4q0n2to.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgj4da1n7ob0wq4q0n2to.png" alt="spread creating a shallow copy in JavaScript" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U ovom primjeru se vidi da objekat &lt;code&gt;osoba1&lt;/code&gt; ima svojstvo &lt;code&gt;adresa&lt;/code&gt; koji je i sam objekat, sa svojim svojstvima. Kada smo klonirali objekat &lt;code&gt;osoba1&lt;/code&gt;, objekat &lt;code&gt;adresa&lt;/code&gt; nije kloniran nego je samo kopirana njegova referenca. Zato, kada smo promijenili broj na adresi u kloniranom objektu, promijenili smo i broj na adresi u originalnom objektu.&lt;/p&gt;

&lt;p&gt;S obzirom da je spread operator lično moj omiljeni način za kloniranje objekata, uvijek moram biti svjestan njegovog jednog velikog nedostatka i misliti na to koju će strukturu imati moj originalni objekat.&lt;/p&gt;




&lt;h4&gt;
  
  
  Nova metoda &lt;code&gt;structuredClone()&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Nešto što se dugo čekalo u JavaScriptu je metoda &lt;code&gt;structured Clone&lt;/code&gt;. Ova metoda je ugrađena u JavaScript u svim okruženjima. Koristi se tako što joj se kao parametar dodijeli objekat koji želimo da kopiramo i to se dodijeli kao vrijednost novom objekutu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kg62jbwa89zvfy5fjjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kg62jbwa89zvfy5fjjl.png" alt="structuredClone example in JavaScript" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se vidi iz primjera &lt;code&gt;structuredClone&lt;/code&gt; može da se koristi sa specijalnim podacima kao što su &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt;, sa funkcijama.&lt;/p&gt;

&lt;p&gt;Metoda &lt;code&gt;structuredClone&lt;/code&gt; automatski pravi duboki klon datog objekta, bez obzira koliko nivoa je dubog objekat.&lt;/p&gt;

&lt;p&gt;Svakako postoje i drugi načini koji se mogu koristiti za kopiranje objekata.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Može se koristiti &lt;code&gt;Object.assign()&lt;/code&gt; pristup. Ovo međutim takođe pravi plitku kopiju objekta.&lt;/li&gt;
&lt;li&gt;Može se koristiti neka od biblioteka koje imaju rješenje za ovo. Jedna od njih je &lt;a href="https://lodash.com/"&gt;lodash&lt;/a&gt;. Ona ima svoju metodu &lt;code&gt;cloneDeep&lt;/code&gt; koja može da posluži za kloniranje. Jedini problem je što morate uvesti cijelu biblioteku samo da bi dobili jednu metodu. Ako ne koristite ništa više iz biblioteke &lt;code&gt;lodash&lt;/code&gt; postoje bolja rješenja.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Call, apply i bind metode u JavaScriptu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Mon, 06 Mar 2023 20:06:14 +0000</pubDate>
      <link>https://forem.com/bslaven/call-apply-i-bind-metode-u-javascriptu-3pdj</link>
      <guid>https://forem.com/bslaven/call-apply-i-bind-metode-u-javascriptu-3pdj</guid>
      <description>&lt;h2&gt;
  
  
  Šta možete pročitati ovdje?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uvod i ključna riječ &lt;code&gt;this&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Metoda &lt;code&gt;.call()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Metoda &lt;code&gt;.apply()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Metoda &lt;code&gt;.bind()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Uvod i ključna riječ &lt;code&gt;this&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;U drugim izričito objektno orijentisanim jezicima ključna riječ &lt;code&gt;this&lt;/code&gt; se uvijek odnosi na trenutnu instancu klase. U JavaScriptu &lt;code&gt;this&lt;/code&gt; se ponaša malo drugačije. Vrijednost riječi &lt;code&gt;this&lt;/code&gt; zavisi od toga kako/gdje je funkcija pozvana.&lt;/p&gt;

&lt;p&gt;U svrhu ovog teksta jednostavno ćemo reći da se &lt;code&gt;this&lt;/code&gt; u JavaScriptu odnosi na objekat koji je pozvao metodu. Vizuelno će to biti objekat koji se nalazi lijevo od tačke prilikom pozivanja metode.&lt;/p&gt;

&lt;p&gt;Recimo npr. da imamo objekat &lt;code&gt;osoba&lt;/code&gt; sa određenim svojstvima i jednom metodom koja koristi svojstva iz tog objekta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftl1owvntd2j4l752cw81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftl1owvntd2j4l752cw81.png" alt="example of this in basic object in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, pozvali smo metodu &lt;code&gt;reciKoSi&lt;/code&gt; iz objekta &lt;code&gt;osoba&lt;/code&gt;. Objekat se nalazi lijevo od tačke i na njega se odnosi ključna riječ &lt;code&gt;this&lt;/code&gt;. Zato metoda &lt;code&gt;reciKoSi&lt;/code&gt; ima pristup svojstvima &lt;code&gt;ime&lt;/code&gt; i &lt;code&gt;godine&lt;/code&gt; iz objekta &lt;code&gt;osoba&lt;/code&gt;. Ovo je očekivano ponašanje.&lt;/p&gt;

&lt;p&gt;Međutim, šta ako pokušamo da dodijelimo ovu metodu kao vrijednost nekoj varijabli?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4p0pdlowk5jekpdt8l5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4p0pdlowk5jekpdt8l5.png" alt="assign method from object in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo je potpuno validna JavaScript sintaksa, ali problem je nastupio kada smo pokušali da je pozovemo. Zašto ova metoda nema pristup svojstvima &lt;code&gt;ime&lt;/code&gt; i &lt;code&gt;godine&lt;/code&gt;? Zato što je nismo pozvali na &lt;code&gt;osoba&lt;/code&gt; objektu. Pozvali smo je bez reference na bilo koji objekat. To automatski znači da se &lt;code&gt;this&lt;/code&gt; odnosi na globalni &lt;code&gt;window&lt;/code&gt; objekat, a taj objekat nema svojstva &lt;code&gt;ime&lt;/code&gt; i &lt;code&gt;godine&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Upravo ovo je jedna od situacija zbog kojih kažemo da referenca ključne riječi &lt;code&gt;this&lt;/code&gt; zavisi od toga kako je pozvana funkcija.&lt;/p&gt;

&lt;p&gt;Ovakvo ponašanje ključne riječi &lt;code&gt;this&lt;/code&gt; je jedan od razloga zbog kog je &lt;code&gt;this&lt;/code&gt; izvor velike zabune u JavaScriptu, pa se njeno korištenje često i izbjegava.&lt;/p&gt;

&lt;p&gt;Kao što sam već rekao ovo je samo jedan od razloga. Ključna riječ &lt;code&gt;this&lt;/code&gt; je izuzetno složena tema sama za sebe i više nego dovoljna da bude tema jednog odvojenog teksta. No, u svrhu današnje teme dovoljno je shvatiti da se &lt;code&gt;this&lt;/code&gt; odnosi na objekat koji je pozvao metodu, odnosno vizuelno objekat koji se nalazi lijevo od tačke prilikom pozivanja metode.&lt;/p&gt;




&lt;h3&gt;
  
  
  Metoda &lt;code&gt;.call()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Jedna od tri veoma važne metode u JavaScriptu u objektno orijentisanom pristupu je &lt;code&gt;.call()&lt;/code&gt; metoda.&lt;/p&gt;

&lt;p&gt;Recimo npr. da imamo dva objekta &lt;code&gt;osoba1&lt;/code&gt; i &lt;code&gt;osoba2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnll2qkmb1pvcvy0r8lpq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnll2qkmb1pvcvy0r8lpq.png" alt="example of two basic objects in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Objekat &lt;code&gt;osoba1&lt;/code&gt; ima metodu &lt;code&gt;reciKoSi&lt;/code&gt; kojom može da se predstavi tako što će reći ime i godine. Ali šta ako bilo gdje u aplikaciji želimo da se neka druga osoba predstavi. Objekat &lt;code&gt;osoba2&lt;/code&gt; nema metodu &lt;code&gt;reciKoSi&lt;/code&gt;, ali želimo da je iskoristimo. Da bi izbjegli dupliciranje koda tako što bi samo kopirali istu metodu &lt;code&gt;reciKoSi&lt;/code&gt; u objekat &lt;code&gt;osoba2&lt;/code&gt; itd., itd. sa bilo kojim drugim objektom kojem bi mogla koristiti da funkcija, tu na snagu stupa &lt;code&gt;.call()&lt;/code&gt; metoda.&lt;/p&gt;

&lt;p&gt;Sintaksa je takva da ćemo jednostavno pozvati &lt;code&gt;reciKoSi&lt;/code&gt; metodu iz objekta &lt;code&gt;osoba1&lt;/code&gt; i onda vezati &lt;code&gt;.call&lt;/code&gt; metodu. Prvi argument je objekat na koji želim da se odnosi ključna riječi &lt;code&gt;this&lt;/code&gt;. Objekat kojim mijenjamo kontekst za &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhevmhjizhl28jnrihua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhevmhjizhl28jnrihua.png" alt="example of .call method in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Šta se ovdje dogodilo? Pozvali smo &lt;code&gt;.call&lt;/code&gt; metodu, ali sa drugim kontekstom. Sa objektom &lt;code&gt;osoba2&lt;/code&gt; kao argumentom promijenili smo kontekst za ključnu riječ &lt;code&gt;this&lt;/code&gt;, odnosno promijenili smo na šta se odnosi &lt;code&gt;this&lt;/code&gt;. Rekli smo pozovi &lt;code&gt;reciKoSi&lt;/code&gt; metodu, ali &lt;code&gt;this&lt;/code&gt; će da se odnosi na objekat &lt;code&gt;osoba2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pored prvog argumenta koji mijenja kontekst za &lt;code&gt;this&lt;/code&gt;, &lt;code&gt;.call&lt;/code&gt; metoda može da dobije i bilo koji broj drugih argumenata, baš kao i svaka druga funkcija. Ti argumenti će biti uneseni poslije objekta jedan za drugim.&lt;/p&gt;

&lt;p&gt;Recimo npr. da u našem primjeru objekti imaju svojstvo &lt;code&gt;omiljeniSlatkiši&lt;/code&gt;, koje je predstavljeno kao niz stringova. Metoda za dodavanje novih omiljenih slatkiša će biti &lt;code&gt;dodajSlatkiš&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feexnr4n6yhgvdpeh0dha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feexnr4n6yhgvdpeh0dha.png" alt="example of .call method in JavaScript with arguments"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poslije objekta smo unijeli sve argumente koje metoda &lt;code&gt;dodajSlatkiš&lt;/code&gt; ima na raspolaganju.&lt;/p&gt;




&lt;h3&gt;
  
  
  Metoda &lt;code&gt;.apply()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Metoda &lt;code&gt;.apply()&lt;/code&gt; je identična po ponašanju kao i &lt;code&gt;.call&lt;/code&gt; metoda. Jedina razlika je u argumentima koji se unose poslije objekta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn8q0yoeow7lcdjet456l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn8q0yoeow7lcdjet456l.png" alt="example of .apply method in JavaScript with arguments"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, sintaksa je slična kao i kod &lt;code&gt;.call()&lt;/code&gt; metode. Jedina razlika je što se argumenti poslije objekta unose u jednom nizu, umjesto jedan za drugim kao što je u &lt;code&gt;.call()&lt;/code&gt; metodi. Kao i kod &lt;code&gt;.call()&lt;/code&gt; metode možemo navesti koliko god želimo argumenata.&lt;/p&gt;




&lt;h3&gt;
  
  
  Metoda &lt;code&gt;.bind()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Slično kao i u prethodna dva slučaja u &lt;code&gt;.bind()&lt;/code&gt; metodi možemo da promijenimo kontekst za &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Razlika je u tome što &lt;code&gt;bind&lt;/code&gt; metoda neće odmah pozvati metodu, što je slučaj ko &lt;code&gt;call&lt;/code&gt; i &lt;code&gt;apply&lt;/code&gt; metoda. Bind funkcioniše tako što će vratiti funkciju, sa datim kontekstom i parametrima/argumentima, koja može kasnije biti pozvana.&lt;/p&gt;

&lt;p&gt;Dakle ovo neće imati nikakav uticaj na objekat &lt;code&gt;osoba2&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsocz2rz1smk474xij4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsocz2rz1smk474xij4g.png" alt="example of callign bind method in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovdje funkcija/metoda &lt;code&gt;dodajSlatkiš&lt;/code&gt; nije pozvana. Međutim, možemo referencu na ovu metodu staviti u neku varijablu za kasnije pozivanje.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeeew24wzqnd9n4t4kzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeeew24wzqnd9n4t4kzj.png" alt="example of store bind method for later use in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ili možda čak i primjer gdje argumente dodajemo prilikom pozivanja funkcije &lt;code&gt;dodajIskriSlatkiš&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbze3gv75v99l0wz2wz5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbze3gv75v99l0wz2wz5i.png" alt="example of an alternative approach to bind arguments in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ova ova primjera će za donijeti isti rezultat.&lt;/p&gt;

&lt;p&gt;Dakle, &lt;code&gt;.bind()&lt;/code&gt; poziv nam je dao na raspolaganje funkciju sa &lt;code&gt;osoba2&lt;/code&gt; kontekstom i parametrima. Tu vrijednost smo proslijedili varijabli &lt;code&gt;dodajIskriSlatkiš&lt;/code&gt; da bi je kasnije mogli pozvati. Iako izgleda da smo pozvali funkciju &lt;code&gt;dodajIskriSlatkiš&lt;/code&gt; iz globalnog objekta, ona nije preuzela njegov kontekst, nego ima kontekst koji smo joj naveli u &lt;code&gt;.bind()&lt;/code&gt; metodi.&lt;/p&gt;

&lt;p&gt;Upravo &lt;code&gt;.bind&lt;/code&gt; metoda je rješenje za naš problem sa početka ovog teksta kada smo izgubili kontekst za objekat &lt;code&gt;osoba&lt;/code&gt; prilikom proslijeđivanja njegove metode &lt;code&gt;reciKoSi&lt;/code&gt; u varijablu za kasnije pozivanje.&lt;/p&gt;

&lt;p&gt;Neke druge teme o kojim sam pisao na temu JavaScripta, web developmenta, možete pronaći &lt;a href="https://dev.to/bslaven"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tipovi u JavaScriptu</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Fri, 17 Feb 2023 18:36:37 +0000</pubDate>
      <link>https://forem.com/bslaven/tipovi-u-javascriptu-eef</link>
      <guid>https://forem.com/bslaven/tipovi-u-javascriptu-eef</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Šta se može pročitati u ovom tekstu?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Primitivni vs referentni tipovi.&lt;/li&gt;
&lt;li&gt;Koji su primitivni tipovi u JavaScriptu?&lt;/li&gt;
&lt;li&gt;Referentni tipovi.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Primitivni vs referentni tipovi.
&lt;/h3&gt;

&lt;p&gt;Kada pričamo o osnovnoj i glavnoj podjeli tipova može se reći da u JavaScriptu postoje primitivni i referentni tipovi. Primitivni tipovi imaju fiksnu veličinu u memoriji i kopiraju se po vrijednosti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxsewc8h8g86cd5h0yq39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxsewc8h8g86cd5h0yq39.png" alt="example of same value primitives in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, &lt;code&gt;ime1&lt;/code&gt; i &lt;code&gt;ime2&lt;/code&gt; imaju istu vrijednost i logično je da njihovo poređenje vraća &lt;code&gt;true&lt;/code&gt;, pored činjenice da su ovo dvije različite lokacije u memoriji, dvije odvojene varijable. Njihove vrijednosti su identične.&lt;/p&gt;

&lt;p&gt;Šta ako bi probali da kopiramo jednu varijablu u drugu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gmwjplhgpucwmt7dhdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gmwjplhgpucwmt7dhdk.png" alt="copy primitives example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo poređenje takođe vraća &lt;code&gt;true&lt;/code&gt; zato što smo samo kopirali 'vrijednost' varijable &lt;code&gt;ime1&lt;/code&gt; u varijablu &lt;code&gt;ime2&lt;/code&gt;. Treba obratiti pažnju da je kopirana samo njena vrijednost. Ove dvije varijable imaju dvije različite lokacije u memoriji, ali i dalje identičnu vrijednost.&lt;/p&gt;

&lt;p&gt;Upravo kod ova dva aspekta je razlika između primitivnih i referentnih tipova. Referentni tipovi nemaju fiksnu veličinu u memoriji, jer se njihova svojstva mogu mijenjati i kopiraju se po 'referenci', kopira se samo njihova lokacija u memoriji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falu25ck8sm7bxwfjfn6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falu25ck8sm7bxwfjfn6o.png" alt="comparing refenrce types in JavaScript example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo poređenje vraća &lt;code&gt;false&lt;/code&gt; zato što su ova dva objekta dvije različite lokacije u memoriji. Očigledno je da imaju istu vrijednost, ali se ne porede po vrijednosti, nego po lokaciji u memoriji i zato su različiti.&lt;/p&gt;

&lt;p&gt;Šta ako kopiramo jedan objekat u drugi?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggm3zboqhuu59u58uduo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggm3zboqhuu59u58uduo.png" alt="copy reference types example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sada se rezultat poređenja promijenio i vraća &lt;code&gt;true&lt;/code&gt;. To je zato što smo prilikom kopiranja jednog objekta u drugi u stvari kopirali njegovu referencu, odnosno njegovu lokaciju u memoriji. Ova dva objekta upućuju na istu lokaciju u memoriji i kada se uporedi njihova lokacija ona je ista. Zato vraća &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Još jedna posljedica ovakvog ponašanja referentnih tipova je to da ako promijenim jedan od ova dva objekta, automatski ću promijeniti i drugi, zato što se nalaze u istoj lokaciji u memoriji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnlkuagd3gpaaht2nlfy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpnlkuagd3gpaaht2nlfy.png" alt="copied object mutation example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo je česta pojava kada se radi u JavaScript okruženju. Često će se raditi sa manipulisanjem objektima i treba paziti kada je u pitanju izmjena originalnog objekta, jer može izazvati neželjene posljedice.&lt;/p&gt;

&lt;p&gt;Ako ste se pitali kako je moguće mijenjati (mutirati) objekat koji je definisan sa &lt;code&gt;const&lt;/code&gt;, to i još više sam objasnio u &lt;a href="https://dev.to/bslaven/definisanje-varijabli-u-javascriptu-var-let-ili-const-2gge"&gt;ovom tekstu o različitom načinu definisanja varijabli u JavaScriptu&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Koji su primitivni tipovi u JavaScriptu?
&lt;/h3&gt;

&lt;p&gt;Jednostavno rečeno u JavaScriptu postoji sedam primitivnih tipova podataka. To su:&lt;br&gt;
&lt;code&gt;string&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;bigint&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Napomena: tokom ovog teksta koristiću operator &lt;code&gt;typeof&lt;/code&gt; koji će mi poslužiti da pokažem koji tip je određeni podatak. Operator &lt;code&gt;typeof&lt;/code&gt; vraća string vrijednost koja označava tip podatka.&lt;/em&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  String
&lt;/h4&gt;

&lt;p&gt;String je primitivni tip u JavaScriptu koji predstavlja tekstualnu vrijednost. Dakle, obični tekst. Predstavljen je pod jednostrukim, dvostrukim navodnicima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioqzf72lshobl3iajds9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fioqzf72lshobl3iajds9.png" alt="basic examples of string in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postoji i treći način predstavljanja &lt;code&gt;stringova&lt;/code&gt; a to su obrnuti apostrofi. Ova tehnika se zove 'template strings' i uvedena je sa ES6 standardom JavaScripta. Ovaj način kreiranja stringova je dobar za ubacivanje dinamičnih vrijednosti u tekstualni sadržaj.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19jcivgb49vv7w2k2y95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19jcivgb49vv7w2k2y95.png" alt="template string example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Operator &lt;code&gt;typeof&lt;/code&gt; na &lt;code&gt;string&lt;/code&gt; vrijednosti će nam dati 'string' kao rezultat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0oikjfiirkuxlfyo7yv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0oikjfiirkuxlfyo7yv.png" alt="typeof string example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Number
&lt;/h4&gt;

&lt;p&gt;Number (broj) je numerički primitivni tip u JavaScriptu koji predstavlja bilo koji broj.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qj0em0qs2ajqlg694aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qj0em0qs2ajqlg694aq.png" alt="basic number examples in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se može viditi iz navedenih primjera, u JavaScriptu &lt;code&gt;number&lt;/code&gt; predstavlja i cijele i decimalne brojeve.&lt;/p&gt;

&lt;p&gt;Operator &lt;code&gt;typeof&lt;/code&gt; na &lt;code&gt;number&lt;/code&gt; vrijednosti će nam dati 'number' kao rezultat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oof8f2gv5p291ly0jkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oof8f2gv5p291ly0jkd.png" alt="typeof number example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  BigInt
&lt;/h4&gt;

&lt;p&gt;BigInt je takođe numerički primitivni tip koji predstavlja bilo koji broj koji je 'prevelik' da bude prikazan običnim &lt;code&gt;number&lt;/code&gt; tipom. Ovaj tip je uveden sa ES2020 standardom JavaScripta.&lt;/p&gt;

&lt;p&gt;U JavaScriptu postoji ograničenje koliko veliki brojevi mogu biti definisani običnim 'number' tipom i tu na snagu stupa BigInt.&lt;/p&gt;

&lt;p&gt;Jedan od načina da se definiše bigInt je da se doda 'n' na neki veliki broj.&lt;/p&gt;

&lt;p&gt;Drugi način je da se iskoristi konstruktor BigInt(). Vrijednost koja se proslijeđuje ovom konstruktoru je broj u brojčanoj ili string verziji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uno90ud2ck378jx4vmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uno90ud2ck378jx4vmh.png" alt="basic bigint example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jedna stvar na koju treba obratiti kod &lt;code&gt;bigint&lt;/code&gt; vrijednosti je to što se ona koristi samo za cijele brojeve, nikako decimalne.&lt;/p&gt;




&lt;h4&gt;
  
  
  Boolean
&lt;/h4&gt;

&lt;p&gt;Boolean je primitivni tip u JavaScriptu koji može imati samo dvije vrijednosti &lt;code&gt;true&lt;/code&gt; ili &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ova vrijednost se uglavnom koristi za poređenje, da provjerimo koji dio koda će biti izvršen, a koji neće. Rezultat poređenja nekih vrijednosti će uvijek biti &lt;code&gt;boolean&lt;/code&gt; vrijednost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2g8idjsw10dn86dec1es.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2g8idjsw10dn86dec1es.png" alt="basic boolean as a result of comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Zašto jedno od ovih poređenja vraća &lt;code&gt;false&lt;/code&gt;, a drugo &lt;code&gt;true&lt;/code&gt; je pitanje strogog poređenja u JavaScriptu, ali to je tema za neki drugi tekst.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Upravo ovakvo poređenje će najčešće biti uslov u &lt;code&gt;if&lt;/code&gt; izjavi kada pitamo da li nešto da se uradi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjypf7v1nz9nrho1z7hmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjypf7v1nz9nrho1z7hmh.png" alt="boolean in if statement example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rezultat poređenja u &lt;code&gt;if&lt;/code&gt; izjavi će biti &lt;code&gt;true&lt;/code&gt; i zato će kod koji je unutar vitičastih zagrada biti izvršen.&lt;/p&gt;




&lt;h4&gt;
  
  
  Null
&lt;/h4&gt;

&lt;p&gt;Null je primitivni tip u JavaScriptu koji predstavlja odsustvo bilo kakve vrijednosti. Dakle, namjerno odsustvo vrijedsnoti. Za razliku od &lt;code&gt;undefined&lt;/code&gt;, on nikada neće biti automatski dodijeljen kao vrijednost.&lt;/p&gt;

&lt;p&gt;Najčešće ćemo &lt;code&gt;null&lt;/code&gt; upotrijebiti za neku varijablu koja kasnije može dobiti svoju pravu vrijednost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefzmneg79zlc1x8oi150.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefzmneg79zlc1x8oi150.png" alt="null as value example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tako se &lt;code&gt;null&lt;/code&gt; često postavlja kao rezultat vraćanja sa nekog poziva na API gdje se očekuje objekat, ali nijedan nije pronađen.&lt;/p&gt;

&lt;p&gt;Ako upotrijebimo &lt;code&gt;typeof&lt;/code&gt; operator na &lt;code&gt;null&lt;/code&gt; dobićemo 'object'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrlpzm60g0gpqviv2oj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrlpzm60g0gpqviv2oj0.png" alt="typeof null example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Činjenica da je null tipa 'object' je jedan od poznatijih bug-ova u JavaScriptu koji je nastao prilikom njegovog kreiranja i velika je vjerovatnoća da nikada neće biti ispravljen iz prostog razloga što mnogo aplikacija zavisi od toga.&lt;/p&gt;




&lt;h4&gt;
  
  
  Undefined
&lt;/h4&gt;

&lt;p&gt;Undefined je drugi primitivni tip u JavaScriptu koji predstavlja odsustvo vrijednosti (pored &lt;code&gt;null&lt;/code&gt;). Izuzev par istaknutih razlika, vrlo je sličan po ponašanju tipu &lt;code&gt;null&lt;/code&gt; i zato je razlika između ovo dvoje izvor velike zabune.&lt;/p&gt;

&lt;p&gt;Prilikom inicijalnog kreiranja varijabli, prije nego što se varijabli dodijeli vrijednost njena vrijednost je &lt;code&gt;undefined&lt;/code&gt;. Upravo iz ovog razloga sve varijable kojim se nikad ne dodijeli vrijednost u stvari imaju vrijednost &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81don18dda98p8wndjyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81don18dda98p8wndjyf.png" alt="undefined for variables without value in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Varijabla ime nikada nije dobila vrijednost i zato je njena vrijednost ostala ona inicijalna &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Funkcije koje ne vraćaju ništa, u stvari dobijaju automatsku return vrijednost &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggyyeol687c08ahbtvkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggyyeol687c08ahbtvkt.png" alt="undefined as return value in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ova funkcija ne vraća ništa, ali zato ako pokušamo da izlogujemo njenu return vrijednost dobićemo &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ako uporedimo &lt;code&gt;null&lt;/code&gt; i &lt;code&gt;undefined&lt;/code&gt;, u zavisnosti koji operator za poređenje smo koristili dobićemo različite rezultate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5okp4ai1d3sdcorn09cv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5okp4ai1d3sdcorn09cv.png" alt="comparing null and undefined in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovdje se opet radi o razlici između obične i stroge jednakosti, ali to je tekst za neki drugi put.&lt;/p&gt;

&lt;p&gt;Ako pozovemo operator &lt;code&gt;typeof&lt;/code&gt; na undefined dobićemo 'undefined'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdaz7i887v7xhdzhs2dg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdaz7i887v7xhdzhs2dg.png" alt="typeof undefined in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Symbol
&lt;/h4&gt;

&lt;p&gt;Simbol je specijalni tip u JavaScriptu koji je došao sa ES6 standardom JavaScripta. On je rezultat pozivanja konstruktora Symbol(). Ovaj konstruktor uvijek vraća jedinstvenu vrijednost. Drugim riječima, simbol je uvijek jedinstvena vrijednost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dujmzzp6g59zuc9icxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dujmzzp6g59zuc9icxs.png" alt="comparing two symbols in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iako je vrijednost koja je proslijeđena konstruktoru kao argument identična u oba slučaja &lt;code&gt;ime1&lt;/code&gt; i &lt;code&gt;ime2&lt;/code&gt;, ove dvije vrijednosti nisu iste, jer simbol je uvijek jedinstvena vrijednost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeujs4jvmqxhq25ht2na.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeujs4jvmqxhq25ht2na.png" alt="typeof Symbol in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pozivanje operatora typeof na simbol vrijednost vraća 'symbol'.&lt;/p&gt;




&lt;h3&gt;
  
  
  Referentni tipovi
&lt;/h3&gt;

&lt;p&gt;Kada govorimo o referentnim tipovima u JavaScriptu u stvari se govori o objektima. Objekti su prosto govoreći jedini ne-primitivni tip u JavaScriptu.&lt;/p&gt;

&lt;p&gt;Kada želimo da neka varijabla bude objekat, definisaćemo je kao parove svojstava (termini na engleskom su property/key) i vrijednosti (value) razdvojene zarezom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3vvbqjgq2ccl2uqjiv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3vvbqjgq2ccl2uqjiv2.png" alt="example of a simple object in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vrijednosti koje se daju kao svojstvima u objektu mogu biti bilo koji drugi tip: &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt; itd., pa čak i drugi objekat.&lt;/p&gt;

&lt;p&gt;Objekti mogu imati i funkcije u sebi. Kada neka funkcija unutar objekta najčešće će se koristiti termin 'metoda'. Ona je svojstvo kao i bilo koje drugo i može se pozvati kao i bilo koja druga funkcija/metoda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpwnxjq0znqbh09wn9s8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpwnxjq0znqbh09wn9s8.png" alt="method in an object JavaScript example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U slučaju da želimo da pristupimo nekom svojstvu u objektu, postoje dva načina da se to uradi.&lt;/p&gt;

&lt;p&gt;Prvi način je preko tačke. Prvo upišemo objekat, pa onda poslije tačke svojstvo kom želimo da pristupimo.&lt;/p&gt;

&lt;p&gt;Drugi način je preko uglastih zagrada. Prvo objekat, pa onda u uglastim zagradama pod navodnicima svojstvo kom želimo da pristupimo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9xahmxor4i2rsm3pccx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9xahmxor4i2rsm3pccx.png" alt="bracket and dot notation in JavaScript example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Treba obratiti pažnju kod korištenja uglastih zagrada na obavezno korištenje navodnika (bilo kojih) prilikom pisanja svojstva.&lt;/p&gt;

&lt;p&gt;Objektima se mogu naknadno dodavati i uklanjati svojstva. Dodavanje svojstava se takođe vrši preko tačke ili uglastih zagrada. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u7e4xgbmrgbu5827ham.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u7e4xgbmrgbu5827ham.png" alt="adding properties in objects in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prvobitno objekat person nije imao ni &lt;code&gt;godine&lt;/code&gt; niti &lt;code&gt;admin&lt;/code&gt;, ali smo ih naknadno dodali.&lt;/p&gt;

&lt;p&gt;Ako želimo da obrišemo neko svojstvo iz objekta moramo dodati ključnu riječ &lt;code&gt;delete&lt;/code&gt; ispred tog svojstva.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukviego05j8bueyp2gma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukviego05j8bueyp2gma.png" alt="deleting properties from and object in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sa ovom praksom treba biti izuzetno oprezan jer neki drugi dijelovi aplikacije mogu koristiti ovo svojstvo.&lt;/p&gt;

&lt;p&gt;Još jedna druga struktura podataka u JavaScriptu koja je tipa 'object' je niz - &lt;code&gt;array&lt;/code&gt;. Niz se definiše tako što se unutar uglastih zagrada stave vrijednosti razdvojene zarezom. Ove vrijednosti mogu biti bilo kod drugog tipa: tekst, brojevi, pa čak i drugi objekti ili nizovi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3qs22956jnjdopp5ats.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo3qs22956jnjdopp5ats.png" alt="simple array example in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kao što se može viditi iz primjera vrijednostima unutar niza se pristupa putem indeksa. Svaka vrijednost ima svoj indeks, odnosno poziciju na kojoj se nalazi. Treba obratiti pažnju da je prvi indeks u nizu na nula (0).&lt;/p&gt;

&lt;p&gt;Pozivanje operatora &lt;code&gt;typeof&lt;/code&gt; na bilo kom objektu ili nizu vratiće 'object';&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipekesefolr6rxqi48rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipekesefolr6rxqi48rm.png" alt="typeof object and array in JavaScript"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Svaki pojedinačni tip u JavaScriptu je dovoljno složena tema sam za sebe tako da nisam previše detalja iznosio o svakom, nego samo stvari za osnovno upoznavanje sa tipovima u JavaScriptu.&lt;/p&gt;

&lt;p&gt;Ako želite da pročitate još neke tekstove na temu JavaScripta, Frontend Web Developmenta možete ih naći &lt;a href="https://dev.to/bslaven"&gt;ovdje&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Definisanje varijabli u JavaScriptu - var, let ili const</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Wed, 28 Dec 2022 17:00:13 +0000</pubDate>
      <link>https://forem.com/bslaven/definisanje-varijabli-u-javascriptu-var-let-ili-const-2gge</link>
      <guid>https://forem.com/bslaven/definisanje-varijabli-u-javascriptu-var-let-ili-const-2gge</guid>
      <description>&lt;p&gt;&lt;strong&gt;Postoji više načina da se definiše varijabla u JavaScriptu. Nešto stariji način je korištenjem ključne riječi &lt;code&gt;var&lt;/code&gt;. Međutim, ES6 standard JavaScripta je donio dvije nove ključne riječi za definisanje varijabli - &lt;code&gt;let&lt;/code&gt; i &lt;code&gt;const&lt;/code&gt;. U ovom tekstu ćete pročitati najosnovnije razlike između ova tri pristupa.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Kratka napomena: Tokom cijelog ovog teksta ću koristiti riječ varijabla, čak i u slučaju kada pričam o vrijednosti koja je ona definisana sa &lt;code&gt;const&lt;/code&gt; koja u suštini znači da je definisana vrijednost u suštini konstanta. Više o razlici između to dvoje u četvrtom poglavlju ovog teksta.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Šta će se sve moći pročitati u ovom tekstu?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Razlika između var i let u opsegu&lt;/li&gt;
&lt;li&gt;Razlika između var i let u hoistingu&lt;/li&gt;
&lt;li&gt;Razlika u ponovnom deklarisanju&lt;/li&gt;
&lt;li&gt;Razlika između let i const&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Razlika između &lt;code&gt;var&lt;/code&gt; i &lt;code&gt;let&lt;/code&gt; u opsegu (scope)
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Šta je opseg?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Opseg je okruženje u kom je neka deklarisana vrijednost vidljiva. U JavaScriptu postoje tri opsega: globalni, funkcijski i blok.&lt;/p&gt;

&lt;p&gt;Sve vrijednosti koje su deklarisane u globalnom opsegu su dostupne u cijelom programu. Bez obzira koja ključna riječ je korištena prilikom deklarisanja ta vrijednost će biti vidljiva u cijelom programu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz93r4xfw8xumeu3jka6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz93r4xfw8xumeu3jka6i.png" alt="example code of JavaScript global scope"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, bilo gdje u kodu imate pristup varijabli &lt;code&gt;name&lt;/code&gt; jer je ona ima globalni opseg. Funkcija &lt;code&gt;logName&lt;/code&gt; i &lt;code&gt;console.log&lt;/code&gt; imaju pristup varijabli &lt;code&gt;name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Generalno govoreći treba izbjegavati deklarisanje globalnih varijabli, jer to otvara prostor za pojavljivanje različitih preklapanja i/ili poništavanja za drugim skriptama i bibliotekama.&lt;/p&gt;

&lt;p&gt;U ovom kontekstu važno je naglasiti da će svaka varijabla koja je deklarisana bez ključne riječi automatski postati globalna varijabla.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eiiha8jjmcdwxtm8d7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4eiiha8jjmcdwxtm8d7f.png" alt="automatic global variable js example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Razlika između var i let dolazi u tome kada one nisu globalne varijable. Varijable deklarisane sa &lt;code&gt;var&lt;/code&gt; imaju opseg funkcije u kojoj su deklarisane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4a4jp4l2bwpydjkrxs4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4a4jp4l2bwpydjkrxs4.png" alt="JavaScript function scope example code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Šta se dešava? Kada pozovete funkciju &lt;code&gt;logName&lt;/code&gt; ona vidi varijablu &lt;code&gt;ime&lt;/code&gt; jer opseg varijable &lt;code&gt;ime&lt;/code&gt; je ta funkcija. Međutim, kada pokušate da pristupite toj varijabli u &lt;code&gt;console.log(ime)&lt;/code&gt; tu ste već u globalnom opsegu i nemate pristup (ne vidite) varijabli &lt;code&gt;ime&lt;/code&gt;, te ćete zato dobiti grešku.&lt;/p&gt;

&lt;p&gt;Za razliku od ovoga varijable deklarisane sa &lt;code&gt;let&lt;/code&gt; imaju opseg &lt;em&gt;bloka koda&lt;/em&gt;. Blok koda u JavaScriptu je jednostavno rečeno sve što se nalazi unutar vitičastih zagrada &lt;code&gt;{}&lt;/code&gt;. To može biti &lt;code&gt;if-else&lt;/code&gt; izjava, &lt;code&gt;switch&lt;/code&gt; izjava, bilo koja petlja...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj726fvz222v0jlqgq75n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj726fvz222v0jlqgq75n.png" alt="JavaScript block scope example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Šta se dešava? Imam &lt;code&gt;if&lt;/code&gt; izjavu (blok koda) unutar koje je deklarisanja varijabla &lt;code&gt;ime&lt;/code&gt;. Unutar istog tog bloka koda &lt;code&gt;console.log(ime)&lt;/code&gt; će viditi tu varijablu jer opseg te varijable je taj blok koda. Međutim, izvan ovog bloka ste u globalnom opsegu i nemate pristup varijabli &lt;code&gt;ime&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Varijabla deklarisana sa &lt;code&gt;var&lt;/code&gt; ovdje ne bi izbacila grešku.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bajdiwn99s9qnfbpama.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bajdiwn99s9qnfbpama.png" alt="JavaScript example block scope code with var"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Varijabla &lt;code&gt;ime&lt;/code&gt; bi u ovom slučaju imala globalni opseg i bila bi dostupna (vidljiva) drugoj &lt;code&gt;console.log(ime)&lt;/code&gt; izjavi.&lt;/p&gt;




&lt;h4&gt;
  
  
  Razlika između &lt;code&gt;var&lt;/code&gt; i &lt;code&gt;let&lt;/code&gt; u hoistingu
&lt;/h4&gt;

&lt;p&gt;Još jedna od razlika između &lt;code&gt;var&lt;/code&gt; i &lt;code&gt;let&lt;/code&gt; ključne riječi je u ponašanju tokom takozvanog hoisting-a (podizanje). Ovo je mehanizam u kom su deklaracije funkcija i varijabli naizgled pomjerene na vrh (hoist) njihovog opsega. Upravo zbog ovog mehanizma možete imati pristup varijablama ili funkcijama prije njihovog deklarisanja.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoa06oaypd2wxoa22t6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoa06oaypd2wxoa22t6l.png" alt="example code for JavaScript var hoisging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, funkcija &lt;code&gt;logName&lt;/code&gt; ima pristup varijabli &lt;code&gt;ime&lt;/code&gt; zato što je varijabla &lt;code&gt;ime&lt;/code&gt; &lt;strong&gt;naizgled&lt;/strong&gt; podignuta na vrh opsega &lt;em&gt;(scope - global)&lt;/em&gt;, ali treba obratiti pažnju na to da joj je vrijednost &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Upravo ovdje nastupa razlika između &lt;code&gt;var&lt;/code&gt; i &lt;code&gt;let&lt;/code&gt;. Ovaj princip hoisting-a će funkcionisati samo sa varijablama koje su deklarisane sa &lt;code&gt;var&lt;/code&gt;. Ukoliko bi pokušali iskoristiti &lt;code&gt;let&lt;/code&gt; za deklarisanje varijable dobićete grešku zato što varijable deklarisane sa &lt;code&gt;let&lt;/code&gt; neće biti podignute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2aju07jr8brd34ayauv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2aju07jr8brd34ayauv5.png" alt="example JavaScript code hoisting with let variable"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Riječ 'naizgled' je namjerno označena jer upravo tu dolazi objašnjenje. Ništa se ne podiže, prilikom egzekucije koda nijedna linija koda neće u stvari biti pomjerena. Podizanje je samo 'naizgled'.&lt;/p&gt;

&lt;h5&gt;
  
  
  Šta JavaScript engine radi kada čita kod?
&lt;/h5&gt;

&lt;p&gt;Kada neki engine (komponenta koja je zadužena za izvršenje JavaScript koda) čita JavaScript kod on obavlja dva koraka: faza kreacije (creation phase) i faza izvršenja (execution phase).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;U fazi kreiranja 'engine' deklariše svaku varijablu, dodijeli joj prostor u memoriji i početnu vrijednost &lt;code&gt;undefined&lt;/code&gt;. Tada je varijabla deklarisana. Ovo je &lt;em&gt;deklaracija&lt;/em&gt; varijable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;U fazi izvršenja varijabla će dobiti vrijednost koja joj je dodijeljena u kodu. Npr. kada napišete &lt;code&gt;var ime = 'Slaven'&lt;/code&gt; Ovo je &lt;em&gt;inicijalizacija&lt;/em&gt; varijable.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mehanizam podizanja će podići samo deklaraciju varijable, ali ne i inicijalizaciju. Upravo zbog ovoga varijable deklarisane sa &lt;code&gt;var&lt;/code&gt; imaju vrijednost &lt;code&gt;undefined&lt;/code&gt; kada pokušate da ih iskoristite prije inicijalizacije.&lt;/p&gt;

&lt;p&gt;Međutim varijablama koje su deklarisane sa &lt;code&gt;let&lt;/code&gt; ne možete pristupiti prije inicijalizacije (drugi korak) i zato ćete dobiti grešku &lt;code&gt;ReferenceError&lt;/code&gt; ako pokušate da je iskoristite prije inicijalizacije. U suštini 'engine' vam govori: 'Vidim varijablu, deklarisana je, ali nije inicijalizovana i zato joj ne možete pristupiti'.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Napomena: Strogo govoreći varijable deklarisane sa &lt;code&gt;let&lt;/code&gt; i &lt;code&gt;const&lt;/code&gt; između ova dva koraka završavaju u nečemu što se zove 'temporal dead zone' (vremenska mrtva zona), objašnjenje toga bi zahtjevalo malo dublje obješanjenje faze kreacije i egzekucije (izvršenja), te sam smatrao da bi to trebalo biti tema za neki drugi tekst.&lt;/em&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Razlika u ponovnom deklarisanju
&lt;/h4&gt;

&lt;p&gt;Još jedna od razlika je u tome što varijable deklarisane sa &lt;code&gt;var&lt;/code&gt; mogu biti ponovo deklarisane sa istim imenom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr4w58ivnppudegqr0i6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr4w58ivnppudegqr0i6.png" alt="example code of JavaScript redeclaration with var"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo je validna JavaScript sintaksa ako se koristi &lt;code&gt;var&lt;/code&gt;. Druga deklaracija će poništiti prvu i zato će varijabla &lt;code&gt;ime&lt;/code&gt; nositi vrijednost 'John'.&lt;/p&gt;

&lt;p&gt;Očigledno je koliko je ovo potencijalno problematično. Ne želite se naći u situaciji gdje nakon izvjesnog vremena pokušate ponovo deklarisati varijablu zato što ste možda zaboravili da već imate varijablu sa istim imenom.&lt;/p&gt;

&lt;p&gt;Promjenu u ovom kontekstu došle su sa &lt;code&gt;let&lt;/code&gt; (kao i &lt;code&gt;const&lt;/code&gt;). Varijable deklarisane sa &lt;code&gt;let&lt;/code&gt; ne mogu biti ponovo deklarisane i dobićete grešku.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7per7t4g8q8p3yiyu3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7per7t4g8q8p3yiyu3o.png" alt="example JavaScript code for redeclaration with let"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo će izbaciti grešku &lt;code&gt;SyntaxError&lt;/code&gt; istog trenutka kada dođe do ponovo deklarisane varijable.&lt;/p&gt;




&lt;h4&gt;
  
  
  Razlika između &lt;code&gt;let&lt;/code&gt; i &lt;code&gt;const&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Varijable deklarisane sa &lt;code&gt;let&lt;/code&gt; i &lt;code&gt;const&lt;/code&gt; ponašaju identično u svim slučajevima o kojim sam govorio do sada (opseg, podizanje, ponovna deklaracija).&lt;/p&gt;

&lt;p&gt;Razlika između ove dvije ključne riječi je u tome što varijablama koje su deklarisane sa &lt;code&gt;let&lt;/code&gt; mogu dodijeliti novu vrijednost negdje drugo dok varijable koje su deklarisane sa &lt;code&gt;const&lt;/code&gt; to ne dozvoljavaju i to je svrha njihovog uvođenja.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feeut5rmlgxncnulldc7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feeut5rmlgxncnulldc7q.png" alt="example JavaScript code for value change with let"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo ne treba pomiješati sa onim što sam govorio u prethodnom poglavlju da &lt;code&gt;let&lt;/code&gt; varijable ne mogu biti ponovo deklarisane. Ovdje varijabla &lt;code&gt;ime&lt;/code&gt; nije ponovo deklarisana nego joj je samo dodijeljena druga vrijednost.&lt;/p&gt;

&lt;p&gt;Međutim, ključna riječ &lt;code&gt;const&lt;/code&gt; ovo ne dozvoljava.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnko6wgu8rckmc201bwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnko6wgu8rckmc201bwg.png" alt="example JavaScript code for redeclaration with const"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo nije dozvoljeno i dobićete grešku istog trenutka kada dođe do ponovnog dodjeljivanja vrijednosti. Kao što navedena greška kaže, nije dozvoljeno dodjeljivati vrijednost konstantama.&lt;/p&gt;

&lt;p&gt;Jedna stvar na koju treba obratiti pažnju kod &lt;code&gt;const&lt;/code&gt; varijabli je to kako se one ponašaju kada nose vrijednost referentnih tipova podataka, kao što su objekti ili nizovi. Iako ni ovdje nije dozvoljeno ponovo dodjeljivati vrijednost, dozvoljeno je mijenjati same elemente unutar te vrijednosti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5pmwdngpqb1oedobf6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5pmwdngpqb1oedobf6b.png" alt="example of JavaScript code for const object property change"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovdje imamo objekat &lt;code&gt;korisnik&lt;/code&gt; koji ima dva svojstva. Nakon toga je promijenjeno svojstvo &lt;code&gt;godine&lt;/code&gt; u tom objektu.&lt;/p&gt;

&lt;p&gt;Ovo je dozvoljeno u JavaScriptu čak i sa &lt;code&gt;const&lt;/code&gt; varijablama. Ovo se naziva mutacija varijabli. Dakle, dozvoljeno je mijenjati pojedinačna svojstva unutar objekta, ali nije dozvoljeno ponovo dodijeliti vrijednost cijeloj varijabli.&lt;/p&gt;

&lt;p&gt;Postoje načini da se zamrznu neka svojstva u objektima, ali to je tema koju vrijedi ispitadi u zasebnom tekstu.&lt;/p&gt;




&lt;h4&gt;
  
  
  Zaključak
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Izbjegavajte korištenje globalnih varijabli. Ovo otvara previše prostora za preklapanje naziva varijabli iz različitih skripti ili biblioteka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uglavnom bi trebalo izbjeći korištenje &lt;code&gt;var&lt;/code&gt; ključne riječi za deklarisanje varijabli sada kada imamo na raspolaganju &lt;code&gt;let&lt;/code&gt; i &lt;code&gt;const&lt;/code&gt;. Varijable sa &lt;code&gt;var&lt;/code&gt; prljaju globalni (window) objekat, a to je poželjno izbjeći.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Koristite &lt;code&gt;const&lt;/code&gt; za deklarisanje varijabli ako možete predviditi da ta varijabla neće dobijati drugu vrijednost. Ako imate razloga da mislite da će nekad tokom njenog korištenja ta varijabla dobiti drugu vrijednost slobodno možete koristiti &lt;code&gt;let&lt;/code&gt; ključnu riječ.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>es6</category>
    </item>
    <item>
      <title>Destrukturisanje u JavaScriptu - tvoj dobar drugar</title>
      <dc:creator>Slaven Bunijevac</dc:creator>
      <pubDate>Tue, 15 Nov 2022 10:20:35 +0000</pubDate>
      <link>https://forem.com/bslaven/destrukturisanje-u-javascriptu-tvoj-dobar-drugar-m9p</link>
      <guid>https://forem.com/bslaven/destrukturisanje-u-javascriptu-tvoj-dobar-drugar-m9p</guid>
      <description>&lt;p&gt;Šta možete pročitati u ovom članku?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Šta je destrukturisanje i za šta je dobro?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Destrukturisanje sa objektima.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Destukturisanje sa nizovima.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Šta je destrukturisanje i za šta je dobro?
&lt;/h3&gt;

&lt;p&gt;Destrukturisanje (ja sam ovako 'preveo' engleski termin destructuring) je sintaksa sa izvlačenje vrijednosti iz objekata i nizova koja je došla sa ES6 (ES2015) standardom JavaScripta.&lt;/p&gt;

&lt;p&gt;Recimo da imam objekat &lt;code&gt;user&lt;/code&gt; i u njemu neka osnovna svojstva. Prije ES6 standarda način na koji se izvlačila neka vrijednost iz objekta je bio da se koristi notacija sa tačkom ili sa uglastom zagradom ako imam neku dinamičnu vrijednost. Da bi iz ovog objekta izvukao vrijednost najvjerovatniji pristup je:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfen2yorv0cgd2wyd31k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfen2yorv0cgd2wyd31k.png" alt="Ordinary object value usage" width="627" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovo nije nikakav problem ako izvlačite samo jedno svojstvo koje namjeravate da koristite. Međutim, šta ako se nađete u situaciji da izvlačite više svojstava (properties) iz objekta. Ako bi htjeo izvući i godine korisnika morao bih uraditi ovo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsvth1ozb91gaynrb7vt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsvth1ozb91gaynrb7vt.png" alt="getting multiple values from an object" width="628" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tako za svako svojstvo koje želite da izdvojite iz objekta, koliko god da ih ima, a može ih biti mnogo.&lt;/p&gt;

&lt;p&gt;Tu na snagu stupa destrukturisanje.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destrukturisanje sa objektima
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dxwxdid0rpotjkd5yzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dxwxdid0rpotjkd5yzf.png" alt="destructured values from an object" width="688" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dakle, sintaksa je takva da se sa lijeve strane operatora postavlja varijabla koju želite da izvučete iz objekta ali unutar vitičastih zagrada jer izvlačite svojstvo iz objekta. Sa desne strane operatora je objekat iz kog izvlačite svojstvo.&lt;/p&gt;

&lt;p&gt;Može se primjetiti da su u navedenim primjerima korišteni nazivi svojstava tačno onako kako su oni deklarisani u objektu. Međutim, moguće je izdvojiti ova svojstva iz objekta i staviti ih u neku varijablu drugačijeg naziva.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzutoykletmleqdjwf74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzutoykletmleqdjwf74.png" alt="renamed destructured values" width="749" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jednostavno korištenjem dvotačke na desnoj strani svojstva unesem bilo koji naziv koji želim da koristim. U navedenom primjeru, svojstvo &lt;code&gt;name&lt;/code&gt; je izdvojeno iz objekta i stavljeno u varijablu 'ime', a svojstvo &lt;code&gt;age&lt;/code&gt; je izdvojeno iz objekta i stavljeno u varijablu 'godine'.&lt;/p&gt;

&lt;p&gt;Možete nekada doći u situaciju da ne znate nužno da li će neka svojstva postojati u objektu. Korištenje ove metode nam lako omogućava da koristimo &lt;em&gt;default&lt;/em&gt; vrijednosti u slučaju da ne bude nekog svojstva. U suprotnom korištenje nekog svojstva koje ne postoji naravno daje vrijednost &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60jvokfrhzv548fxvoli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60jvokfrhzv548fxvoli.png" alt="code with default values in a destructured value" width="688" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ukoliko objekat user nema svojstvo &lt;code&gt;name&lt;/code&gt; dodijeliće mu se vrijednost 'Mike'. Ukoliko objekat ima to svojstvo koristiće se vrijednosti tog svojstva, a vrijednost 'Mike' će biti ignorisana.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojxuupyhlyryp8ov0dny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojxuupyhlyryp8ov0dny.png" alt="code for default value being ignored" width="570" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oprez:&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;undefined vs null&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;br&gt;
Default vrijednost će biti primijenjena samo ako vrijednost koju tražite bude undefined. U slučaju da vrijednost iz nekog razloga bude null default vrijednost neće biti primijenjena nego ćete dobiti upravo taj &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Destrukturisanje sa objektima je korisno u situacijama kada se proslijeđuje objekat kao argument u funkciji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqz5yyo9i0pcl0rbi70d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqz5yyo9i0pcl0rbi70d.png" alt="code image for destructured values in a function" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prilikom pozivanja funkcije proslijedi se objekat, ali se unutar same funkcije direktno odmah izvrši destrukturisanje dijelova objekta koje želite da koristite u toj funkciji. Ne zaboravite, u objektu koji se proslijeđuje može biti mnogo svojstava. Vi prilikom korištenja funkcije samo izdvojite sebi ona svojstva koja vam trebaju u toj funkciji. Ako hoćete možete sva ostala svojstva staviti u jedan objekat korištenjem &lt;code&gt;rest(...)&lt;/code&gt; operatora, ali to je tema za neki drugi post.&lt;/p&gt;

&lt;p&gt;Ovakvu primjenu prepoznaće React developeri. Ovo je korisno prilikom korištenja &lt;code&gt;props&lt;/code&gt; objekta u nekoj komponenti.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femdjx8b7fo8rpck3fvtj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femdjx8b7fo8rpck3fvtj.png" alt="React Navbar component with destructured values from props" width="794" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prilikom kreiranja komponente &lt;code&gt;Navbar&lt;/code&gt; odmah izdvojite iz objekta &lt;code&gt;props&lt;/code&gt; sve što ćete koristiti u toj komponenti.&lt;/p&gt;

&lt;p&gt;Ponekad objekat sa kojim radite može imati više nivoa, objekat unutar objekta itd, itd. Destrukturisanje može pomoći i u tim situacijama.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7wjt5huam8xxibwwsvx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7wjt5huam8xxibwwsvx.png" alt="Code with destructured nested objects" width="789" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sa lijeve strane dvotačke je svojstvo u objektu na prvom nivou, a sa desne su svojstva unutar tog objekta koja izdvajam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destrukturisanje sa nizovoma
&lt;/h3&gt;

&lt;p&gt;Procedura kod destrukturisanja sa nizovima je vrlo slična uz, naravno, određene razlike.&lt;/p&gt;

&lt;p&gt;Kod nizova se takođe sa desne strane operatora koristi niz iz kog izdvajam vrijednosti, a sa lijeve strane definisana varijabla (konstanta) u koju je pohranjena izdvojena vrijednost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0r5gwbvm5gjv2uurc93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0r5gwbvm5gjv2uurc93.png" alt="code for basic array destructuring" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jedna od razlika je ta što se koriste uglaste zagrade umjesto vitičastih zato što se radi o nizu.&lt;/p&gt;

&lt;p&gt;Druga razlika je što se mora paziti na redoslijed elemenata u nizu. S obzirom da je u nizu redoslijed elemenata važan, isto tako je važno kojim redoslijedom se izdvajaju vrijednosti. Prvi izdvojeni element će imati vrijednost prvog elementa u originalnom nizu, drugi vrijednost drugog itd, itd...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbomapben6ujn63qtkwlt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbomapben6ujn63qtkwlt.png" alt="order of destructuring from the array" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Za razliku od objekata kod destrukturisanja sa nizovima imate punu slobodu u nazivanju varijabli. Naziv elemenata nije ono na šta se oslanja ovaj princip, naravno zato što ih u nizovima nema, nego njihov redoslijed u nizu.&lt;/p&gt;

&lt;p&gt;Dobra stvar sa nizovima je to što se mogu slobodno preskakati elementi u nizu. Recimo da imate niz od tri elementa, ali želite da iskoristite samo prvi i treći. Drugi možete definisati, ali i ne morate. Dovoljno je unijeti prazan prostor kao vrijednost na drugoj poziciji, jasno razdvojenu zarezima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7iw98jcepmx20zrvwve8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7iw98jcepmx20zrvwve8.png" alt="code for skipping a value in destructuring" width="787" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ovakav način izdvajanja vrijednosti iz niza prepoznaće React developeri jer je ovo često rezultat različitih &lt;code&gt;hooks-a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkicscu4fl93wsm8madz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkicscu4fl93wsm8madz.png" alt="example of App react component using destructuring in useState hook" width="763" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To je to što se tiče osnova destrukturisanja.&lt;/p&gt;

&lt;p&gt;Definitivno tu ima još stvari koje bi se mogle pomenuti, kao što je &lt;code&gt;rest&lt;/code&gt; operator, pa onda kako se ponašaju destrukturisane varijable kreirane sa &lt;code&gt;let&lt;/code&gt; u odnosu na one kreirane sa &lt;code&gt;const&lt;/code&gt;. Međutim, smatrao sam da su to teme koje je najbolje obrađivati u odvojenim tekstovima.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
