I JavaScript er En iterator et objekt som definerer en sekvens og potensielt en returverdi ved avslutningen.
spesifikt er en iterator ethvert objekt som implementerer Iteratorprotokollen ved å ha en next()
metode som returnerer et objekt med to egenskaper:
value
den neste verdien i iterasjonssekvensen. done
dette ertrue
hvis den siste verdien i sekvensen allerede er brukt. Hvis value
er til stede ved siden av done
, er det iteratorens returverdi.
når det er opprettet, kan et iteratorobjekt gjentas eksplisitt ved å ringe next()
. Iterating over en iterator sies å konsumere iteratoren, fordi det vanligvis bare er mulig å gjøre en gang. Etter en avsluttende verdi har blitt gitt flere anrop til next()
skal fortsette å returnere {done: true}
.
Den vanligste iteratoren i JavaScript Er Array iteratoren, som returnerer hver verdi i den tilknyttede arrayen i rekkefølge.
mens det er lett å forestille seg at alle iteratorer kan uttrykkes som arrays, er dette ikke sant. Arrays må allokeres i sin helhet, men iteratorer forbrukes bare etter behov. På grunn av dette kan iteratorer uttrykke sekvenser med ubegrenset størrelse, for eksempel rekkevidden av heltall mellom 0
og Infinity
.
her er et eksempel som kan gjøre nettopp det. Det tillater opprettelse av en enkel rekkevidde iterator som definerer en sekvens av heltall frastart
(inkludert) tilend
(eksklusiv) avstandstep
fra hverandre. Den endelige returverdien er størrelsen på sekvensen den opprettet, sporet av variabelen 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;}
Ved hjelp av iteratoren ser det slik ut:
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); //
Merk: det er ikke mulig å vite reflektert om et bestemt objekt er en iterator. Hvis du trenger å gjøre dette, bruk Iterables.