A JavaScript-ben az iterátor olyan objektum, amely meghatároz egy szekvenciát és potenciálisan visszatérési értéket annak befejezésekor.
pontosabban, az iterátor minden olyan objektum, amely az Iterátor protokollt egy next()
módszerrel valósítja meg, amely két tulajdonsággal rendelkező objektumot ad vissza:
value
az iterációs sorozat következő értéke. done
ez true
ha a sorozat utolsó értéke már elfogyott. Ha value
a done
mellett van jelen, akkor ez az iterátor visszatérési értéke.
a létrehozás után egy iterátorobjektum kifejezetten iterálható a next()
ismételt hívásával. Az iterátoron keresztüli iterálás állítólag elfogyasztja az iterátort, mert általában csak egyszer lehetséges. Miután egy lezáró érték kapott további hívásokat next()
továbbra is vissza kell térnie {done: true}
.
a JavaScript leggyakoribb iterátora a tömb iterátor, amely a társított tömb minden értékét egymás után adja vissza.
bár könnyű elképzelni, hogy minden iterátor tömbként fejezhető ki, ez nem igaz. A tömböket teljes egészében ki kell osztani, de az iterátorokat csak szükség szerint fogyasztják el. Emiatt az iterátorok korlátlan méretű szekvenciákat fejezhetnek ki, például a 0
és a Infinity
közötti egész számok tartományát.
itt van egy példa, amely képes erre. Ez lehetővé teszi egy egyszerű tartomány iterátor létrehozását, amely meghatározza az egész számok sorozatát a start
(beleértve) a end
(kizárólagos) egymástól step
egymástól. Végső visszatérési értéke az általa létrehozott szekvencia mérete, amelyet a iterationCount
változó követ.
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;}
az iterátor használata így néz ki:
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); //
megjegyzés: nem lehet reflektív módon tudni, hogy egy adott objektum iterátor-e. Ha ezt meg kell tennie, használjon Iterables-t.