Maybaygiare.org

Blog Network

iteratorer og generatorer

i JavaScript er en iterator et objekt, der definerer en sekvens og potentielt en returværdi ved dens afslutning.

specifikt er en iterator ethvert objekt, der implementerer Iteratorprotokollen ved at have ennext() metode, der returnerer et objekt med to egenskaber:

value den næste værdi i iterationssekvensen. done dette er true hvis den sidste værdi i sekvensen allerede er forbrugt. Hvis value er til stede sammen med done, er det iteratorens returværdi.

når det er oprettet, kan et iteratorobjekt gentages eksplicit ved gentagne gange at kalde next(). Iterating over en iterator siges at forbruge iteratoren, fordi det generelt kun er muligt at gøre en gang. Efter en afsluttende værdi er blevet givet yderligere opkald til next()skal fortsætte med at returnere {done: true}.

den mest almindelige iterator i JavaScript er Array iterator, som returnerer hver værdi i det tilknyttede array i rækkefølge.

selvom det er let at forestille sig, at alle iteratorer kunne udtrykkes som arrays, er dette ikke sandt. Arrays skal tildeles i deres helhed, men iteratorer forbruges kun efter behov. På grund af dette kan iteratorer udtrykke sekvenser af ubegrænset størrelse, såsom rækkevidden af heltal mellem 0 og Infinity.

Her er et eksempel, der kan gøre netop det. Det tillader oprettelse af en simpel range iterator, der definerer en sekvens af heltal fra start (inklusive) til end (eksklusiv) afstand step fra hinanden. Dens endelige returværdi er størrelsen på den sekvens, den oprettede, sporet af variablen 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;}

brug af iteratoren ser så sådan ud:

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

Bemærk: Det er ikke muligt at vide reflekterende, om et bestemt objekt er en iterator. Hvis du har brug for at gøre dette, skal du bruge Iterables.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.