de Tiago Lopes Ferreira
Table of Contents
Demitificarea ES6 Iterabile și Iteratoare

ES6 introduce un nou mod de a interacționa cu structurile de date JavaScript – repetare. Să o demitizăm.
Există 2 concepte de bază:
-
Iterabil – descris de o structură de date care oferă o modalitate de a-și expune datele publicului. Acest lucru se realizează prin implementarea unei metode a cărei cheie este
Symbol.iterator
.Symbol.iterator
este o fabrică de iteratori. - Iterator – descris de o structură care conține un pointer către următorul element din iterație.
Protocol
Atât iterabil, cât și iterator urmează un protocol care permite obiectelor să fie iterabile:
- Un interabil trebuie să fie un obiect cu un iterator de funcții a cărui cheie este
Symbol.iterator
.
- Un iterator trebuie să fie un obiect cu o funcție numită
next
care returnează un obiect cu tastele:value
– elementul curent din iterație; șidone
– Adevărat dacă iterația s-a încheiat, fals in caz contrar.
Iterabilitate
Iterabilitatea urmează ideea de surse de date și consumatorii de date:
-
surse de date– sunt locul de unde consumatorii de date își obțin datele. De exemplu, un
Array
precum[1,2,3]
este o structură de sursă de date care conține datele prin care va itera un consumator de date (de ex1, 2, and 3
). Mai sunt exempleString
,Maps
șiSets
. -
consumatorii de date – sunt cele care consumă datele din sursele de date. De exemplu,
for-of
loop este un consumator de date capabil să itereze peste unArray
sursă de date. Mai multe exemple suntspread operator
șiArray.from
.
Pentru ca o structură să fie o sursă de date, trebuie să permită și să spună cum ar trebui consumate datele sale. Acest lucru se face prin iteratori. Prin urmare, a sursă de date trebuie să respecte protocolul iterator descris mai sus.
Cu toate acestea, nu este practic pentru fiecare consumator de date să-i susțin pe toți surse de date, mai ales că JavaScript ne permite să ne construim propriile surse de date. Deci ES6 introduce interfața Iterabil.
Consumatori de date consumă datele de la surse de date prin iterabile.
In practica
Să vedem cum funcționează acest lucru pe o sursă de date definită – Array
.
Surse de date iterabile

Noi vom folosi for-of
pentru a explora unele dintre sursele de date care implementează protocol iterabil.
Obiecte simple
În acest stadiu trebuie să spunem că obiectele simple nu sunt iterabile. Axel Rauschmayer face o treabă grozavă explicând de ce Explorarea ES6.
O scurtă explicație este că putem itera peste un obiect JavaScript la două niveluri diferite:
-
nivelul programului – ceea ce înseamnă iterația asupra unui obiect proprietăți care reprezintă structura acestuia. De exemplu,
Array.prototype.length
, Undelength
este legat de structura obiectului și nu de date. -
nivel de date – adică iterați asupra unei structuri de date și extrageți datele acesteia. De exemplu, pentru
Array
de exemplu, asta ar însemna iterarea asupra datelor matricei. Dacăarray = [1,2,3,4]
, iterați peste valori1, 2, 3 and 4
.
Cu toate acestea, aducerea conceptului de iterație în obiecte simple înseamnă amestecarea programului și a structurilor de date – Axel
Problema cu obiectele simple este capacitatea tuturor oamenilor de a-și crea propriile obiecte.
În exemplul Hugo al nostru, cum ar face JavaScript distincția între nivelul de date, adică Hugo.fullName
, și nivelul programului, adică Hugo.toString()
?
Deși este posibil să se facă distincția între cele două niveluri de iterație pe structuri bine definite, cum ar fi Arrays
, este imposibil să se facă acest lucru pentru orice obiect.
Acesta este motivul pentru care primim iterație gratuit pe Array
(de asemenea pe String
, Map
, și Set
) dar nu pe obiecte simple.
Cu toate acestea, putem implementa propriile noastre iterabile.
Implementați Iterables

Ne putem construi propriile iterabile, deși de obicei folosim generatoare pentru asta.
Pentru a ne construi propriul iterabil, trebuie să urmăm protocolul de iterație, care spune:
- Un obiect devine un iterabil dacă implementează o funcție a cărei cheie este
Symbol.iterator
și returnează uniterator
. -
iterator
în sine este un obiect cu o funcție numitănext
inauntru.next
ar trebui să returneze un obiect cu două tastevalue
șidone
.value
conține următorul element al iterației șidone
un steag care spune dacă iterația s-a încheiat.
Exemplu
Implementarea noastră iterabilă este foarte simplă. Am urmat protocol iterabil și la fiecare iterație for-of
bucla va cere iteratorului pentru next
element.
Iteratorul nostru va reveni next
un obiect care conține următoarele prin iterație:
Vă rugăm să rețineți că schimbăm ordinea proprietăților noastre next
și done
pentru confort. Având next
în primul rând, ar rupe implementarea, deoarece vom afișa mai întâi un element și apoi vom conta elementele.
Este util să știi asta done
este false
implicit, ceea ce înseamnă că îl putem ignora atunci când este cazul. Același lucru este valabil și pentru value
cand done
este true
.
Vom vedea asta într-un minut.
Iterator ca Iterabil
Am putea construi iteratorul nostru ca un iterabil.
Vă rugăm să rețineți că acesta este modelul urmat de iteratorii încorporați ES6.
De ce este util acest lucru?
Cu toate că for-of
funcționează numai cu iterabile, nu cu iteratori, fiind același mijloc că putem întrerupe executarea for-of
și continuați postfaces.
Reveniți și aruncați
Există două metode opționale de iterare pe care nu le-am explorat încă:
Întoarcere
return
oferă iteratorului posibilitatea de a a curăța casa când se sparge pe neașteptate. Când sunăm return
pe un iterator specificăm că nu intenționăm să sunăm next
mai mult.
Arunca
throw
se aplică numai generatoarelor. Vom vedea asta când ne jucăm cu generatoare.
Concluzie
ES6 aduce iterația ca o nouă modalitate de a itera peste structurile de date JavaScript.
Pentru ca iterația să fie posibilă există producători de date, care conțin datele și consumatori de date, care iau aceste date.
Pentru ca această combinație să funcționeze fără probleme, iterația este definită de un protocol, care spune:
- Un
iterable
este un obiect care implementează o funcție a cărei cheie esteSymbol.iterator
și returnează uniterator
. - Un
iterator
este un obiect cu o funcție numitănext
inauntru.next
este un obiect cu două tastevalue
șidone
.value
conține următorul element al iterației șidone
un steag care spune dacă iterația s-a încheiat.
Obiectele simple nu sunt iterable
deoarece nu există o modalitate ușoară de a distinge între iterația nivelului de program și de date.
De aceea ES6 oferă o modalitate de a ne construi proprii iteratori urmând iterator
protocol.

Mulțumită ?
- Axel Rauschmayer pentru a lui Explorarea ES6 – Iterare
- Nicolás Bevacqua pentru a lui PonyFoo – Iteratori ES6 în adâncime
- Pentru toti Simpsonii fanii
Asigurați-vă că verificați celelalte articole despre ES6
Să explorăm generatoarele ES6
Generatoarele sunt o implementare de iterabile.medium.freecodecamp.com