Eche un vistazo de cerca al código
function* NinjaGenerator() { yield "yoshi"; return "Hattori"; } for (let ninja of NinjaGenerator()) { console.log(ninja); } // console log : yoshi¿Por qué "Hattori" no está registrado? Mientras que cuando iteramos sobre el iterador usando iterator.next(), muestra ese valor.
function* NinjaGenerator() { yield "yoshi"; return "Hattori"; } let ninjaIterator = NinjaGenerator(); let firstValue = ninjaIterator.next().value; let secondValue = ninjaIterator.next().value; console.log(firstValue, secondValue); // console log: yoshi HattoriAlguien, por favor, ayúdeme a entender cómo funciona el bucle for-of en el iterador creado por el generador.
El valor de next() tiene una propiedad done que distingue el valor de retorno de los valores obtenidos. Los valores obtenidos han done = false , mientras que los valores devueltos han done = true .
for-of procesa los valores hasta que done = true e ignora ese valor. De lo contrario, los generadores que no tienen una declaración de return explícita siempre producirán un undefined extra en el bucle for . Y cuando esté escribiendo el generador, tendría que codificarlo para usar return para la última iteración en lugar de yield , lo que lo complicaría innecesariamente. El valor de retorno rara vez se necesita, ya que generalmente solo desea valores de rendimiento consistentes.