Maybaygiare.org

Blog Network

Iteradores y generadores

En JavaScript, un iterador es un objeto que define una secuencia y potencialmente un valor de retorno tras su terminación.

Específicamente, un iterador es cualquier objeto que implementa el protocolo Iterador al tener un método next() que devuelve un objeto con dos propiedades:

value El siguiente valor en la secuencia de iteración. done Esto es true si el último valor de la secuencia ya se ha consumido. Si value está presente junto a done, es el valor devuelto por el iterador.

Una vez creado, un objeto iterador se puede iterar explícitamente llamando repetidamente a next(). Iterar sobre un iterador se dice que consume el iterador, porque generalmente solo es posible hacerlo una vez. Después de obtener un valor de terminación, las llamadas adicionales a next() deben continuar devolviendo {done: true}.

El iterador más común en JavaScript es el iterador de matrices, que devuelve cada valor en la matriz asociada en secuencia.

Aunque es fácil imaginar que todos los iteradores podrían expresarse como matrices, esto no es cierto. Los arrays deben asignarse en su totalidad, pero los iteradores solo se consumen cuando es necesario. Debido a esto, los iteradores pueden expresar secuencias de tamaño ilimitado, como el rango de enteros entre 0 y Infinity.

Aquí hay un ejemplo que puede hacer precisamente eso. Permite la creación de un iterador de rango simple que define una secuencia de enteros desde start(inclusive)hasta end(exclusivo) espaciado step aparte. Su valor de retorno final es el tamaño de la secuencia que creó, seguido por la variable 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 el iterador, a continuación, se parece a esto:

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: no es posible conocer reflexivamente si un objeto en particular es un iterador. Si necesitas hacer esto, usa Iterables.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.