în JavaScript un iterator este un obiect care definește o secvență și, eventual, o valoare returnată la terminarea acesteia.
în mod specific, un iterator este orice obiect care implementează protocolul Iterator având onext()
metodă care returnează un obiect cu două proprietăți:
value
următoarea valoare din secvența de iterație. done
acesta estetrue
dacă ultima valoare din secvență a fost deja consumată. Dacă value
este prezent alături de done
, este valoarea returnată a iteratorului.
odată creat, un obiect iterator poate fi iterat în mod explicit apelând în mod repetat next()
. Iterarea peste un iterator se spune că consumă iteratorul, deoarece, în general, este posibil să se facă o singură dată. După o valoare de terminare a fost dat apeluri suplimentare la next()
ar trebui să continue să se întoarcă{done: true}
.
cel mai comun iterator din JavaScript este iteratorul Array, care returnează fiecare valoare din matricea asociată în secvență.
deși este ușor de imaginat că toți iteratorii ar putea fi exprimați ca matrice, acest lucru nu este adevărat. Tablourile trebuie alocate în întregime, dar iteratoarele sunt consumate numai după cum este necesar. Din acest motiv, iteratorii pot exprima secvențe de dimensiuni nelimitate, cum ar fi gama de numere întregi între 0
și Infinity
.
Iată un exemplu care poate face exact asta. Acesta permite crearea unui iterator interval simplu, care definește o secvență de numere întregi de la start
(inclusiv) la end
(exclusiv) distanțate step
apart. Valoarea sa finală de returnare este dimensiunea secvenței pe care a creat-o, urmărită de variabila iterationCount
.
function makeRangeIterator(start = 0, end = Infinity, step = 1) { let nextIndex = start; let iterationCount = 0; const rangeIterator = { next: function() { let result; if (nextIndex < end) { result = { value: nextIndex, done: false } nextIndex += step; iterationCount++; return result; } return { value: iterationCount, done: true } } }; return rangeIterator;}
utilizarea iteratorului arată astfel:
const it = makeRangeIterator(1, 10, 2);let result = it.next();while (!result.done) { console.log(result.value); // 1 3 5 7 9 result = it.next();}console.log("Iterated over sequence of size: ", result.value); //
notă: nu este posibil să știm reflectiv dacă un anumit obiect este un iterator. Dacă trebuie să faceți acest lucru, utilizați Iterabile.