Dan Gladden

Memories are sparse during the early life of a human. The ones that exist are blurry snippets at best. Unless you’re one of those braggers that claims they remember all these random details from…

Smartphone

独家优惠奖金 100% 高达 1 BTC + 180 免费旋转




Symbols e Iterators no JavaScript

Uma breve introdução

Em muitas linguagens, esse tipo de laço é conhecido como for each. Mas como o for each funciona? É aí que os Iterators entram em cena.

Um Iterator nada mais é do que um objeto que facilita percorrer uma sequência através de um contrato muito simples: informar se há um próximo elemento e qual é esse próximo elemento, se houver.

No JavaScript, esse contrato é feito através de um objeto que tenha uma função next que retorne um outro objeto que possua dois valores: done e value. Quando done é igual a true, então sabemos que a sequência chegou ao fim; caso contrário, value é o valor atual da iteração.

Se isso parece confuso, dê uma olhada com calma no código abaixo e leia o parágrafo anterior novamente. Ah, e não se preocupe quanto a essa função misteriosa, tudo bem? Nós vamos escrevê-la juntos mais para frente, mas acredite que ela retorna o Iterator de um array.

Legal, não? É através desse contrato que um for-of funciona. Sendo assim, se o for-of não existisse, poderíamos ter escrito um while com a mesma finalidade:

Ok, mas agora você deve estar se perguntando: quem é essa tal funcaoMisteriosaQueObtemOIteratorDeUmArray? É aí que os Symbols entram em cena.

Vou começar mostrando o código, ok? Considere esse trecho:

Mas o que é esse Symbol? Para guardar um valor em um objeto, estamos acostumados a usar uma string como nome de um campo, certo?! Considere o exemplo abaixo:

Que é o mesmo que:

Simplificando, Symbol é um meio de se criar um valor único em um programa e o ES6 permite que o nome de um campo seja um Symbol. E para Iterators, no JavaScript seu nome único é Symbol.iterator.

Então, substituindo aquela função misteriosa de um dos exemplos anteriores, temos:

Mas por que executamos o que está em Symbol.iterator? Porque esse valor é uma função que cria aquele objeto com aquela função next, que é o Iterator em si, lembra? Isso possibilita que, através de closure, um iterator não interfira em algum outro. (Calma, vamos ver isso com um exemplo!)

E aí que isso possibilita criar objetos que podem ser usados dentro de um for-of!

Imagine que você queira gerar uma sequência infinita de números e que você queira usar isso em um for-of. Como exemplo, vamos gerar a Sequência de Fibonacci, aquela famosa que se começando com 1 e 1, o próximo valor é 2, pois 2 é a soma dos dois anteriores, e assim por diante. Em JavaScript, Iterators podem nos ajudar! O código fica assim:

O objeto sequenciaInfinita pode ser usado, como o nome diz, como uma sequência infinita dos números de Fibonacci.

Apesar de o exemplo ter sido uma sequência infinita de Fibonacci, Iterators são usados, normalmente, para iterar em cima de uma coleção de dados. Porém, com essa sequência, conseguimos ver que também é possível trabalhar com sequências infinitas geradas sob demanda.

Enfim, esse é o meu primeiro post aqui o Medium e espero que ajude a entender como os Iterators funcionam dentro do JavaScript. Ah, e toda sugestão é bem vida!

Importante/Spoiler: o JavaScript possui outro recurso muito legal chamado Generators e esse exemplo poderia ter sido escrito de um jeito bem mais simples como no exemplo abaixo, mas Generators possuem algumas características especiais que merecem um post só sobre eles! :)

Valeu!

Add a comment

Related posts:

Study reveals why group exercise is better for your health

By improving your mood and decreasing symptoms of depression and anxiety, regular exercise is great for your mental health. You can read more about that here. However new research has revealed that…

Required inputs

Introducing the GitHub Release step for creating releases and uploading assets to them directly on Bitrise. From now on, you’ll only need to configure the GitHub Release step. Most of the required…

Wir Nazis!

Es ist momentan ja ein sich immer schneller drehendes Karrusell, besonders vor der Wahl in Bayern: Politiker macht “rechtspopulistische Forderung und alle “normalen Menschen” üben öffentlichen…