
ES6 uvodi novi način interakcije s JavaScript podatkovnim strukturama - iteracija . Demistificirajmo ga.
Postoje 2 temeljna koncepta:
- Iterable - opisuje ga struktura podataka koja pruža način izlaganja svojih podataka javnosti. To se postiže primjenom metode čiji je ključ
Symbol.iterator
.Symbol.iterator
je tvornica iteratora. - Iterator - opisuje ga struktura koja sadrži pokazivač na sljedeći element u iteraciji.
Protokol
I iterable i iterator slijede protokol koji omogućava objektima da budu iterabilni:
- Interable mora biti objekt sa funkcija iteratora čiji je ključ
Symbol.iterator
.
- Iteratora mora biti objekt sa funkciju pod nazivom
next
koji se vraća objekt s tipkama:value
- Dosadašnja točka u iteraciji; idone
- true ako je iteracija završila, false false u suprotnom.
Interabilnost
Iterability slijedi ideju izvora podataka i potrošača podataka :
- izvori podataka - mjesto su odakle potrošači podataka dobivaju svoje podatke. Na primjer,
Array
takav kao što[1,2,3]
je struktura izvora podataka koja sadrži podatke kroz koje će se korisnik ponoviti (npr1, 2, and 3
.). Više primjeri suString
,Maps
iSets
. - potrošači podataka - jesu ono što troši podatke iz izvora podataka. Na primjer,
for-of
petlja je potrošač podataka koji može prelaziti prekoArray
izvora podataka. Još primjera suspread operator
iArray.from
.
Da bi struktura bila izvor podataka , ona mora dopustiti i reći kako se njezini podaci trebaju trošiti. To se radi putem iteratora . Stoga izvor podataka treba slijediti gore opisani protokol iteratora.
Međutim, nije praktično da svaki potrošač podataka podržava sve izvore podataka , pogotovo jer nam JavaScript omogućuje stvaranje vlastitih izvora podataka. Tako ES6 uvodi sučelje Iterable .
Potrošači podataka troše podatke iz izvora podataka putem iterablea .
U praksi
Pogledajmo kako ovo funkcionira na definiranom izvoru podataka - Array
.
Izvori podataka koji se mogu ponoviti

Upotrijebit ćemo for-of
za istraživanje nekih izvora podataka koji implementiraju iterabilni protokol .
Obični objekti
U ovoj fazi moramo reći da obični objekti nisu ponovljivi. Axel Rauschmayer sjajno radi objašnjavajući zašto na istraživanju ES6.
Kratko objašnjenje je da možemo prelaziti preko JavaScript objekata na dvije različite razine:
- programska razina - što znači ponavljanje svojstava objekta koja predstavljaju njegovu strukturu. Na primjer,
Array.prototype.length
wherelength
je povezano sa strukturom objekta, a ne s podacima. - razina podataka - što znači ponavljanje strukture podataka i izdvajanje njezinih podataka. Na primjer, za naš
Array
primjer, to bi značilo ponavljanje podataka niza. Akoarray = [1,2,3,4]
, prelistajte vrijednosti1, 2, 3 and 4
.
Problem običnih predmeta je sposobnost svih da kreiraju vlastite predmete.
U našem Hugovom primjeru, kako bi JavaScript mogao razlikovati razinu podataka, tj. Hugo.fullName
, I razinu programa, tj. Hugo.toString()
?
Iako je moguće razlikovati dvije razine iteracije na dobro definiranim strukturama, kao što je Arrays
to nemoguće učiniti za bilo koji objekt.
To je razlog zašto smo dobili inačicu za besplatno Array
(također String
, Map
i Set
), ali ne na obične predmete.
Provedite interaktivne proizvode

Možemo izgraditi vlastite iterable, iako za to obično koristimo generatore.
Da bismo stvorili vlastiti iterable, moramo slijediti iteracijski protokol koji kaže:
- Objekt postaje iterabilan ako implementira funkciju čiji je ključ
Symbol.iterator
i vraćaiterator
. iterator
Sama je objekt s funkcijom zovenext
unutar njega.next
treba vratiti objekt s dva ključavalue
idone
.value
sadrži sljedeći element iteracije idone
zastavicu koja govori je li iteracija završena.
Primjer
Naša iterabilna implementacija vrlo je jednostavna. Slijedili smo iterabilni protokol i na svakoj iteraciji for-of
petlja će od iteratora tražiti next
element.
Naš iterator će se iteracijom vratiti na next
objekt koji sadrži sljedeće:
Imajte na umu da mijenjamo redoslijed naših nekretnina next
i done
radi praktičnosti. Imajući next
prvo, to bi prekinulo implementaciju, jer ćemo prvo iskočiti element, a zatim prebrojati elemente.
Korisno je znati da done
je to false
zadano, što znači da ga možemo ignorirati kada je to slučaj. Isto vrijedi i value
kad done
jest true
.
To ćemo vidjeti za minutu.
Iterator kao iterabilan
Svoj iterator mogli bismo izgraditi kao iterabilan.
Imajte na umu da je ovo obrazac koji slijede ugrađeni ES6 ugrađeni iteratori.
Zašto je ovo korisno?
Iako for-of
radi samo s iterabilima, a ne s iteratorima, budući da je isto znači da možemo zaustaviti izvršavanje for-of
i nastaviti pogovorne riječi.
Povratak i Bacanje
Postoje dvije neobavezne metode iteratora koje još nismo istražili:
Povratak
return
daje iteratoru mogućnost da očisti kuću kad se neočekivano slomi. Kada pozivamo return
iterator, preciziramo da više ne planiramo pozivati next
.
Bacanje
throw
primjenjuje se samo na generatore. To ćemo vidjeti kad se igramo s generatorima.
Zaključak
ES6 donosi iteraciju kao novi način ponavljanja JavaScript struktura podataka.
Da bi iteracija bila moguća postoje proizvođači podataka koji sadrže podatke i potrošači podataka koji uzimaju te podatke.Da bi ova kombinacija nesmetano radila, iteracija je definirana protokolom koji kaže:
- An
iterable
je objekt koji implementira funkciju čiji je ključSymbol.iterator
i vraća aniterator
. - An
iterator
je objekt u kojem se zove funkcijanext
.next
je objekt s dva ključavalue
idone
.value
sadrži sljedeći element iteracije idone
zastavicu koja govori je li iteracija završena.
Obični objekti nisu iterable
jer ne postoji jednostavan način za razlikovanje iteracije programa i razine podataka.
Zato ES6 nudi način za izgradnju vlastitih iteratora slijedeći iterator
protokol.

Zahvaljujući ?
- Axel Rauschmayer za svoje istraživanje ES6 - Iteracija
- Nicolás Bevacqua za svoj PonyFoo - ES6 iteratori u dubini
- Svim obožavateljima Simpsonovih
Svakako pogledajte moje ostale članke o ES6
Istražimo ES6 generatore
Generatori su implementacija iterablea. medium.freecodecamp.com