Maybaygiare.org

Blog Network

Iterátory a generátory

V Javascriptu iterátor je objekt, který definuje posloupnost a případně vrátit hodnotu při jejím ukončení.

Konkrétně, iterátor je libovolný objekt, který implementuje Iterátor protokolu tím, že next() metoda, která vrací objekt s dvěma vlastnostmi:

value další hodnotu iterace sekvence. done Toto je true pokud již byla spotřebována poslední hodnota v sekvenci. Pokud je value přítomen vedle done, je to návratová hodnota iterátoru.

po vytvoření může být objekt iterátoru explicitně iterován opakovaným voláním next(). Iterace přes iterátor se říká, že spotřebovává iterátor, protože je obecně možné provést pouze jednou. Po ukončení hodnoty byla poskytnuta další volání na next() by měla pokračovat v návratu {done: true}.

nejběžnějším iterátorem v JavaScriptu je iterátor pole, který vrací každou hodnotu v přidruženém poli v pořadí.

i když je snadné si představit, že všechny iterátory by mohly být vyjádřeny jako pole, není to pravda. Pole musí být přidělena jako celek, ale iterátory jsou spotřebovány pouze podle potřeby. Z tohoto důvodu mohou iterátory vyjadřovat sekvence neomezené velikosti, například rozsah celých čísel mezi 0 a Infinity.

zde je příklad, který může udělat právě to. To umožňuje vytvoření jednoduchého rozsah iterátor, který definuje posloupnost celých čísel od start (včetně), aby end (exkluzivní) rozmístěných step od sebe. Jeho konečná návratová hodnota je velikost sekvence, kterou vytvořila, sledovaná proměnnou 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;}

Pomocí iterátor pak vypadá takto:

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

Poznámka: není možné vědět, přemýšlivě, zda určitý objekt je iterátor. Pokud to potřebujete, použijte Iterables.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.