Maybaygiare.org

Blog Network

Iteratory i generatory

w języku JavaScript iterator jest obiektem, który definiuje sekwencję i potencjalnie Zwraca wartość po jej zakończeniu.

w szczególności iteratorem jest dowolny obiekt, który implementuje protokół iteratora poprzeznext() metoda, która zwraca obiekt o dwóch właściwościach:

value Następna wartość w sekwencji iteracji. done jest totrue, jeśli ostatnia wartość w sekwencji została już wykorzystana. Jeśli value jest obecny obok done, jest to wartość zwracana przez iterator.

Po utworzeniu obiekt iterator może być jawnie iterowany przez wielokrotne wywołanie next(). Mówi się, że iteracja nad iteratorem pochłania iterator, ponieważ generalnie można to zrobić tylko raz. Po wygenerowaniu wartości kończącej dodatkowe wywołania do next()powinny nadal zwracać{done: true}.

najczęstszym iteratorem w JavaScript jest iterator tablicy, który zwraca kolejno każdą wartość w powiązanej tablicy.

chociaż łatwo sobie wyobrazić, że wszystkie Iteratory mogą być wyrażone jako tablice, to nie jest to prawda. Tablice muszą być przydzielane w całości, ale Iteratory są zużywane tylko w razie potrzeby. Z tego powodu Iteratory mogą wyrażać sekwencje o nieograniczonej wielkości, takie jak zakres liczb całkowitych pomiędzy 0 I Infinity.

oto przykład, który może to zrobić. Umożliwia stworzenie prostego iteratora zakresu, który definiuje sekwencję liczb całkowitych od start (włącznie) do end (wyłącznie) rozmieszczonych step osobno. Jego końcowa wartość zwracana jest wielkością wytworzonego ciągu, śledzonego przez zmienną 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;}

użycie iteratora wygląda następująco:

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

notatka: nie można w sposób odbiciowy stwierdzić, czy dany obiekt jest iteratorem. Jeśli chcesz to zrobić, użyj Iterables.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.