{"id":17663952,"url":"https://github.com/tiago154/iterators-e-generators","last_synced_at":"2026-06-17T16:02:41.432Z","repository":{"id":99007778,"uuid":"288052382","full_name":"tiago154/iterators-e-generators","owner":"tiago154","description":"➿ ➰ 🔁 Repositório com intuito de exemplificar e descrever o funcionamento dos `Iterators` e `Generators` em Javascript","archived":false,"fork":false,"pushed_at":"2020-08-17T23:03:52.000Z","size":2620,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-05T13:53:38.545Z","etag":null,"topics":["generator","iterator","yield"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tiago154.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-17T01:01:02.000Z","updated_at":"2020-08-20T12:41:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"106bb459-f3db-4a1c-bf6a-e1013ea7a493","html_url":"https://github.com/tiago154/iterators-e-generators","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiago154%2Fiterators-e-generators","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiago154%2Fiterators-e-generators/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiago154%2Fiterators-e-generators/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tiago154%2Fiterators-e-generators/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tiago154","download_url":"https://codeload.github.com/tiago154/iterators-e-generators/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246314150,"owners_count":20757463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["generator","iterator","yield"],"created_at":"2024-10-23T19:42:57.098Z","updated_at":"2025-10-27T07:18:54.473Z","avatar_url":"https://github.com/tiago154.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"\" rel=\"noopener\"\u003e\r\n \u003cimg src=\"https://user-images.githubusercontent.com/10531605/90449872-b4cd8f80-e0be-11ea-8e34-ea125950bcf9.png\" alt=\"Project logo\"\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n# Iterators e Generators\r\n\r\n## 📝 Conteúdo\r\n\r\n- [Descrição](#descrição)\r\n- [Começando](#começando)\r\n- [Exemplos](#exemplos)\r\n\r\n## 🧐 Descrição \u003ca name = \"descrição\"\u003e\u003c/a\u003e\r\n\r\nRepositório com intuito de exemplificar e descrever o funcionamento dos `Iterators` e `Generators` em Javascript\r\n\r\n## 🏁 Começando \u003ca name = \"começando\"\u003e\u003c/a\u003e\r\n\r\n### Pré-requisitos\r\n\r\n- Node 12 or +\r\n\r\n### Instalando\r\n\r\nClone o repostório\r\n\r\n```bash\r\ngit clone git@github.com:tiago154/iterators-e-generators.git\r\n```\r\n\r\nInstale as dependências\r\n\r\n```bash\r\nnpm install\r\n```\r\n\r\n## ⛏️ Exemplos \u003ca name = \"exemplos\"\u003e\u003c/a\u003e\r\n\r\n### 🔁 Iterator\r\n\r\nUm objeto é um iterator (iterador) quando sabe como acessar itens numa coleção, um por vez, enquanto mantém rastreada a posição atual em uma dada sequência. Em JavaScript um iterator é um objeto que oferece o método next(), o qual retorna o próximo item da sequência. Este método retorna um objeto com duas propriedades: done e value.\r\n\r\n[01-iterator.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/01-iterator.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 01\r\n```\r\n\r\n### 🔁 Iterable\r\n\r\nUm objeto é iterável (iterable), se ele define seu comportamento de iteração, como no caso de quais valores percorridos em um laço do tipo for..of. Alguns tipos embutidos, como o Array, ou o Map, têm um comportamento iterável padrão, enquanto outros tipos (como Object) não possuem.\r\n\r\nPara que um objeto seja iterable, o objeto precisa implemntar o método `@@iterator`, significando que o objeto (ou um dos objetos na cadeia de prototipagem  - prototype chain) precisa ter uma propriedade com uma chave `Symbol.iterator`:\r\n\r\n[02-iterable.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/02-iterable.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 02\r\n```\r\n\r\nChamando um iterable implemetado pelo usuário com a função Next()\r\n\r\n[03-iterable-call-next.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/03-iterable-call-next.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 03\r\n```\r\n\r\nAlguns objetos no JavaScript por padrão já implementam esse protocolo, como por exemplo:\r\n\r\n- String\r\n- Array\r\n- Map\r\n- Set\r\n- arguments (dentro de funções)\r\n- NodeList (no browser)\r\n\r\n[04-native-iterables.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/04-native-iterables.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 04\r\n```\r\n\r\n### 🔁 Generator\r\n\r\nEnquanto os iteradores são ferramentas muito úteis, sua criação requer um cuidado devido a necessidade de manter explícito seu estado interno. Generators provê uma alternativa poderosa: eles te permitem definir um algoritmo iterativo escrevendo uma função simples que pode manter seu estado próprio.\r\n\r\nGenerator é um tipo especial de função que trabalha como uma factory para iteradores. A função vira um generator se ela contém uma ou mais expressões `yield` e se ela usa a sintaxe `function*`.\r\n\r\nVale observar que não é possível definir um generator utilizando a sintaxe de arrow function, pois o JavaScript só reconhece que uma função define um generator através da declaração `function*`\r\n\r\nNote que a execução das chamadas de `yield` são `lazy`, ou seja elas não são computadas todas de uma vez. A cada execução do iterador o estado da função permanece salvo e pode ser acessado nas execuções posteriores.\r\n\r\n[05-generator.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/05-generator.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 05\r\n```\r\n\r\n[06-generator-with-params.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/06-generator-with-params.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 06\r\n```\r\n\r\n[07-generator-with-params.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/07-generator-with-params.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 07\r\n```\r\n\r\n### 🔁 Yield*\r\n\r\nA expressão `yield*` é usada para delegar para outro objeto `generator` ou `iterable`.\r\n\r\n[08-yield-with-asterisk.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/08-yield-with-asterisk.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 08\r\n```\r\n\r\n### 🔁 Desempenho CPU\r\n\r\nGenerators não são indicados para melhorar o desempenho bruto de CPU, pois outras implementações se sairão melhores\r\n\r\n[09-cpu-performance.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/09-cpu-performance.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 09\r\n```\r\n\r\n### 🔁 Desempenho Memória\r\n\r\nMas se voce necessita trabalhar com grandes listas e não impactar a memoria de sua aplicação, um generator pode ser uma opção a ser utilizada.\r\n\r\n##### Antes de executar os exemplos a seguir, utilize o comando `npm run generate-mock` e adicione a quantidade desejada de itens em mock na frente do comando.\r\n\r\nExemplo:\r\n\r\n```bash\r\nnpm run generate-mock 1000000\r\n```\r\n\r\nNo exemplo abaixo, o código irá manipular uma lista, realizar uma transformação de dados com o map e por fim salvar os dados. Podemos ver que o processamento é até rapido, mas o consumo de memória é bem alto.\r\n\r\n[10-memory-usage.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/10-memory-usage.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 10\r\n```\r\n\r\nNesse outro exemplo, é feita a mesma coisa, mas é utilizado um generator, onde a manipulação de dados é feita em pedaços. Dessa forma reduzimos o consumo de memória e não teremos problemas caso a quantidade de elementos da lista aumente.\r\n\r\n[11-memory-usage.js](https://github.com/tiago154/iterators-e-generators/blob/master/src/11-memory-usage.js)\r\n\r\nExecute o comando:\r\n\r\n```bash\r\nnpm run 11\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiago154%2Fiterators-e-generators","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftiago154%2Fiterators-e-generators","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiago154%2Fiterators-e-generators/lists"}