Javascriptissä iteraattori on objekti, joka määrittelee sekvenssin ja mahdollisesti palautusarvon sen päättyessä.
erityisesti iteraattori on mikä tahansa kohde, joka toteuttaa Iteraattoriprotokollan siten, että next()
menetelmä, joka palauttaa objektin kahdella ominaisuudella:
value
iterointisarjan seuraava arvo. done
tämä on true
, jos järjestysnumeron viimeinen arvo on jo kulutettu. Jos value
esiintyy done
rinnalla, se on iteraattorin palautusarvo.
kun iteraattori on luotu, voidaan iteraattorin olio iteroida eksplisiittisesti kutsumalla toistuvasti next()
. Iteroinnin iteraattorin yli sanotaan kuluttavan iteraattorin, koska se on yleensä mahdollista tehdä vain kerran. Kun lopetusarvosta on saatu lisäpyyntöjä next()
pitäisi jatkaa paluuta {done: true}
.
JavaScriptin yleisin iteraattori on Array-iteraattori, joka palauttaa jokaisen liittyvän array-arvon järjestyksessä.
vaikka on helppo kuvitella, että kaikki iteraattorit voitaisiin ilmaista taulukoina, tämä ei pidä paikkaansa. Matriisit on allokoitava kokonaisuudessaan, mutta iteraattoreita käytetään vain tarpeen mukaan. Tämän vuoksi iteraattorit voivat ilmaista rajattoman kokoisia sekvenssejä, kuten kokonaislukujen vaihteluvälin 0
ja Infinity
.
tässä on esimerkki, joka voi tehdä juuri niin. Sen avulla voidaan luoda yksinkertainen kantama-iteraattori, joka määrittelee kokonaislukujen sarjan start
(inclusive) end
(exclusive) välein step
toisistaan. Sen lopullinen palautusarvo on sen luoman sekvenssin koko, jota seuraa muuttuja 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;}
iteraattorin käyttäminen näyttää näin:
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); //
Huomaa: ei ole mahdollista tietää heijastavasti, onko tietty kohde iteraattori. Jos haluat tehdä tämän, käytä Iterables.