Maybaygiare.org

Blog Network

Iterators and generators

in JavaScript is een iterator een object dat een reeks en mogelijk een retourwaarde definieert na beëindiging ervan.

specifiek is een iterator elk object dat het iterator-protocol implementeert door een next() methode te hebben die een object met twee eigenschappen retourneert:

value de volgende waarde in de iteratiereeks. done dit is true als de laatste waarde in de reeks al is verbruikt. Als value naast done aanwezig is, is dit de return waarde van de iterator.

eenmaal aangemaakt, kan een iterator-object expliciet worden herhaald door next()aan te roepen. Er wordt gezegd dat itereren over een iterator de iterator verbruikt, omdat het over het algemeen slechts één keer mogelijk is. Nadat een afsluitwaarde is verkregen, moeten extra aanroepen naar next() doorgaan met {done: true}te retourneren.

De meest voorkomende iterator in JavaScript is de Array iterator, die elke waarde in de bijbehorende array in volgorde retourneert.

hoewel het gemakkelijk voor te stellen is dat alle iterators als arrays kunnen worden uitgedrukt, is dit niet waar. Arrays MOETEN in hun geheel worden toegewezen, maar iterators worden alleen gebruikt als dat nodig is. Hierdoor kunnen iterators reeksen van onbeperkte grootte uitdrukken, zoals het bereik van gehele getallen tussen 0 en Infinity.

Hier is een voorbeeld dat precies dat kan doen. Het maakt het mogelijk om een simple range iterator aan te maken die een reeks gehele getallen definieert van start (inclusief) tot end (exclusief) spaced step apart. De uiteindelijke return waarde is de grootte van de sequentie die het creëerde, gevolgd door de variabele 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;}

het gebruik van de iterator ziet er dan als volgt uit:

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); // 

Opmerking: Het is niet mogelijk om reflecterend te weten of een bepaald object een iterator is. Als je dit moet doen, gebruik Iterables.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.