Maybaygiare.org

Blog Network

iteratorer och generatorer

i JavaScript är en iterator ett objekt som definierar en sekvens och potentiellt ett returvärde vid dess avslutning.

specifikt är en iterator ett objekt som implementerar Iteratorprotokollet genom att ha en next() metod som returnerar ett objekt med två egenskaper:

value nästa värde i iterationssekvensen. done Detta är true om det sista värdet i sekvensen redan har förbrukats. Om value finns tillsammans med done är det iteratorns returvärde.

När ett iteratorobjekt har skapats kan det upprepas explicit genom att upprepade gånger anropa next(). Iterating över en iterator sägs konsumera iteratorn, eftersom det i allmänhet bara är möjligt att göra en gång. Efter ett avslutande värde har givits ytterligare samtal till next() bör fortsätta att returnera {done: true}.

den vanligaste iteratorn i JavaScript är Array iterator, som returnerar varje värde i den associerade arrayen i sekvens.

även om det är lätt att föreställa sig att alla iteratorer kan uttryckas som matriser, är detta inte sant. Arrays måste allokeras i sin helhet, men iteratorer förbrukas endast vid behov. På grund av detta kan iteratorer uttrycka sekvenser av obegränsad storlek, såsom intervallet av heltal mellan 0 och Infinity.

Här är ett exempel som kan göra just det. Det gör det möjligt att skapa en enkel intervall iterator som definierar en sekvens av heltal från start (inclusive) till end (exklusiv) åtskilda step isär. Dess slutliga returvärde är storleken på sekvensen som den skapade, spårad av variabeln 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;}

använda iteratorn ser så här 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); // 

Obs: Det är inte möjligt att känna till reflektivt om ett visst objekt är en iterator. Om du behöver göra detta, använd Iterables.

Lämna ett svar

Din e-postadress kommer inte publiceras.