in JavaScript an iterator is an object which defines a sequence and potentially a return value upon its termination.
Especificamente, um iterador é qualquer objeto que implementa o Iterador de protocolo por ter uma next()
método que retorna um objeto com duas propriedades:
value
O próximo valor na iteração sequência. done
This istrue
if the last value in the sequence has already been consumed. Se value
está presente ao lado de done
, é o valor de retorno do iterador.
Uma vez criado, um objeto iterador pode ser iterado explicitamente chamando repetidamente next()
. Iterating over an iterator is said to consom the iterator, because it is generally only possible to do once. Depois que um valor terminal foi obtido chamadas adicionais para next()
deve continuar a retornar {done: true}
.
o iterador mais comum em JavaScript é o iterator Array, que retorna cada valor na matriz associada em sequência.
embora seja fácil imaginar que todos os iteradores poderiam ser expressos como arrays, isso não é verdade. As matrizes devem ser alocadas na sua totalidade, mas os iteradores são consumidos apenas quando necessário. Devido a isso, iteradores podem expressar sequências de tamanho ilimitado, como a gama de inteiros entre 0
e Infinity
.
Aqui está um exemplo que pode fazer exatamente isso. It allows creation of a simple range iterator which defines a sequence of integers from start
(inclusive) to end
(exclusive) spaced step
apart. Seu valor final de retorno é o tamanho da sequência que criou, seguido pela variável 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;}
Usando o iterator, em seguida, olha como este:
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); //
Nota: não é possível saber de maneira reflexiva se um determinado objeto é um iterador. Se precisares de fazer isto, usa Iterables.