<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Rafael B. Pires - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Rafael B. Pires - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 28 May 2026 16:39:28 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/rafaelbpires/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ O manual de JavaScript para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ O JavaScript é uma das linguagens de programação mais populares do mundo. Creio que seja uma ótima escolha para sua primeira linguagem de programação. Usamos JavaScript principalmente para criar:  * sites da web  * aplicações web  * aplicações do lado do servidor (server-side), usando Node.js O JavaScript, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/</link>
                <guid isPermaLink="false">62d463d3fea2f10707d662b4</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael B. Pires ]]>
                </dc:creator>
                <pubDate>Wed, 31 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-complete-javascript-handbook-f26b2c71719c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The JavaScript Beginner's Handbook</a>
      </p><p>O JavaScript é uma das linguagens de programação mais populares do mundo.</p><p>Creio que seja uma ótima escolha para sua primeira linguagem de programação.</p><p>Usamos JavaScript principalmente para criar:</p><ul><li>sites da web</li><li>aplicações web</li><li>aplicações do lado do servidor (<em>server-side</em>), usando Node.js</li></ul><p>O JavaScript, porém, não se limita a isso, sendo também usado para:</p><ul><li>criar aplicações para dispositivos móveis usando ferramentas como o React Native</li><li>criar programas para microcontroladores e para a internet das coisas</li><li>criar aplicações para relógios <em>smartwatch</em></li></ul><p>Ele, basicamente, pode fazer qualquer coisa. É tão popular que qualquer novidade que surja terá algum tipo de integração com JavaScript em algum momento.</p><p>O JavaScript é uma linguagem de programação que é:</p><ul><li><strong>de alto nível</strong>: fornece abstrações que permitem ignorar os detalhes da máquina em que está sendo executada. Ele gerencia a memória automaticamente por meio de um coletor de lixo, para que você possa se concentrar no código em vez de gerenciar a memória, como outras linguagens – como o C – demandariam. Além disso, fornece várias construções que permitem lidar com variáveis e objetos muito poderosos.</li><li><strong>dinâmica</strong>: ao contrário de linguagens de programação estáticas, uma linguagem dinâmica processa em tempo de execução (<em>runtime</em>) muito do que uma linguagem estática realiza durante o tempo de compilação. Isto tem prós e contras, nos dando características poderosas como tipagem dinâmica, vinculação tardia (<em>late binding</em>), reflexão, programação funcional, alteração do tempo de execução de objetos, <em>closures</em> e muito mais. Não se preocupe se essas características forem desconhecidos para você – você entenderá todas elas até o final do artigo.</li><li><strong>dinamicamente tipada</strong>: uma variável não impõe um tipo. Você pode reatribuir qualquer tipo a uma variável, por exemplo, atribuindo um número inteiro a uma variável que contenha uma <em>string</em>.</li><li><strong>fracamente tipada</strong>: ao contrário das linguagens fortemente tipadas, as linguagens frouxamente (ou fracamente) tipadas não reforçam o tipo de um objeto. Isso permite maior flexibilidade, mas nos nega a segurança e verificação de um sistema de tipos (algo que o TypeScript – uma camada adicional sobre o JavaScript – fornece)</li><li><strong><strong>interpret</strong>a<strong>d</strong>a</strong>: é comumente conhecida como uma linguagem interpretada, o que significa que não é necessária uma etapa de compilação antes que um programa possa ser executado, ao contrário de C, Java ou Go, por exemplo. Na prática, os navegadores compilam JavaScript antes de executá-lo, por questões de desempenho, mas isso acontece de modo transparente – não há nenhuma etapa adicional envolvida.</li><li><strong><strong>multiparadigm</strong>a</strong>: a linguagem não impõe nenhum paradigma particular de programação, ao contrário de Java, por exemplo, que obriga o uso de programação orientada a objetos, ou C, que impõe a programação imperativa. Você pode escrever JavaScript empregando um paradigma de orientação a objetos, usando protótipos e a nova sintaxe de classes (a partir do ES6). Você pode escrever JavaScript em um estilo de programação funcional, com suas funções de primeira classe, ou mesmo em estilo imperativo (como em C).</li></ul><p>Caso você esteja se perguntando, <em>JavaScript nada tem a ver com Java</em>. Trata-se apenas de uma péssima escolha de nome com a qual temos que conviver.</p><h2 id="resumo-do-manual">Resumo do manual</h2><ol><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#um-pouco-de-hist-ria">Um pouco de história</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#apenas-javascript">Apenas JavaScript</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#uma-breve-introdu-o-sintaxe-do-javascript">Uma breve introdução à sintaxe do JavaScript</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#ponto-e-v-rgula">Ponto-e-vírgula</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#valores">Valores</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#vari-veis">Variáveis</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#tipos">Tipos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#express-es">Expressões</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#operadores">Operadores</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#regras-de-preced-ncia">Regras de precedência</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#operadores-de-compara-o">Operadores de comparação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#condicionais">Condicionais</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#arrays">Arrays</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#strings">Strings</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#la-os">Laços</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#fun-es">Funções</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#arrow-functions">Arrow functions</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#objetos-1">Objetos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#propriedades-dos-objetos">Propriedades dos objetos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#m-todos-de-objetos">Métodos de objetos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#classes">Classes</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#heran-a">Herança</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#programa-o-ass-ncrona-e-callbacks">Programação assíncrona e callbacks</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#promises">Promises</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#async-e-await">Async e await</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#escopos-de-vari-veis">Escopos de variáveis</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-manual-de-javascript-para-iniciantes/#conclus-o">Conclusão</a></li></ol><blockquote>Atualização: <a href="https://flaviocopes.com/page/javascript-handbook/">agora, você pode ter uma versão em PDF ou ePub deste Manual de JavaScript para iniciantes</a> (em inglês).</blockquote><h2 id="um-pouco-de-hist-ria">Um pouco de história</h2><p>Criado em 1995, o JavaScript percorreu um longo caminho desde seu humilde começo.</p><p>Foi a primeira linguagem de <em>script </em>nativamente suportada por navegadores da web. Graças a isso, ganhou uma vantagem competitiva sobre as demais linguagens e, ainda hoje, é a única linguagem de script que podemos usar para construir aplicações para a web.</p><p>Existem outras linguagens, mas todas devem ser compiladas para JavaScript – ou, mais recentemente, para WebAssembly, mas essa é outra história.</p><p>No início, o JavaScript não era tão potente quanto hoje e era usado principalmente para animações elaboradas e para a maravilha conhecida na época como <em>HTML Dinâmico.</em></p><p>Com as crescentes necessidades que a plataforma web exigia (e continua a exigir), o JavaScript <em>teve </em>a responsabilidade de crescer também e acomodar as necessidades de um dos ecossistemas mais utilizados do mundo.</p><p>O JavaScript agora também é amplamente utilizado fora do navegador. A ascensão do Node.js nos últimos anos desbloqueou o desenvolvimento para <em>back-end</em>, antes dominado por Java, Ruby, Python, PHP e linguagens mais tradicionais do lado do servidor.</p><p>O JavaScript agora também é a linguagem que alimenta bancos de dados e muitas outras aplicações. É possível, até, desenvolver aplicações embarcadas, aplicações para dispositivos móveis ou TVs e muito mais. O que começou como uma pequena linguagem dentro do navegador é agora a linguagem mais popular do mundo.</p><h2 id="apenas-javascript"><strong>Apenas JavaScript</strong></h2><p>Às vezes é difícil separar o JavaScript dos recursos do ambiente em que ele é usado.</p><p>Por exemplo, o comando <code>console.log()</code> que você encontra em muitos exemplos de código não é JavaScript. Em vez disso, ele faz parte da vasta biblioteca de APIs que o navegador nos fornece.</p><p>Do mesmo modo, no servidor, às vezes pode ser difícil separar os recursos do JavaScript das APIs fornecidas pelo Node.js.</p><p>Determinado recurso é disponibilizado pelo React ou pelo Vue? Ou é "JavaScript puro" – ou "<em>Vanilla JavaScript</em>", como é comumente chamado?</p><p>Neste livro, eu falo sobre JavaScript, a linguagem. Sem complicar seu processo de aprendizagem com coisas que estão fora dele, fornecidas por ecossistemas externos.</p><h2 id="uma-breve-introdu-o-sintaxe-do-javascript">Uma breve introdução à sintaxe do JavaScript</h2><p>Nesta breve introdução, quero apresentar 5 conceitos:</p><ul><li>espaços em branco</li><li>maiúsculas e minúsculas</li><li><em>literals</em></li><li>identificadores</li><li>comentários</li></ul><h3 id="espa-os-em-branco"><strong>Espaços em branco</strong></h3><p>O JavaScript não dá qualquer significado aos espaços em branco. Espaços e quebras de linha podem ser acrescentados do modo que você desejar, pelo menos <em>em teoria</em>.</p><p>Na prática, você provavelmente manterá um estilo bem definido, aderindo ao que as pessoas comumente usam, e aplicará isso usando um <em>linter</em> ou uma ferramenta de estilo, como o <em>Prettier</em>.</p><p>Por exemplo, eu sempre uso 2 caracteres de espaço para cada identação.</p><h4 id="mai-sculas-e-min-sculas"><strong>Maiúsculas e minúsculas</strong></h4><p>O JavaScript diferencia maiúsculas e minúsculas. Uma variável chamada <code>something</code> é diferente de <code>Something</code>.</p><p>O mesmo vale para qualquer identificador.</p><h3 id="literals"><strong><em>Literals</em></strong></h3><p>Definimos <strong><strong><em>literal</em></strong> </strong>como um valor que está escrito no código-fonte, por exemplo, um número, uma string, um booleano, ou também construções mais avançadas, como objetos ou <em>arrays </em>literais:</p><pre><code class="language-js">5
'Test'
true
['a', 'b']
{color: 'red', shape: 'Rectangle'}
</code></pre><h3 id="identificadores"><strong>Identificadores</strong></h3><p>Um <strong><strong>identifi</strong>cado<strong>r</strong></strong> é uma sequência de caracteres que pode ser usada para identificar uma variável, uma função ou um objeto. Pode começar com uma letra, com um cifrão <code>$</code> ou um sublinhado <code>_</code> e pode conter dígitos. Usando Unicode, uma letra pode ser qualquer caractere permitido, por exemplo, um emoji 😄.</p><pre><code class="language-js">Test
test
TEST
_test
Test1
$test
</code></pre><p>O cifrão é normalmente usado para fazer referência a elementos do DOM.</p><p>Alguns nomes são reservados para uso interno do JavaScript, não podendo ser usados como identificadores.</p><h3 id="coment-rios"><strong>Comentários</strong></h3><p>Os comentários são uma das partes mais importantes de qualquer programa, em qualquer linguagem de programação. Eles são importantes porque nos permitem anotar o código e acrescentar informações importantes que, de outro modo, não estariam disponíveis para outras pessoas (ou para nós mesmos) durante sua leitura.</p><p>Em JavaScript, podemos escrever um comentário em uma única linha usando <code>//</code>. Tudo que vem depois do <code>//</code> não é considerado código pelo interpretador de JavaScript.</p><p>Assim:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">// um comentário
true //outro comentário
</code></pre><figcaption>Comentários em português: “um comentário”, “outro comentário”.</figcaption></figure><p>Outro tipo de comentário é um comentário de múltiplas linhas. Ele começa com <code>/*</code> e termina com <code>*/</code>.</p><p>Tudo que estiver entre eles não é considerado código:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">/* Aqui temos
um tipo de
comentário

*/
</code></pre><figcaption>Comentário em português: “algum tipo de comentário”;</figcaption></figure><h2 id="ponto-e-v-rgula">Ponto-e-vírgula</h2><p>Cada linha de um programa em JavaScript é terminada <strong>opcionalmente</strong> com um ponto-e-vírgula.</p><p>Digo opcionalmente porque o interpretador do JavaScript é inteligente o suficiente para introduzir pontos-e-vírgulas para você.</p><p>Na maioria dos casos, você pode omitir completamente o ponto-e-vírgula de seus programas sem sequer pensar nisso.</p><p>Este fato é muito controverso. Alguns desenvolvedores sempre usarão ponto-e-vírgula, outros nunca usarão, e você sempre encontrará código que usa ponto-e-vírgula e código que não usa.</p><p>Minha preferência pessoal é evitar pontos-e-vírgulas. Portanto, meus exemplos neste livro não os incluirão.</p><h2 id="valores"><strong>Valores</strong></h2><p>Uma string <code>hello</code> é um <strong><strong>val</strong>or</strong>.<br>Um número, como <code>12</code>, é um <strong><strong>val</strong>or</strong>.</p><p><code>hello</code> e <code>12</code> são valores. <code>string</code> e <code>number</code> são os <strong><strong>t</strong>ipos</strong> desses valores.</p><p>O <strong>tipo </strong>é a espécie do valor, sua categoria. Temos muitos tipos diferentes em JavaScript e falaremos sobre eles em detalhes mais adiante. Cada tipo tem características próprias.</p><p>Quando precisamos ter uma referência de um valor, nós o atribuímos a uma <strong><strong>vari</strong>ável</strong>. A variável pode ter um nome. O valor é o que está armazenado em uma variável, para que possamos acessá-lo posteriormente por meio do nome da variável.</p><h2 id="vari-veis"><strong>Variáveis</strong></h2><p>Uma variável é um valor atribuído a um identificador, para que você possa referenciá-lo e usá-lo posteriormente no programa.</p><p>Isso ocorre porque o JavaScript é <strong>fracamente <strong>t</strong>ipado</strong>, um conceito que você vai ouvir falar com frequência.</p><p>Uma variável deve ser declarada antes que você possa utilizá-la.</p><p>Temos dois modos principais de declarar variáveis. O primeiro é usando <code>const</code>:</p><pre><code class="language-js">const a = 0
</code></pre><p>A segunda maneira é usando <code>let</code>:</p><pre><code class="language-js">let a = 0
</code></pre><p>Qual é a diferença?</p><p><code>const</code> define uma referência constante a um valor. Isso significa que a referência não pode ser alterada. Você não pode reatribuir um novo valor a ela.</p><p>Usando <code>let</code> você pode atribuir um novo valor a ela.</p><p>Por exemplo, você não pode fazer isto:</p><pre><code class="language-js">const a = 0
a = 1
</code></pre><p>Você receberá um erro: <code>TypeError: Assignment to constant variable.</code> (Erro de Tipo: atribuição à variável constante.).</p><p>Por outro lado, você pode fazer isto usando <code>let</code>:</p><pre><code class="language-js">let a = 0
a = 1
</code></pre><p><code>const</code> não significa "constante" no mesmo sentido de outras linguagens como C. Em especial, isso não significa que o valor não pode ser alterado – significa que não pode ser reatribuído. Se a variável aponta para um objeto ou array (veremos mais sobre objetos e arrays mais tarde), o conteúdo do objeto ou array pode mudar livremente.</p><p>Variáveis <code>const</code> devem ser inicializadas no momento da declaração:</p><pre><code class="language-js">const a = 0
</code></pre><p>Variáveis <code>let</code>, por outro lado, podem ser inicializadas depois:</p><pre><code class="language-js">let a
a = 0
</code></pre><p>Você pode declarar múltiplas variáveis ​​de uma vez com um só comando:</p><pre><code class="language-js">const a = 1, b = 2
let c = 1, d = 2
</code></pre><p>Não é possível, porém, redeclarar a mesma variável mais de uma vez:</p><pre><code class="language-js">let a = 1
let a = 2
</code></pre><p>Você receberá um erro de "declaração duplicada".</p><p>Meu conselho é sempre usar <code>const</code> e somente usar <code>let</code> quando você souber que precisará reatribuir um valor a essa variável. Por quê? Porque quanto menos poder nosso código tiver, melhor. Se soubermos que um valor não pode ser reatribuído, é uma fonte a menos de bugs.</p><p>Agora que vimos como trabalhar com <code>const</code> e <code>let</code>, quero mencionar <code>var</code>.</p><p>Até 2015, <code>var</code> era a única maneira de se declarar uma variável em JavaScript. Hoje em dia, uma base de código moderna provavelmente só usará <code>const</code> e <code>let</code>. Existem algumas diferenças fundamentais que eu detalho <a href="https://flaviocopes.com/javascript-difference-let-var/">neste artigo</a> (em inglês), mas se você está apenas começando, talvez elas não sejam importantes para você. Basta usar <code>const</code> e <code>let</code>.</p><h2 id="tipos"><strong>Tipos</strong></h2><p>Variáveis ​​em JavaScript não possuem nenhum tipo definido.</p><p>Elas são <em>não tipadas</em>.</p><p>Uma vez que você atribua um valor de algum tipo a uma variável, você pode reatribuir posteriormente a variável para receber um valor de qualquer outro tipo sem problemas.</p><p>Em JavaScript, temos duas espécies principais de tipos: <strong>tipos pr<strong>imitiv</strong>os</strong> e <strong>objetos</strong>.</p><h3 id="tipos-primitivos"><strong>Tipos primitivos</strong></h3><p>Tipos primitivos são</p><ul><li>números</li><li><em>strings</em></li><li>booleanos</li><li>símbolos</li></ul><p>Também há dois tipos especiais: <code>null</code> e <code>undefined</code>.</p><h3 id="objetos"><strong>Objetos</strong></h3><p>Qualquer valor que não seja de um tipo primitivo (uma <em>string</em>, um número, um booleano, <em>null </em>ou <em>undefined</em>) é um <strong><strong>obje</strong>to</strong>.</p><p>Os tipos objeto possuem <strong>propriedades </strong>e também têm <strong>métodos </strong>que podem agir sobre essas propriedades.</p><p>Falaremos mais sobre objetos adiante.</p><h2 id="express-es"><strong>Expressões</strong></h2><p>Uma expressão é uma única unidade de código em JavaScript que o mecanismo do JavaScript pode avaliar e retornar um valor.</p><p>As expressões podem variar em complexidade.</p><p>Partimos das mais simples, chamadas de expressões primárias:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">2
0.02
'something'
true
false
this //o escopo atual
undefined
i //onde i é uma variável ou uma constante
</code></pre><figcaption>Comentários em português: “o escopo atual”, “onde i é uma variável ou constante”.</figcaption></figure><p>Expressões aritméticas são expressões que recebem uma variável e um operador (mais sobre operadores em breve) e resultam em um número:</p><pre><code class="language-js">1 / 2
i++
i -= 2
i * 2
</code></pre><p>Expressões de <em>string </em>são expressões que resultam em uma <em>string</em>:</p><pre><code class="language-js">'Uma ' + 'string'
</code></pre><p>Expressões lógicas fazem uso de operadores lógicos e resultam em um valor booleano:</p><pre><code class="language-js">a &amp;&amp; b
a || b
!a
</code></pre><p>Expressões mais avançadas envolvem objetos, funções e <em>arrays</em>. Vou apresentá-las mais tarde.</p><h2 id="operadores"><strong>Operadores</strong></h2><p>Os operadores permitem pegar duas expressões simples e combiná-las para formar uma expressão mais complexa.</p><p>Podemos classificar os operadores com base nos operandos com os quais eles trabalham. Alguns operadores trabalham com 1 operando. A maioria trabalha com 2 operandos. Apenas um operador trabalha com 3 operandos.</p><p>Nesta primeira introdução a operadores, apresentaremos aqueles com os quais você está mais familiarizado: operadores com 2 operandos.</p><p>Já introduzi um ao falar sobre variáveis: o operador de atribuição <code>=</code>. Você usa <code>=</code> para atribuir um valor a uma variável:</p><pre><code class="language-js">let b = 2
</code></pre><p>Vamos, agora, apresentar outro conjunto de operadores binários que você já conhece da matemática básica.</p><h3 id="o-operador-de-adi-o-"><strong>O operador de adição (+)</strong></h3><pre><code class="language-js">const tres = 1 + 2
const quatro = tres + 1
</code></pre><p>O operador <code>+</code> também faz a concatenação de strings se você usar strings, então preste atenção:</p><pre><code class="language-js">const tres = 1 + 2
tres + 1 // 4
'tres' + 1 // tres1
</code></pre><h3 id="o-operador-de-subtra-o-"><strong>O operador de subtração (-)</strong></h3><pre><code class="language-js">const dois = 4 - 2
</code></pre><h3 id="o-operador-de-divis-o-"><strong>O operador de divisão (/)</strong></h3><p>Retorna o quociente entre o primeiro operador e o segundo:</p><pre><code class="language-js">const resultado = 20 / 5 //resultado === 4
const resultado = 20 / 7 //resultado === 2.857142857142857
</code></pre><p>Se você dividir por zero, o JavaScript não gera nenhum erro, mas retorna o valor &nbsp;<code>Infinity</code> (ou <code>-Infinity</code>, se o valor for negativo).</p><pre><code class="language-js">1 / 0 //Infinity
-1 / 0 //-Infinity
</code></pre><h3 id="o-operador-de-resto-"><strong>O operador de resto (%)</strong></h3><p>O resto é um cálculo muito útil em muitos casos:</p><pre><code class="language-js">const resultado = 20 % 5 //resultado === 0
const resultado = 20 % 7 //resultado === 6
</code></pre><p>O restante de uma divisão por zero é sempre <code>NaN</code>, um valor especial que significa "Not a Number" (inglês para "não é um número"):</p><pre><code class="language-js">1 % 0 //NaN
-1 % 0 //NaN
</code></pre><h3 id="o-operador-de-multiplica-o-"><strong>O operador de multiplicação (*)</strong></h3><p>Multiplica dois números</p><pre><code class="language-js">1 * 2 //2
-1 * 2 //-2
</code></pre><h3 id="o-operador-exponencial-"><strong>O operador exponencial (**)</strong></h3><p>Eleva o primeiro operando à potência do segundo operando</p><pre><code class="language-js">1 ** 2 //1
2 ** 1 //2
2 ** 2 //4
2 ** 8 //256
8 ** 2 //64
</code></pre><h2 id="regras-de-preced-ncia"><strong>Regras de precedência</strong></h2><p>Cada expressão complexa com vários operadores na mesma linha apresentará problemas de precedência.</p><p>Tome este exemplo:</p><pre><code class="language-js">let a = 1 * 2 + 5 / 2 % 2
</code></pre><p>O resultado é 2.5, mas por quê?</p><p>Quais operações são executadas primeiro e quais precisam esperar?</p><p>Algumas operações têm mais precedência do que outras. As regras de precedência estão listadas nesta tabela:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">OPERADOR</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);">DESCRIÇÃO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">*</code><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">/</code><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">%</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">multiplicação/divisão/resto</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">+</code><span>&nbsp;</span><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">-</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">adição/subtração</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">=</code></td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat;">atribuição</td></tr></tbody></table><!--kg-card-end: html--><p>Operações no mesmo nível (como <code>+</code> e <code>-</code>) são executadas na ordem em que são encontradas, da esquerda para a direita.</p><p>Seguindo essas regras, a operação acima pode ser resolvida da seguinte forma:</p><pre><code class="language-js">let a = 1 * 2 + 5 / 2 % 2
let a = 2 + 5 / 2 % 2
let a = 2 + 2.5 % 2
let a = 2 + 0.5
let a = 2.5
</code></pre><h2 id="operadores-de-compara-o"><strong>Operadores de comparação</strong></h2><p>Depois dos operadores de atribuição e dos matemáticos, o terceiro conjunto de operadores que quero apresentar são os operadores condicionais.</p><p>Você pode usar os seguintes operadores para comparar dois números ou duas <em>strings </em>(os operadores de comparação sempre devolvem um booleano, ou seja, um valor que é <code>true</code> ou <code>false</code>).</p><p>Estes são os <strong>operadores de comparação de desigualdade</strong>:</p><ul><li><code>&lt;</code> significa "menor que"</li><li><code>&lt;=</code> significa "menor ou igual a"</li><li><code>&gt;</code> significa "maior que"</li><li><code>&gt;=</code> significa "maior ou igual a"</li></ul><p>Exemplo:</p><pre><code class="language-js">let a = 2
a &gt;= 1 //true
</code></pre><p>Além desses, temos 4 <strong><strong>operadores de igualdade</strong></strong>. Eles aceitam dois valores e retornam um booleano:</p><ul><li><code>===</code> verifica a igualdade</li><li><code>!==</code> verifica a desigualdade</li></ul><p>Note que também temos <code>==</code> e <code>!=</code> em JavaScript, mas sugiro usar apenas <code>===</code> e <code>!==</code>, pois eles podem evitar alguns problemas sutis.</p><h2 id="condicionais"><strong>Condicionais</strong></h2><p>Com os operadores de comparação estabelecidos, podemos falar sobre condicionais.</p><p>Uma declaração <code>if</code> (se) é usada para que o programa siga um ou outro caminho, dependendo do resultado da avaliação de uma expressão.</p><p>Este é o exemplo mais simples, que sempre é executado:</p><pre><code class="language-js">if (true) {
  //faça algo
}
</code></pre><p>ao contrário, isto jamais é executado:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">if (false) {
  //faça algo (? nunca ?)
}
</code></pre><figcaption>Comentário em português: “faça algo (? nunca ?)”.</figcaption></figure><p>A condicional verifica a expressão que você passar a ela em busca de um valor verdadeiro ou falso. Se você passar um número, este sempre será avaliado como verdadeiro, a menos que seja 0. Se você passar uma <em>string</em>, esta sempre será avaliada como verdadeira, a menos que seja uma <em>string </em>vazia. Essas são as regras gerais de conversão de tipos para um booleano.</p><p>Você notou o espaço entre as chaves? Isso é chamado de <strong>bloco</strong>. É usado para agrupar uma lista de diferentes instruções.</p><p>Um bloco pode ser colocado onde quer que você possa ter uma única instrução. Se você tiver uma única instrução para executar após as condicionais, você pode omitir o bloco, e escrever apenas a instrução:</p><pre><code class="language-js">if (true) facaAlgo()
</code></pre><p>Eu sempre gosto de usar chaves para ser mais claro.</p><p>Você pode fornecer uma segunda parte para a instrução <code>if</code>: <code>else</code> (caso contrário).</p><p>Ou seja, você inclui uma instrução que será executada se a condição <code>if</code> for falsa:</p><pre><code class="language-js">if (true) {
  //faça algo
} else {
  //faça outra coisa
}
</code></pre><p>Como <code>else</code> aceita uma instrução, você pode aninhar outra instrução if/else dentro dela:</p><pre><code class="language-js">if (a === true) {
  //faça algo
} else if (b === true) {
  //faça outra coisa
} else {
  //faça uma terceira coisa se nenhuma das outras opções for válida
}
</code></pre><h2 id="arrays"><strong><em>Arrays</em></strong></h2><p>Um <em>array</em> é uma coleção de elementos.</p><p><em>Arrays</em> em JavaScript não são um <em>tipo </em>próprio.</p><p><em>Arrays</em> são <strong><strong>obje</strong>to<strong>s</strong></strong>.</p><p>Podemos inicializar um <em>array </em>vazio de 2 maneiras diferentes:</p><pre><code class="language-js">const a = []
const a = Array()
</code></pre><p>A primeira usa uma <strong>sintaxe literal</strong>. A segunda utiliza uma função construtora.</p><p>Você pode pré-preencher o <em>array </em>usando esta sintaxe:</p><pre><code class="language-js">const a = [1, 2, 3]
const a = Array.of(1, 2, 3)
</code></pre><p>Um <em>array </em>pode conter qualquer valor, mesmo valores de tipos diferentes:</p><pre><code class="language-js">const a = [1, 'Flavio', ['a', 'b']]
</code></pre><p>Como podemos incluir um <em>array </em>dentro de um <em>array</em>, podemos criar <em>arrays </em>multidimensionais, que possuem aplicações muito úteis (por exemplo, uma matriz):</p><pre><code class="language-js">const matriz = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

matriz[0][0] //1
matriz[2][0] //7
</code></pre><p>Você pode acessar qualquer elemento do <em>array</em>, fazendo referência ao seu índice, que inicia a partir de zero:</p><pre><code class="language-js">a[0] //1
a[1] //2
a[2] //3
</code></pre><p>Você pode inicializar um novo <em>array </em>com um conjunto de valores usando esta sintaxe, que primeiro inicializa um <em>array</em> de 12 elementos e então preenche cada elemento com o número <code>0</code>:</p><pre><code class="language-js">Array(12).fill(0)
</code></pre><p>Você pode obter o número de elementos no <em>array</em>, verificando sua propriedade <code>length</code> (tamanho):</p><pre><code class="language-js">const a = [1, 2, 3]
a.length //3
</code></pre><p>Observe que você pode definir o comprimento do <em>array</em>. Se você atribui um número maior do que a capacidade atual do <em>array</em>, nada acontece. Se você atribui um número menor, o <em>array </em>é cortado naquela posição:</p><pre><code class="language-js">const a = [1, 2, 3]
a //[ 1, 2, 3 ]
a.length = 2
a //[ 1, 2 ]
</code></pre><h3 id="como-adicionar-um-item-a-um-array"><strong>Como adicionar um item a um <em>array</em></strong></h3><p>Podemos adicionar um elemento ao final de um <em>array</em> usando o método <code>push()</code>:</p><pre><code class="language-js">a.push(4)
</code></pre><p>Podemos adicionar um elemento ao início de um <em>array </em>usando o método <code>unshift()</code>:</p><pre><code class="language-js">a.unshift(0)
a.unshift(-2, -1)
</code></pre><h3 id="como-remover-um-item-de-um-array"><strong>Como remover um item de um <em>array</em></strong></h3><p>Podemos remover um item do final de um <em>array</em> usando o método <code>pop()</code>:</p><pre><code class="language-js">a.pop()
</code></pre><p>Podemos remover um item do início de um <em>array </em>usando o método <code>shift()</code>:</p><pre><code class="language-js">a.shift()
</code></pre><h3 id="como-unir-dois-ou-mais-arrays">Como unir dois ou mais <em>arrays</em></h3><p>Você pode unir vários <em>arrays</em> usando <code>concat()</code>:</p><pre><code class="language-js">const a = [1, 2]
const b = [3, 4]
const c = a.concat(b) //[1,2,3,4]
a //[1,2]
b //[3,4]
</code></pre><p>Você também pode usar o operador <strong><strong>spread</strong></strong> (<code>...</code>), deste modo:</p><pre><code class="language-js">const a = [1, 2]
const b = [3, 4]
const c = [...a, ...b]
c //[1,2,3,4]
</code></pre><h3 id="como-encontrar-um-item-espec-fico-no-array">Como encontrar um item específico no<strong> <em>array</em></strong></h3><p>Você pode usar o método <code>find()</code> de um array:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">a.find((elemento, indice, array) =&gt; {
  //retorna true ou false
})
</code></pre><figcaption>Comentário em português: “retorna verdadeiro ou falso”.</figcaption></figure><p>Ele devolve o primeiro item que retornar verdadeiro e devolve <code>undefined</code> se o elemento não for encontrado.</p><p>Uma sintaxe comumente usada é:</p><pre><code class="language-js">a.find(x =&gt; x.id === my_id)
</code></pre><p>A linha acima retornará o primeiro elemento do <em>array</em> que possui <code>id === my_id</code>.</p><p><code>findIndex()</code> funciona de forma semelhante ao <code>find()</code>, mas devolve o índice do primeiro elemento que retornar verdadeiro. Se este não for encontrado, retorna <code>undefined</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">a.findIndex((elemento, indice, array) =&gt; {
  //retorna true ou false
})
</code></pre><figcaption>Comentário em português: “retorna verdadeiro ou falso”.</figcaption></figure><p>Outro método é <code>includes()</code>:</p><pre><code class="language-js">a.includes(valor)
</code></pre><p>Ele retorna verdadeiro se <code>a</code> contém <code>valor</code>.</p><pre><code class="language-js">a.includes(valor, i)
</code></pre><p>Retorna verdadeiro se <code>a</code> contém <code>valor</code> após a posição <code>i</code>.</p><h2 id="strings"><strong><em>Strings</em></strong></h2><p>Uma <em>string</em> é uma sequência de caracteres.</p><p>Ela também pode ser definida como uma <em>string</em> literal, contida entre aspas simples ou aspas duplas:</p><pre><code class="language-js">'Uma string'
"Outra string"</code></pre><p>Pessoalmente, prefiro usar aspas simples o tempo todo. Uso aspas duplas apenas em HTML para definir atributos.</p><p>Você atribui um valor de <em>string </em>a uma variável assim:</p><pre><code class="language-js">const nome = 'Flavio'
</code></pre><p>Você pode determinar o comprimento de uma <em>string </em>usando a propriedade <code>length</code> (tamanho):</p><pre><code class="language-js">'Flavio'.length //6
const nome = 'Flavio'
nome.length //6
</code></pre><p>Esta é uma string vazia: <code>''</code>. Sua propriedade comprimento é 0:</p><pre><code class="language-js">''.length //0
</code></pre><p>Duas <em>strings </em>podem ser unidas usando operador <code>+</code>:</p><pre><code class="language-js">"Uma " + "string"
</code></pre><p>Você pode usar o operador <code>+</code> para <em><em>interpolar</em></em> variáveis:</p><pre><code class="language-js">const nome = 'Flavio'
"Meu nome é " + nome //Meu nome é Flavio
</code></pre><p>Outra maneira de definir <em>strings </em>é usar <em>template literals</em>, que são definidos entre acentos graves. Eles são especialmente úteis para tornar <em>strings </em>de várias linhas muito mais simples. Com aspas simples ou duplas, você não pode definir uma <em>string </em>de múltiplas linhas facilmente – você precisaria usar caracteres de escape.</p><p>Uma vez que um <em>template literal</em> é aberto com um acento grave, basta apertar enter para criar uma linha, sem caracteres especiais, e ela é renderizada nos mesmos termos:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const string = `Olá
essa

string
é incrível!`
</code></pre><figcaption>Em português: “Ei, essa string é incrível!”.</figcaption></figure><p><em>Template literals </em>também são ótimos porque fornecem uma maneira fácil de interpolar variáveis ​​e expressões em <em>strings</em>.</p><p>Você faz isso usando a sintaxe <code>${...}</code>:</p><pre><code class="language-js">const var = 'teste'
const string = `algo ${var}` 
//algo teste
</code></pre><p>Dentro do <code>${}</code> você pode incluir qualquer coisa, até expressões:</p><pre><code class="language-js">const string = `algo ${1 + 2 + 3}`
const string2 = `algo 
  ${foo() ? 'x' : 'y'}`
</code></pre><h2 id="la-os"><strong>Laços</strong></h2><p>Laços de repetição são uma das principais estruturas de controle do JavaScript.</p><p>Com um laço, podemos automatizar e repetir um bloco de código quantas vezes quisermos que ele seja executado, mesmo que indefinidamente.</p><p>O JavaScript fornece muitas maneiras de se iterar por meio de laços.</p><p>Eu quero me concentrar em 3 maneiras:</p><ul><li>laço while</li><li>laço for</li><li>laço for..of</li></ul><h3 id="while"><strong><code>while</code></strong></h3><p>O laço do tipo while é a estrutura de repetição mais simples que o JavaScript nos fornece.</p><p>Adicionamos uma condição após a palavra-chave <code>while</code> e fornecemos um bloco que é executado até que a condição seja avaliada como <code>true</code>.</p><p>Exemplo:</p><pre><code class="language-js">const list = ['a', 'b', 'c']
let i = 0
while (i &lt; list.length) {
  console.log(list[i]) //value
  console.log(i) //index
  i = i + 1
}
</code></pre><p>Você pode interromper um laço <code>while</code> usando a palavra-chave <code>break</code>, assim:</p><pre><code class="language-js">while (true) {
  if (algoForVerdadeiro) break
}
</code></pre><p>Se você decidir que no meio de um laço você quer pular a iteração atual, pode avançar para a próxima iteração usando <code>continue</code>:</p><pre><code class="language-js">while (true) {
  if (algoForVerdadeiro) continue

  //Faça outra coisa
}
</code></pre><p>Muito parecido com <code>while</code>, temos o laço <code>do..while</code>. É basicamente o mesmo que <code>while</code>, mas a condição é avaliada <em>depois </em>que o bloco de código é executado.</p><p>Isso significa que o bloco sempre é executado <em><em>pelo menos uma vez</em></em>.</p><p>Exemplo:</p><pre><code class="language-js">const list = ['a', 'b', 'c']
let i = 0
do {
  console.log(list[i]) //value
  console.log(i) //index
  i = i + 1
} while (i &lt; list.length)
</code></pre><h3 id="for"><strong><code>for</code></strong></h3><p>A segunda estrutura de repetição muito importante em JavaScript é o laço <strong><strong>for</strong></strong>.</p><p>Usamos a palavra-chave <code>for</code> e passamos um conjunto de 3 instruções: a inicialização, a condição e a parcela de incremento.</p><p>Exemplo:</p><pre><code class="language-js">const list = ['a', 'b', 'c']

for (let i = 0; i &lt; list.length; i++) {
  console.log(list[i]) //value
  console.log(i) //index
}
</code></pre><p>Assim como nos laços <code>while</code>, você pode interromper um laço <code>for</code> usando <code>break</code> e avançar rapidamente para a próxima iteração usando <code>continue</code>.</p><h3 id="for-of"><strong><code>for...of</code></strong></h3><p>Este laço é relativamente recente (introduzido em 2015) e é uma versão simplificada do laço <code>for</code>:</p><pre><code class="language-js">const list = ['a', 'b', 'c']

for (const valor of list) {
  console.log(valor) //a b c
}
</code></pre><h2 id="fun-es"><strong>Funções</strong></h2><p>Em qualquer programa do JavaScript moderadamente complexo, tudo acontece dentro de funções.</p><p>As funções são uma parte central e essencial do JavaScript.</p><p>O que é uma função?</p><p>Uma função é um bloco de código, contido em si mesma.</p><p>Aqui está a <strong>declaração de uma função</strong>:</p><pre><code class="language-js">function obterDados() {
  // Faça algo
}
</code></pre><p>Uma função pode ser executada a qualquer momento, basta invocá-la, assim:</p><pre><code class="language-js">obterDados()
</code></pre><p>Uma função pode ter um ou mais argumentos:</p><pre><code class="language-js">function obterDados() {
  //Faça algo
}

function obterDados(cor) {
  //Faça algo
}

function obterDados(cor, idade) {
  //Faça algo
}
</code></pre><p>Quando podemos passar um argumento, chamamos a função passando parâmetros:</p><pre><code class="language-js">function obterDados(cor, idade) {
  //Faça algo
}

obterDados('verde', 24)
obterDados('preto')
</code></pre><p>Observe que, na segunda chamada, eu passei como parâmetro a string <code>preto</code> para o argumento <code>cor</code>, mas não informei nenhum parâmetro para <code>idade</code>. Nesse caso, <code>idade</code> dentro da função permanece <code>undefined</code>.</p><p>Podemos verificar se um valor não é <em>undefined</em> usando esta condicional:</p><pre><code class="language-js">function obterDados(cor, idade) {
  //Faça algo
  if (typeof idade !== 'undefined') {
    //...
  }
}
</code></pre><p><code>typeof</code> é um operador unário que nos permite verificar o tipo de uma variável.</p><p>Você também pode verificar deste modo:</p><pre><code class="language-js">function obterDados(cor, idade) {
  //Faça algo
  if (idade) {
    //...
  }
}
</code></pre><p>A condicional também será verdadeira se <code>idade</code> for <code>null</code>, <code>0</code> ou uma string vazia.</p><p>Você pode definir valores padrão (<em>default</em>, em inglês) para parâmetros, caso eles não sejam passados:</p><pre><code class="language-js">function obterDados(cor = 'preto', idade = 25) {
  //Faça algo
}
</code></pre><p>Você pode passar qualquer valor como parâmetro: números, strings, booleanos, arrays, objetos e funções.</p><p>Uma função tem um valor de retorno. Por padrão, uma função retorna <code>undefined</code>, a menos que você adicione uma palavra-chave <code>return</code> com um valor:</p><pre><code class="language-js">function obterDados() {
  // Faça algo
  return 'Oi!'
}
</code></pre><p>Podemos atribuir esse valor de retorno a uma variável quando invocamos a função:</p><pre><code class="language-js">function obterDados() {
  // Faça algo
  return 'Oi!'
}

let resultado = obterDados()
</code></pre><p><code>result</code> agora contém uma <em>string </em>com o valor <code>Oi!</code>.</p><p>Você só pode retornar um valor.</p><p>Para retornar vários valores, você pode retornar um objeto, ou um <em>array</em>, assim:</p><pre><code class="language-js">function obterDados() {
  return ['Flavio', 37]
}

let [nome, idade] = obterDados()
</code></pre><p>Funções podem ser definidas dentro de outras funções:</p><pre><code class="language-js">const obterDados = () =&gt; {
  const fazerAlgo = () =&gt; {}
  fazerAlgo()
  return 'teste'
}
</code></pre><p>Porém, a função aninhada só pode ser invocada de dentro da função que a envolve.</p><p>Você também pode retornar uma função de uma função.</p><h2 id="arrow-functions"><strong><em>Arrow functions</em></strong></h2><p><em>Arrow functions</em> foram introduzidas recentemente ao JavaScript.</p><p>Elas são frequentemente usadas no lugar de funções "regulares", aquelas que descrevi no capítulo anterior. Você encontrará ambas as formas sendo utilizadas em todo lugar.</p><p>Visualmente, elas permitem a escrita de funções com uma sintaxe mais curta, saindo de:</p><pre><code class="language-js">function obterDados() {
  //...
}
</code></pre><p>para:</p><pre><code class="language-js">() =&gt; {
  //...
}
</code></pre><p>Entretanto... observe que não temos um nome aqui.</p><p><em>Arrow functions</em> são anônimas. Precisamos atribuí-las a uma variável.</p><p>Podemos atribuir uma função regular a uma variável, assim:</p><pre><code class="language-js">let obterDados = function obterDados() {
  //...
}
</code></pre><p>Ao fazer isso, podemos remover o nome da função:</p><pre><code class="language-js">let obterDados = function() {
  //...
}
</code></pre><p>e invocar a função usando o nome da variável:</p><pre><code class="language-js">let obterDados = function() {
  //...
}
obterDados()
</code></pre><p>É a mesma coisa que fazemos com <em>arrow functions</em>:</p><pre><code class="language-js">let obterDados = () =&gt; {
  //...
}
obterDados()
</code></pre><p>Se o corpo da função contiver apenas uma única instrução, você pode omitir as chaves e escrever tudo em uma única linha:</p><pre><code class="language-js">const obterDados = () =&gt; console.log('Oi!')
</code></pre><p>Os parâmetros são passados ​​entre os parênteses:</p><pre><code class="language-js">const obterDados = (param1, param2) =&gt; 
  console.log(param1, param2)
</code></pre><p>Se você tiver um (e apenas um) parâmetro, poderá omitir os parênteses completamente:</p><pre><code class="language-js">const obterDados = param =&gt; console.log(param)
</code></pre><p><em>Arrow functions</em> permitem que você tenha um retorno implícito – os valores são retornados sem a necessidade de usar a palavra-chave <code>return</code>.</p><p>Isso funciona quando existe uma instrução de uma linha no corpo da função:</p><pre><code class="language-js">const obterDados = () =&gt; 'teste'

obterDados() //'teste'
</code></pre><p>Como nas funções regulares, podemos ter valores padrão para os parâmetros caso eles não sejam passados:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">const obterDados = (cor = 'preto', 
                 idade = 2) =&gt; {
  //Faça algo
}
</code></pre><figcaption>Comentário em português: "faça algo".</figcaption></figure><p>Assim como ocorre com as funções regulares, podemos retornar apenas um valor.</p><p><em>Arrow functions </em>também podem conter outras <em>arrow functions</em>, e até funções regulares.</p><p>Os dois tipos de funções são muito semelhantes. Então, você pode se perguntar por que as <em>arrow functions </em>foram introduzidas. A grande diferença para as funções regulares aparece quando elas são usadas como métodos de objetos. Isso é algo que veremos em breve.</p><h2 id="objetos-1"><strong>Objetos</strong></h2><p>Qualquer valor que não seja de um tipo primitivo (uma string, um número, um booleano, um símbolo, <em>null</em> ou <em>undefined</em>) é um <strong>objeto</strong>.</p><p>Veja como definimos um objeto:</p><pre><code class="language-js">const carro = {

}
</code></pre><p>Essa é a <strong>notação literal</strong> de um objeto, que é uma das coisas mais legais em JavaScript.</p><p>Você também pode usar a sintaxe <code>new Object</code>:</p><pre><code class="language-js">const carro = new Object()
</code></pre><p>Outra sintaxe possível é usar <code>Object.create()</code>:</p><pre><code class="language-js">const carro = Object.create()
</code></pre><p>Você também pode inicializar um objeto usando a palavra-chave <code>new</code> antes de uma função com letra maiúscula. Essa função servirá como um construtor para aquele objeto. Nela, podemos inicializar os argumentos que recebemos como parâmetros para configurar o estado inicial do objeto:</p><pre><code class="language-js">function Carro(marca, modelo) {
  this.marca = marca
  this.modelo = modelo
}
</code></pre><p>Inicializamos um novo objeto usando:</p><pre><code class="language-js">const meuCarro = new Carro('Ford', 'Fiesta')
meuCarro.marca //'Ford'
meuCarro.modelo //'Fiesta'
</code></pre><p>Os objetos são <strong>são sempre passados como referência</strong>.</p><p>Se você atribuir a uma variável o mesmo valor de outra, se for um tipo primitivo, como um número ou uma <em>string</em>, eles serão passados como valor:</p><p>Veja este exemplo:</p><pre><code class="language-js">let idade = 36
let minhaIdade = idade
minhaIdade = 37
idade //36
</code></pre><pre><code class="language-js">const carro = {
  cor: 'azul'
}
const outroCarro = carro
outroCarro.cor = 'amarelo'
carro.cor //'amarelo'
</code></pre><p>Mesmo <em>arrays </em>ou funções são objetos por debaixo dos panos. Então, é muito importante entender como eles funcionam.</p><h2 id="propriedades-dos-objetos"><strong>Propriedades dos objetos</strong></h2><p>Os objetos possuem <strong><strong>propriedades</strong></strong>, que são compostas por um nome (ou chave) associado a um valor.</p><p>O valor de uma propriedade pode ser de qualquer tipo, o que significa que pode ser um <em>array</em>, uma função e até mesmo um objeto, pois objetos podem ser aninhados em outros objetos.</p><p>Esta é a sintaxe do objeto literal que vimos no capítulo anterior:</p><pre><code class="language-js">const carro = {

}
</code></pre><p>Podemos definir uma propriedade <code>cor</code> dessa maneira:</p><pre><code class="language-js">const carro = {
  cor: 'azul'
}
</code></pre><p>Aqui temos um objeto <code>carro</code> com uma propriedade chamada <code>cor</code>, de valor <code>azul</code>.</p><p>Os nomes ou chaves que rotulam as propriedades podem ser qualquer <em>string</em>, mas tome cuidado com caracteres especiais – se eu quisesse incluir um caractere inválido para nomes de variáveis na chave da propriedade, teria que colocar o nome entre aspas:</p><pre><code class="language-js">const carro = {
  cor: 'azul',
  'a cor': 'azul'
}
</code></pre><p>Caracteres inválidos para nomes de variáveis incluem espaços, hifens e outros caracteres especiais.</p><p>Como você pode ver, quando temos várias propriedades, separamos cada propriedade com uma vírgula.</p><p>Podemos recuperar o valor de uma propriedade usando 2 sintaxes diferentes.</p><p>A primeira é <strong><strong>a notação de ponto</strong></strong>:</p><pre><code class="language-js">carro.cor //'azul'
</code></pre><p>A segunda (que é a única que podemos usar para propriedades com nomes inválidos), é usar a notação de colchetes:</p><pre><code class="language-js">carro['a cor'] //'azul'
</code></pre><p>Se você acessar uma propriedade inexistente, obterá um valor <code>undefined</code>:</p><pre><code class="language-js">carro.marca //undefined
</code></pre><p>Como já mencionado anteriormente, objetos podem ter outros objetos aninhados como propriedades:</p><pre><code class="language-js">const carro = {
  marca: {
    nome: 'Ford'
  },
  cor: 'azul'
}
</code></pre><p>Neste exemplo, você pode acessar o nome da marca usando</p><pre><code class="language-js">carro.marca.nome
</code></pre><p>ou</p><pre><code class="language-js">carro['marca']['nome']
</code></pre><p>Você pode definir o valor de uma propriedade ao definir o objeto.</p><p>Você, no entanto, sempre pode atualizá-lo mais tarde:</p><pre><code class="language-js">const carro = {
  cor: 'azul'
}

carro.cor = 'amarelo'
carro['cor'] = 'vermelho'
</code></pre><p>Você também pode adicionar novas propriedades a um objeto:</p><pre><code class="language-js">carro.modelo = 'Fiesta'

carro.modelo //'Fiesta'
</code></pre><p>Dado o objeto</p><pre><code class="language-js">const carro = {
  cor: 'azul',
  marca: 'Ford'
}
</code></pre><p>você pode excluir uma propriedade dele usando</p><pre><code class="language-js">delete carro.marca
</code></pre><h2 id="m-todos-de-objetos"><strong>Métodos de objetos</strong></h2><p>Falei sobre funções em um capítulo anterior.</p><p>As funções podem ser atribuídas a uma propriedade de função e, nesse caso, são chamadas de <strong><strong>métodos</strong>.</strong></p><p>Neste exemplo, a propriedade <code>ligar</code> tem uma função atribuída e podemos invocá-la usando a sintaxe de ponto que usamos para propriedades, com os parênteses no final:</p><pre><code class="language-js">const carro = {
  marca: 'Ford',
  modelo: 'Fiesta',
  ligar: function() {
    console.log('Ligado')
  }
}

carro.ligar()
</code></pre><p>Dentro de um método definido usando uma sintaxe <code>function() {}</code>, temos acesso à instância do objeto referenciando-a com a palavra <code>this</code>.</p><p>No exemplo a seguir, temos acesso aos valores das propriedades <code>marca</code> e <code>modelo</code> usando <code>this.marca</code> e <code>this.modelo</code>:</p><pre><code class="language-js">const carro = {
  marca: 'Ford',
  modelo: 'Fiesta',
  ligar: function() {
    console.log(`${this.marca} ${this.modelo} ligado!`)
  }
}

car.ligar()
</code></pre><p>É importante observar essa diferença entre funções regulares e <em>arrow functions</em> – não temos acesso ao <code>this</code> ao usar uma <em>arrow function</em>:</p><pre><code class="language-js">const carro = {
  marca: 'Ford',
  modelo: 'Fiesta',
  ligar: () =&gt; {
    console.log(`${this.marca} ${this.modelo} ligado!`) //não vai funcionar
  }
}

carro.ligar()
</code></pre><p>Isso acontece porque as <strong><strong><em>arrow functions</em> não estão vinculadas ao objeto</strong></strong>.</p><p>Essa é a razão pela qual funções regulares são frequentemente usadas como métodos de objeto.</p><p>Métodos podem aceitar parâmetros, como funções regulares:</p><pre><code class="language-js">const carro = {
  marca: 'Ford',
  modelo: 'Fiesta',
  irPara: function(destino) {
    console.log(`Indo para ${destino}`)
  }
}

carro.irPara('Roma')
</code></pre><h2 id="classes"><strong>Classes</strong></h2><p>Falamos sobre objetos, uma das partes mais interessantes do JavaScript.</p><p>Neste capítulo, subiremos um degrau ao introduzirmos as classes.</p><p>O que são classes? Elas são uma maneira de definir um padrão comum para múltiplos objetos.</p><p>Vamos pegar um objeto <code>pessoa</code>:</p><pre><code class="language-js">const pessoa = {
  nome: 'Flavio'
}
</code></pre><p>Podemos criar uma classe chamada <code>Pessoa</code> (observe o <code>P</code> maiúsculo, uma convenção ao usar classes), que possui uma propriedade <code>nome</code>:</p><pre><code class="language-js">class Pessoa {
  nome
}
</code></pre><p>Agora, a partir dessa classe, inicializamos um objeto <code>flavio</code> assim:</p><pre><code class="language-js">const flavio = new Pessoa()
</code></pre><p><code>flavio</code> é chamado de uma <em><em>inst</em>ância</em> da classe Pessoa.</p><p>Podemos definir o valor da propriedade <code>nome</code>:</p><pre><code class="language-js">flavio.nome = 'Flavio'
</code></pre><p>e podemos acessá-lo usando</p><pre><code class="language-js">flavio.nome
</code></pre><p>assim como fazemos para as propriedades do objeto.</p><p>As classes podem conter propriedades, como <code>nome</code>, e métodos.</p><p>Os métodos são definidos desta maneira:</p><pre><code class="language-js">class Pessoa {
  ola() {
    return 'Olá, meu nome é Flavio'
  }
}
</code></pre><p>e podemos invocar métodos em uma instância da classe:</p><pre><code class="language-js">class Pessoa {
  ola() {
    return 'Olá, meu nome é Flavio'
  }
}
const flavio = new Pessoa()
flavio.ola()
</code></pre><p>Existe um método especial chamado <code>constructor()</code>, que podemos usar para inicializar as propriedades da classe quando criamos uma instância de objeto.</p><p>Funciona assim:</p><pre><code class="language-js">class Pessoa {
  constructor(nome) {
    this.nome = nome
  }

  ola() {
    return 'Olá, meu nome é ' + this.nome + '.'
  }
}
</code></pre><p>Observe como usamos <code>this</code> para acessar a instância do objeto.</p><p>Agora, podemos instanciar um novo objeto da classe, passar uma <em>string </em>e, quando chamarmos <code>ola</code>, receberemos uma mensagem personalizada:</p><pre><code class="language-js">const flavio = new Pessoa('flavio')
flavio.ola() //'Olá, meu nome é flavio.'
</code></pre><p>Quando o objeto é inicializado, o método <code>constructor</code> é chamado com qualquer parâmetro passado.</p><p>Normalmente, os métodos são definidos na instância do objeto, não na classe.</p><p>Você pode definir um método como <code>static</code> para permitir que ele seja executado na classe em vez disso:</p><pre><code class="language-js">class Pessoa {
  static olaGenerico() {
    return 'Olá'
  }
}

Pessoa.olaGenerico() //Olá
</code></pre><p>Isso é muito útil, às vezes.</p><h2 id="heran-a"><strong>Herança</strong></h2><p>Uma classe pode ser uma <strong>extensão </strong>de outra classe de modo que os objetos inicializados usando essa classe herdam todos os métodos de ambas as classes.</p><p>Suponha que temos uma classe <code>Pessoa</code>:</p><pre><code class="language-js">class Pessoa {
  ola() {
    return 'Olá, eu sou uma Pessoa'
  }
}
</code></pre><p>Podemos definir uma nova classe, <code>Programador</code>, que estende <code>Pessoa</code>:</p><pre><code class="language-js">class Programador extends Pessoa {

}
</code></pre><p>Agora, se instanciarmos um novo objeto com a classe <code>Programador</code>, ele tem acesso ao método <code>ola()</code> de <code>Pessoa</code>:</p><pre><code class="language-js">const flavio = new Programador()
flavio.ola() //'Olá, eu sou uma Pessoa'
</code></pre><p>Dentro de uma classe filha, você pode referenciar a classe pai chamando <code>super()</code>:</p><pre><code class="language-js">class Programador extends Pessoa {
  ola() {
    return super.ola() + 
      '. Eu também sou um programador.'
  }
}

const flavio = new Programador()
flavio.ola()
</code></pre><p>O código acima imprime na tela <em>Olá, eu sou uma Pessoa<em>. </em>Eu também sou um<em> program</em>ador</em>.</p><h2 id="programa-o-ass-ncrona-e-callbacks"><strong>Programação assíncrona e <em>callbacks</em></strong></h2><p>Na maioria das vezes, o código JavaScript é executado de modo síncrono.</p><p>Isso significa que uma linha de código é executada, depois a próxima linha é executada e assim por diante.</p><p>Tudo é como você espera e como funciona na maioria das linguagens de programação.</p><p>Todavia, há momentos em que você não pode esperar que uma linha de código seja executada.</p><p>Você simplesmente não pode esperar 2 segundos para carregar um arquivo grande e parar o programa completamente enquanto isso.</p><p>Você não pode simplesmente esperar que um recurso de rede seja baixado antes de fazer outra coisa.</p><p>O JavaScript resolve esse problema usando <strong><strong><em>callbacks</em></strong></strong>.</p><p>Um dos exemplos mais simples de como <em>callbacks</em> são usadas é com temporizadores (<em>timers</em>). Os temporizadores não fazem parte do JavaScript, mas são fornecidos pelo navegador e pelo Node.js. Deixe-me falar sobre um pouco sobre os <em>timers </em>que temos: <code>setTimeout()</code>.</p><p>A função <code>setTimeout()</code> aceita 2 argumentos: uma função e um número. O número são os milissegundos que devem passar antes que a função seja executada.</p><p>Exemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">setTimeout(() =&gt; {
  // executa após 2 segundos
  console.log('dentro da função')
}, 2000)
</code></pre><figcaption>Comentário em português: "executa após 2 segundos".</figcaption></figure><p>A função que contém a linha <code>console.log('dentro da função')</code> será executada após 2 segundos.</p><p>Se você adicionar um <code>console.log('antes')</code> antes da função e um <code>console.log('depois')</code> depois dela, teremos:</p><pre><code class="language-js">console.log('antes')
setTimeout(() =&gt; {
  // executa após 2 segundos
  console.log('dentro da função')
}, 2000)
console.log('depois')
</code></pre><p>Você verá isto no seu console:</p><pre><code class="language-js">antes
depois
dentro da função
</code></pre><p>A função de <em>callback </em>é executada de modo assíncrono.</p><p>Esse é um padrão muito comum quando trabalhamos com o sistema de arquivos, com a rede, com eventos ou com o DOM no navegador.</p><p>Todas as coisas que mencionei não são JavaScript "básico". Portanto, não são explicadas neste manual, mas você encontrará muitos exemplos em meus outros manuais disponíveis em <a href="https://flaviocopes.com/">https://flaviocopes.com</a>.</p><p>Veja como podemos implementar <em>callbacks </em>em nosso código.</p><p>Definimos uma função que aceita um parâmetro <code>callback</code>, que é uma função.</p><p>Quando o código estiver pronto para invocar a <em>callback</em>, nós a invocamos passando o resultado:</p><pre><code class="language-js">const fazerAlgo = callback =&gt; {
  //Faça coisas
  //Faça coisas
  const resultado = /* .. */
  callback(resultado)
}
</code></pre><p>Um código que utiliza essa função, a usaria assim:</p><pre><code class="language-js">fazerAlgo(resultado =&gt; {
  console.log(resultado)
})
</code></pre><h2 id="promises"><strong><em>Promises</em></strong></h2><p><em>Promises</em>, ou promessas, são uma maneira alternativa de lidar com código assíncrono.</p><p>Como vimos no capítulo anterior, com <em>callbacks, </em>estaríamos passando uma função para outra chamada de função, que seria invocada quando a função terminasse de ser processada.</p><p>Assim:</p><pre><code class="language-js">fazerAlgo(resultado =&gt; {
  console.log(resultado)
})
</code></pre><p>Quando o código <code>fazerAlgo()</code> termina, ele chama a função recebida como parâmetro:</p><pre><code class="language-js">const fazerAlgo = callback =&gt; {
  //Faça coisas
  //Faça coisas
  const resultado = /* .. */
  callback(resultado)
}

</code></pre><p>O principal problema dessa abordagem é que, se precisarmos usar o resultado dessa função no restante do nosso código, todo o nosso código deve estar aninhado dentro da função de <em>callback </em>e, se tivermos que fazer 2 a 3 <em>callbacks</em>, entramos no que geralmente chamamos de "<em>callback hell</em>" (em português, inferno das callbacks) com muitos níveis de funções aninhadas em outras funções:</p><pre><code class="language-js">fazerAlgo(resultado =&gt; {
  fazerOutraCoisa(outroResultado =&gt; {
    fazerMaisUmaCoisa(maisUmResultado =&gt; {
      console.log(resultado)
    })
  }) 
})
</code></pre><p><em>Promises </em>são uma maneira de lidar com isso.</p><p>Em vez de fazer:</p><pre><code class="language-js">fazerAlgo(resultado =&gt; {
  console.log(resultado)
})
</code></pre><p>Chamamos uma função baseada em uma <em>promise</em>, desta maneira:</p><pre><code class="language-js">fazerAlgo()
  .then(resultado =&gt; {
    console.log(resultado)
  })
</code></pre><p>Primeiro chamamos a função. Em seguida, temos o método <code>then()</code>, que é chamado quando a função termina.</p><p>O recuo não importa, mas você frequentemente usará esse estilo de identação para maior clareza.</p><p>É comum detectar erros usando o método <code>catch()</code>:</p><pre><code class="language-js">fazerAlgo()
  .then(resultado =&gt; {
    console.log(resultado)
  })
  .catch(erro =&gt; {
    console.log(erro)
  })
</code></pre><p>Agora, para poder usar essa sintaxe, a implementação da função <code>fazerAlgo()</code> deve ser um pouco especial. Ela deve usar a API <em>Promises</em>.</p><p>Em vez de declará-la como uma função normal:</p><pre><code class="language-js">const fazerAlgo = () =&gt; {
  
}
</code></pre><p>Nós a declaramos como um objeto <em>promise</em>:</p><pre><code class="language-js">const fazerAlgo = new Promise()
</code></pre><p>e passamos uma função no construtor de <em>Promise</em>:</p><pre><code class="language-js">const fazerAlgo = new Promise(() =&gt; {

})
</code></pre><p>Essa função recebe 2 parâmetros. O primeiro é uma função que chamamos para resolver a <em>promise</em>; o segundo é uma função que chamamos para rejeitá-la.</p><pre><code class="language-js">const fazerAlgo = new Promise(
  (resolve, reject) =&gt; {
    
})
</code></pre><p>Resolver uma <em>promise</em> significa completá-la com sucesso (o que resulta na chamada do método <code>then()</code> em qualquer lugar que o utilize).</p><p>Rejeitar uma <em>promise </em>significa encerrá-la com um erro (o que resulta na chamada do método <code>catch()</code> em qualquer lugar que o utilize).</p><p>Veja como:</p><pre><code class="language-js">const fazerAlgo = new Promise(
  (resolve, reject) =&gt; {
    //um código
    const sucesso = /* ... */
    if (sucesso) {
      resolve('ok')
    } else {
      reject('um erro ocorreu')
    }
  }
)
</code></pre><p>Podemos passar um parâmetro para as funções <em>resolve </em>e <em>reject</em> de qualquer tipo que desejarmos.</p><h2 id="async-e-await"><strong>Async e await</strong></h2><p>As funções assíncronas são uma abstração de alto nível das <em>promises</em>.</p><p>Uma função assíncrona retorna uma <em>promise</em>, como neste exemplo:</p><pre><code class="language-js">const obterDados = () =&gt; {
  return new Promise((resolve, reject) =&gt; {
    setTimeout(() =&gt; 
      resolve('dados'), 2000)
  })
}
</code></pre><p>Qualquer código que queira usar esta função usará a palavra-chave <code>await</code> imediatamente antes da função:</p><pre><code class="language-js">const dados = await obterDados()
</code></pre><p>Ao fazer isso, todos os dados retornados pela <em>promise </em>serão atribuídos à variável <code>dados</code>.</p><p>No nosso caso, os dados são apenas a string "dados".</p><p>Há uma ressalva: toda vez que usamos a palavra-chave <code>await</code>, precisamos fazer isso dentro de uma função definida como <code>async</code>.</p><p>Assim:</p><pre><code class="language-js">const fazerAlgo = async () =&gt; {
  const dados = await obterDados()
  console.log(dados)
}
</code></pre><p>A dupla <em>async</em>/<em>await </em>nos permite ter um código mais limpo e um modelo mental simples para trabalhar com código assíncrono.</p><p>Como você pode ver no exemplo acima, nosso código parece bem mais simples. Compare-o ao código usando <em>promises </em>ou funções de <em>callback</em>.</p><p>Esse é um exemplo bem simples. Os maiores benefícios surgirão quando o código for muito mais complexo.</p><p>A título de exemplo, veja como você receberia um recurso em JSON usando a API <em>Fetch</em> e o analisaria, usando <em>promises</em>:</p><pre><code class="language-js">const pegarDadosDoPrimeiroUsuario = () =&gt; {
  // obter a lista de usuarios
  return fetch('/usuarios.json') 
    // fazer o parsing do JSON
    .then(response =&gt; resposta.json()) 
    // pegar o primeiro usuario
    .then(usuarios =&gt; usuarios[0]) 
    // obter dados do usuario
    .then(usuario =&gt; 
      fetch(`/users/${usuario.nome}`)) 
    // fazer o parsing do JSON
    .then(respostaDoUsuario =&gt; resposta.json()) 
}

pegarDadosDoPrimeiroUsuario()
</code></pre><p>E aqui está a mesma funcionalidade usando <em>await</em>/<em>async</em>:</p><pre><code class="language-js">const pegarDadosDoPrimeiroUsuario = async () =&gt; {
  // obter a lista de usuarios
  const resposta = await fetch('/usuarios.json') 
  // fazer o parsing do JSON
  const usuarios = await response.json() 
  // pegar o primeiro usuario
  const usuario = usuarios[0] 
  // obter dados do usuario
  const respostaDoUsuario = 
    await fetch(`/users/${usuario.nome}`)
  // fazer o parsing do JSON
  const dadosDoUsuario = await usuario.json() 
  return dadosDoUsuario
}

pegarDadosDoPrimeiroUsuario()
</code></pre><h2 id="escopos-de-vari-veis"><strong>Escopos de variáveis</strong></h2><p>Quando introduzi variáveis, falei sobre usar <code>const</code>, <code>let</code>, e <code>var</code>.</p><p>Escopo é o conjunto de variáveis que estão ​​visíveis para uma determinada parte do programa.</p><p>No JavaScript, temos um escopo global, um escopo de bloco e um escopo de função.</p><p>Se uma variável é definida fora de uma função ou bloco, ela é anexada ao objeto global e tem um escopo global, o que significa que está disponível em todas as partes do programa.</p><p>Há uma diferença muito importante entre as declarações de variáveis com <code>var</code>, <code>let</code> e <code>const</code>.</p><p>Uma variável definida como <code>var</code> dentro de uma função só fica visível dentro dessa função, de maneira semelhante aos seus argumentos.</p><p>Uma variável definida como <code>const</code> ou <code>let</code>, por outro lado, só é visível dentro do <strong><strong>bloco</strong></strong> onde foi definida.</p><p>Um bloco é um conjunto de instruções agrupadas em um par de chaves, como as que encontramos dentro de uma instrução <code>if</code>, um laço <code>for</code> ou uma função.</p><p>É importante entender que um bloco não define um novo escopo para <code>var</code>, mas o faz isso para <code>let</code> e <code>const</code>.</p><p>Isso tem implicações muito práticas.</p><p>Suponha que você defina uma variável <code>var</code> dentro de uma condicional <code>if</code> em uma função</p><pre><code class="language-js">function obterDados() {
  if (true) {
    var dados = 'dados'
    console.log(dados) 
  }
}
</code></pre><p>Se você chamar essa função, terá <code>dados</code> sendo impresso no console.</p><p>Se você mover <code>console.log(dados)</code> para após o <code>if</code>, ele ainda funcionará:</p><pre><code class="language-js">function obterDados() {
  if (true) {
    var dados = 'dados'
  }
  console.log(dados) 
}
</code></pre><p>Porém, se você mudar <code>var data</code> para <code>let data</code>:</p><pre><code class="language-js">function obterDados() {
  if (true) {
    let dados = 'dados'
  }
  console.log(dados) 
}
</code></pre><p>Você receberá um erro: <code>ReferenceError: dados is not defined</code> (erro de referência: dados não foi definida).</p><p>Isso acontece porque <code>var</code> possui escopo de função. Há algo especial acontecendo aqui que chamamos de <em>hoisting </em>(em português, "içamento"). Resumindo, a declaração <code>var</code> é movida para o topo da função mais próxima pelo JavaScript antes de executar o código. É assim, mais ou menos, que o JS vê a função internamente:</p><pre><code class="language-js">function obterDados() {
  var dados
  if (true) {
    dados = 'dados'
  }
  console.log(dados) 
}
</code></pre><p>É por isso que você também pode colocar <code>console.log(dados)</code> no topo de uma função, mesmo antes de ela ser declarada, e obterá <code>undefined</code> como valor para aquela variável:</p><pre><code class="language-js">function obterDados() {
  console.log(dados) 
  if (true) {
    var dados = 'dados'
  }
}
</code></pre><p>Porém, se você mudar para <code>let</code>, receberá um erro <code>ReferenceError: dados is not defined</code>, porque o <em>hoisting </em>não acontece em declarações com <code>let</code>.</p><p><code>const</code> segue as mesmas regras que <code>let</code>: tem escopo de bloco.</p><p>Pode ser complicado no começo, mas assim que você perceber essa diferença, verá por que usar <code>var</code> é considerada uma má prática hoje em dia em comparação com o uso do <code>let</code> – que possui menos partes móveis e escopo limitado ao bloco, o que também torna <code>let</code> muito bom como variável para laços porque deixa de existir após o término da repetição:</p><pre><code class="language-js">function fazerLaco() {
  for (var i = 0; i &lt; 10; i++) {
    console.log(i)
  }
  console.log(i)
}

fazerLaco()
</code></pre><p>Ao sair do laço, <code>i</code> será uma variável válida e com valor 10.</p><p>Se você mudar para <code>let</code>, quando usar <code>console.log(i)</code> receberá um erro <code>ReferenceError: i is not defined</code> (erro de referência: i não foi definido).</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Muito obrigado por ter lido este livro.</p><p>Espero que ele sirva de inspiração para aprender mais sobre JavaScript.</p><p>Para saber mais sobre JavaScript, confira o blog do autor: <a href="https://flaviocopes.com/">flaviocopes.com</a>.</p><blockquote>Observação: <a href="https://flaviocopes.com/page/javascript-handbook/">você pode baixar uma versão em PDF ou ePub deste Manual de JavaScript para Iniciantes inscrevendo-se na newsletter do autor</a> <em>(em inglês)</em>. </blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ As principais estruturas de dados que você deve conhecer para sua próxima entrevista de programação ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Fahim ul Haq Niklaus Wirth, um cientista da computação suíço, escreveu um livro em 1976 intitulado Algorithms + Data Structures = Programs (em português, "Algoritmos + Estrutura de Dados = Programas"). Mais de 40 anos depois, essa equação permanece sendo verdade. É por isso que aspirantes a posições ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/as-principais-estruturas-de-dados-que-voce-deve-conhecer-para-sua-proxima-entrevista-de-programacao/</link>
                <guid isPermaLink="false">6290fd2689eb8b0539f446b2</guid>
                
                    <category>
                        <![CDATA[ Java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael B. Pires ]]>
                </dc:creator>
                <pubDate>Thu, 16 Jun 2022 01:46:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/1_s6hhrgR5_tXpO_j7uKaHMw-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/the-top-data-structures-you-should-know-for-your-next-coding-interview-36af0831f5e3/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The top data structures you should know for your next coding interview</a>
      </p><p>Escrito por: Fahim ul Haq</p><p>Niklaus Wirth, um cientista da computação suíço, escreveu um livro em 1976 intitulado <em><em>Algorithms + Data Structures = Programs</em></em> (em português, "Algoritmos + Estrutura de Dados = Programas").</p><p>Mais de 40 anos depois, essa equação permanece sendo verdade. É por isso que aspirantes a posições em engenharia de software precisam demonstrar sua compreensão de estruturas de dados ao se candidatarem a um emprego na área.</p><p>Quase todos os problemas exigem que o candidato demonstre uma compreensão profunda das estruturas de dados. Não importa se você acabou de se formar (em uma universidade ou em um bootcamp de programação) ou se você tem décadas de experiência.</p><p>Às vezes, as perguntas em uma entrevista mencionam explicitamente uma estrutura de dados, por exemplo, "dada uma árvore binária". Outras vezes, elas estão implícitas, como em "queremos rastrear o número de livros associados a cada autor".</p><p>Aprender estruturas de dados é essencial, mesmo que você esteja apenas tentando melhorar seu trabalho atual. Vamos começar entendendo o básico.</p><h3 id="o-que-uma-estrutura-de-dados"><strong>O que é uma estrutura de dados?</strong></h3><p>Em termos simples, uma estrutura de dados é um contêiner que armazena dados em um layout específico. Esse "layout" permite que a estrutura de dados seja eficiente em algumas operações e ineficiente em outras. Seu objetivo é entender as estruturas de dados de modo que você consiga escolher a mais adequada para o problema apresentado.</p><h4 id="por-que-precisamos-de-estruturas-de-dados"><strong>Por que precisamos de estruturas de dados<strong><strong>?</strong></strong></strong></h4><p>Como as estruturas de dados são usadas para armazenar dados de uma forma organizada, e como os dados são a entidade mais crucial nas ciências da computação, fica claro o verdadeiro valor das estruturas de dados.</p><p>Independentemente do problema que você esteja resolvendo, de uma forma ou de outra, terá que lidar com dados — seja o salário de um empregado, preços de ações, uma lista de compras, ou mesmo uma simples lista telefônica.</p><p>Com base em diferentes cenários, os dados precisam ser guardados em um formato específico. Temos um punhado de estrutura de dados que satisfazem nossa necessidade de armazenar dados em diferentes formatos.</p><h3 id="estruturas-de-dados-mais-utilizadas"><strong>Estruturas de dados mais utilizadas </strong></h3><p>Primeiro, listemos as estruturas de dados mais utilizadas e, então, vamos explorá-las uma a uma:</p><ol><li>Arrays</li><li>Pilhas</li><li>Filas</li><li>Listas vinculadas</li><li>Árvores </li><li>Grafos</li><li>Tries (elas são árvores, efetivamente, mas ainda assim é bom tratar delas separadamente)</li><li>Hash tables</li></ol><h3 id="arrays"><strong>Arrays</strong></h3><p>Um array é a estrutura de dados mais simples e mais amplamente utilizada. Outras estruturas de dados como pilhas e filhas são derivadas dos arrays.</p><p>Aqui temos uma imagem de um array simples de tamanho 4, contendo elementos (1, 2, 3 e 4).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/B4CncYOv-dN76B45UXdVrfat45MvgQ9b8atv.png" class="kg-image" alt="B4CncYOv-dN76B45UXdVrfat45MvgQ9b8atv" width="396" height="158" loading="lazy"></figure><p>Cada elemento de dados recebe um valor numérico positivo chamado de <strong>índice</strong>, o qual corresponde à posição daquele item dentro do array. A maioria das linguagens de programação define o índice inicial do array como 0.</p><p>A seguir, temos os dois tipos de arrays:</p><ul><li>Arrays unidimensionais (como o mostrado acima)</li><li>Arrays multidimensionais (arrays dentro de arrays)</li></ul><h4 id="opera-es-b-sicas-com-arrays"><strong>Operações básicas com arrays</strong></h4><ul><li>Insert (inserir) — Insere um elemento em um determinado índice</li><li>Get (receber) — Retorna um elemento em um determinado índice</li><li>Delete (excluir) — Remove um elemento em um determinado índice</li><li>Size (tamanho) — Obtém o número total de elementos de um array</li></ul><h4 id="perguntas-mais-comuns-sobre-arrays-em-entrevistas"><strong>Perguntas mais comuns sobre arrays em entrevistas</strong></h4><ul><li>Encontre o segundo menor elemento de um array</li><li>Primeiros inteiros não repetidos de um array</li><li>Mescle dois arrays ordenados</li><li>Reordene os valores positivos e negativos em um array</li></ul><h3 id="pilhas-stacks-"><strong>Pilhas (Stacks)</strong></h3><p>Todos temos familiaridade com a famosa opção de <strong>desfazer</strong>, que está presente em quase todos os aplicativos. Você já se perguntou como ela funciona? A ideia: você armazena na memória os estados anteriores de seu trabalho (os quais são limitados a um número específico) em uma ordem tal que o último estado apareça primeiro. Isso não pode ser feito usando-se apenas arrays. É aí que as <strong><em>pilhas</em></strong> passam a ser muito úteis. </p><p>Um exemplo de uma pilha na vida real seria um conjunto de livros colocados uns sobre os outros em uma ordem vertical. Para visualizar o livro que está em algum lugar do meio, você precisará remover todos os livros colocados em cima dele. É assim que funciona o método LIFO (acrônimo para a expressão inglesa "Last In, First Out" — em português, "o último a entrar é o primeiro a sair").</p><p>Aqui temos uma imagem de uma pilha contendo três elementos de dados (1, 2 e 3), em que 3 está no topo e será removido primeiro:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/BP-lD2OxkMbIQI2iZD-jxgIPlANlsMTqwnLP.png" class="kg-image" alt="BP-lD2OxkMbIQI2iZD-jxgIPlANlsMTqwnLP" width="462" height="318" loading="lazy"><figcaption>(Na imagem: <em>top </em>= topo.)</figcaption></figure><h4 id="opera-es-b-sicas-com-pilhas"><strong>Operações básicas com pilhas</strong></h4><ul><li>Push (empilhar) — Insere um elemento no topo</li><li>Pop (desempilhar) — Retorna o elemento do topo após removê-lo da pilha</li><li>isEmpty (éVazio) — Retorna verdadeiro se a pilha estiver vazia</li><li>Top (topo) — Retorna o elemento do topo sem removê-lo da pilha</li></ul><h4 id="perguntas-mais-comuns-sobre-pilhas-em-entrevistas"><strong>Perguntas mais comuns sobre pilhas em entrevistas</strong></h4><ul><li>Calcule o valor de uma expressão pós-fixada usando uma pilha</li><li>Ordene valores em uma pilha</li><li>Verifique se os parênteses estão balanceados em uma expressão</li></ul><h3 id="filas-queues-"><strong>Filas (Queues)</strong></h3><p>Similares às pilhas, as <strong><em>filas</em></strong> são uma outra estrutura de dados linear que armazena elementos de forma sequencial. A única diferença significativa entre pilhas e filas é que, em vez de usar o método LIFO, as filas usam a lógica FIFO, um acrônimo para "First in, First Out" (em português, "o primeiro a entrar é o primeiro a sair").</p><p>Um exemplo perfeito de uma fila na vida real: uma fileira de pessoas aguardando em uma bilheteria. Se uma nova pessoa chega, ela se junta às demais ao final da fila, não no começo — e a pessoa em pé à frente da fileira será a primeira a receber o ingresso e, portanto, deixar a fila.</p><p>Aqui temos uma imagem de uma fila contendo quatro elementos de dados (1, 2, 3 e 4), em que 1 está no topo e será removido primeiro:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/C2riLJTPBVpSI-3o5Cx9IrQ16LZi1kLrqYXo.png" class="kg-image" alt="C2riLJTPBVpSI-3o5Cx9IrQ16LZi1kLrqYXo" width="542" height="734" loading="lazy"><figcaption>(Na imagem:<em> remove previous elements</em> = remove elementos anteriores; <em>front </em>= frente; <em>back </em>= fundo; <em>insert new elements</em> = insere novos elementos.)</figcaption></figure><h4 id="opera-es-b-sicas-com-filas"><strong>Operações básicas com filas</strong></h4><ul><li>Enqueue (enfileirar) — Insere um elemento ao final da fila</li><li>Dequeue (desenfileirar) — Remove um elemento do início da fila</li><li>isEmpty (éVazio) — Retorna verdadeiro se a fila estiver vazia</li><li>Top (topo) — Retorna o primeiro elemento da fila</li></ul><h4 id="perguntas-mais-comuns-sobre-filas-em-entrevistas"><strong>Perguntas mais comuns sobre filas em entrevistas</strong></h4><ul><li>Implemente uma pilha usando uma fila</li><li>Ordene inversamente os primeiros k elementos de uma fila</li><li>Gere números binários de 1 a n usando uma fila</li></ul><h3 id="lista-vinculada-linked-list-"><strong>Lista vinculada (<strong><strong>Linked </strong></strong>l<strong><strong>ist</strong></strong>)</strong></h3><p>Uma lista vinculada (ou encadeada) é outra estrutura de dados linear importante que pode parecer com arrays à primeira vista, mas que difere em relação à alocação de memória, à estrutura interna e a como as operações básicas de inserção e exclusão são realizadas.</p><p>Uma lista vinculada é como uma cadeia de nós, onde cada nó contém informações como dados e um ponteiro para o nó seguinte na cadeia. Há um ponteiro de cabeça (head), que aponta para o primeiro elemento da lista vinculada e, se a lista estiver vazia, ele simplesmente aponta para nulo ou nada.</p><p>As listas vinculadas são utilizadas para implementar sistemas de arquivos, tabelas hash e listas de adjacência.</p><p>Aqui está uma representação visual da estrutura interna de uma lista vinculada:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png" class="kg-image" alt="ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/ezrkbpSyblh3famnGsgIHiRvHV9CKODu0tPw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="147" loading="lazy"><figcaption>(Na imagem: <em>head </em>= cabeça; <em>data </em>= dados; <em>pointer </em>= ponteiro; <em>null </em>= nulo.)</figcaption></figure><p>A seguir, temos os tipos de listas vinculadas:</p><ul><li>Lista simplesmente vinculada (unidirecional)</li><li>Lista duplamente vinculada (bidirecional)</li></ul><h4 id="opera-es-b-sicas-com-listas-vinculadas"><strong>Operações básicas com listas vinculadas</strong></h4><ul><li><em><em>InsertAtEnd </em></em>(inserirAoFim) — Insere determinado elemento ao fim da lista vinculada</li><li><em><em>InsertAtHead</em></em> <em><em> </em></em>(inserirAoInício) — Insere determinado elemento no início/cabeça da lista vinculada</li><li><em><em>Delete </em></em>(excluir) — Exclui determinado elemento da lista vinculada</li><li><em><em>DeleteAtHead </em></em>(excluirAoInício) — Exclui o primeiro elemento da lista vinculada</li><li><em><em>Search</em></em> (busca) — Retorna determinado elemento da lista vinculada</li><li><em><em>isEmpty </em></em>(éVazio)— Retorna verdadeiro se a lista vinculada estiver vazia</li></ul><h4 id="perguntas-mais-comuns-sobre-listas-vinculadas-em-uma-entrevista"><strong>Perguntas mais comuns sobre listas vinculadas em uma entrevista</strong></h4><ul><li>Ordene inversamente uma lista vinculada</li><li>Detecte um loop (laço) em uma lista vinculada</li><li>Retorne o enésimo nó partindo do final de uma lista vinculada</li><li>Remova elementos duplicados de uma lista vinculada</li></ul><h3 id="grafos-graphs-"><strong>Grafos (<strong><strong>Graphs</strong></strong>)</strong></h3><p>Um <strong><em>grafo</em></strong> é um conjunto de nós que estão conectados uns aos outros na forma de uma rede. Os nós também são chamados de vértices. Um <strong>par(x,y)</strong> é chamado de <strong>aresta</strong>, indicando que o vértice <strong>x </strong>está conectado ao vértice <strong>y</strong>. Uma aresta pode conter peso/custo, mostrando qual o custo exigido para se atravessar do vértice x para y.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png" class="kg-image" alt="0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/0MsvzasAr6vS6bnvozjRAa5iBnEDKn9Cty0D.png 800w" sizes="(min-width: 720px) 720px" width="800" height="425" loading="lazy"><figcaption>(Na imagem: <em>vertex </em>= vértice; <em>edge </em>= aresta.)</figcaption></figure><p>Tipos de grafos:</p><ul><li>Grafo não direcionado</li><li>Grafo direcionado (ou orientado)</li></ul><p>Em uma linguagem de programação, os grafos podem ser representados usando-se duas formas:</p><ul><li>Matriz de adjacência</li><li>Lista de adjacência</li></ul><p>Algoritmos comuns para varredura de grafos:</p><ul><li>Busca em largura (em inglês, <em>Breadth First Search</em>)</li><li>Busca em profundidade (em inglês, <em>Depth First Search</em>)</li></ul><h4 id="perguntas-mais-comuns-sobre-grafos-em-uma-entrevista"><strong>Perguntas mais comuns sobre grafos em uma entrevista</strong></h4><ul><li>Implemente algoritmos de busca em largura e em profundidade</li><li>Verifique se um grafo é ou não uma árvore</li><li>Conte o número de arestas em um grafo</li><li>Encontre o caminho mínimo entre dois vértices</li></ul><h3 id="-rvores-trees-"><strong>Árvores (<strong><strong>Trees</strong></strong>)</strong></h3><p>Uma <strong><em>árvore</em></strong> é uma estrutura de dados hierárquica que consiste em vértices (nós) e arestas que os conectam. Árvores são semelhantes a grafos, mas o ponto-chave que diferencia uma árvore de um grafo é que, em uma árvore, não deve haver ciclos.</p><p>Árvores são amplamente utilizadas em Inteligência Artificial e em algoritmos complexos para fornecer um mecanismo de armazenamento eficiente para a resolução de problemas.</p><p>A seguir, temos a imagem de uma árvore simples, além da nomenclatura básica usada para essa estrutura de dados:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w.png" class="kg-image" alt="VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/VPUnmQO8rMoLGMqMe24EnoJ3uS72JZdMt48w.png 800w" sizes="(min-width: 720px) 720px" width="800" height="352" loading="lazy"><figcaption>(Na imagem: <em>root </em>= raiz; <em>parent </em>= pai; <em>child </em>= filho; <em>leaf </em>= folha; <em>sibling </em>= irmão.)</figcaption></figure><p>A seguir temos os tipos de árvores:</p><ul><li>Árvore n-ária</li><li>Árvore balanceada</li><li>Árvore binária</li><li>Árvore binária de busca</li><li>Árvore AVL</li><li>Árvore rubro-negra </li><li>Árvore 2-3</li></ul><p>Destes tipos, a árvore binária e a árvore binária de busca são as mais comumente utilizadas.</p><h4 id="perguntas-mais-comuns-sobre-rvores-em-uma-entrevista"><strong>Perguntas mais comuns sobre árvores em uma entrevista</strong></h4><ul><li>Encontre a altura de uma árvore binária</li><li>Encontre o k-ésimo valor máximo em uma árvore binária de busca</li><li>Encontre nós a uma distância "k" da raiz</li><li>Encontre ancestrais de um determinado nó em uma árvore binária</li></ul><h3 id="trie"><strong>Trie</strong></h3><p>A <strong><em>Trie</em></strong>, também conhecida como "árvore de prefixos", é uma estrutura de dados em formato de árvore que se mostra bastante eficiente para solução de problemas relacionados a <em>strings</em>. Ela fornece recuperação rápida e é usada principalmente para pesquisar palavras em um dicionário, fornecer sugestões automáticas em um mecanismo de busca, e até mesmo para roteamento de IP.</p><p>Aqui temos uma ilustração de como três palavras "top", "thus" e "their" são armazenadas em uma Trie:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png" class="kg-image" alt="lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/lSNi21Wr4P6eMKDwLMQ5rijHhA-lBlovlc40-1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="1093" loading="lazy"><figcaption>(Na imagem: <em>root </em>= raiz.)</figcaption></figure><p>As palavras são armazenadas de cima para baixo, onde os nós de cor verde "p", "s" e "r" indicam os finais de "top", "thus" e "their", respectivamente.</p><p>Perguntas mais comuns sobre Tries em uma entrevista:</p><ul><li>Conte o número total de palavras em uma Trie</li><li>Imprima todas as palavras armazenadas em uma Trie</li><li>Classifique os elementos de um array usando uma Trie</li><li>Forme palavras de um dicionário usando Trie</li><li>Construa um dicionário <a href="https://pt.wikipedia.org/wiki/T9_(texto_previs%C3%ADvel)">T9</a></li></ul><h3 id="hash-table"><strong><strong><strong>Hash </strong></strong>t<strong><strong>able</strong></strong></strong></h3><p><strong>Hashing</strong> é um processo usado para identificar objetos de forma única e armazenar cada um deles em algum índice único pré-calculado chamado de "chave". Assim, o objeto é armazenado na forma de um par "chave-valor", e a coleção desses itens é chamada de "dicionário". Cada objeto pode ser pesquisado usando sua respectiva chave. Existem diferentes estruturas de dados baseadas em hashing, mas a estrutura de dados mais comumente usada é a <strong><strong>hash table</strong></strong> (também conhecida por "tabela de dispersão").</p><p>Hash tables são normalmente implementadas usando-se arrays.</p><p>O desempenho do hashing como estrutura de dados depende de três fatores:</p><ul><li>A função de hashing </li><li>O tamanho da hash table</li><li>O método de resolução de colisões</li></ul><p>Aqui temos uma ilustração de como o hash é mapeado em um array. O índice deste array é calculado por meio de uma função de hashing.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/zV3x2Pxt0JFt7UjokTKNx24HFmM3t-6phDV2.png" class="kg-image" alt="zV3x2Pxt0JFt7UjokTKNx24HFmM3t-6phDV2" width="348" height="394" loading="lazy"><figcaption>(Na imagem: <em>key </em>= chave; <em>data </em>= valor.)</figcaption></figure><h4 id="perguntas-mais-comuns-sobre-hashing-em-uma-entrevista"><strong>Perguntas mais comuns sobre hashing em uma entrevista</strong></h4><ul><li>Encontre pares simétricos em um array</li><li>Trace o caminho completo de uma jornada</li><li>Descubra se um array é um subconjunto de outro array</li><li>Verifique se determinados arrays são disjuntos (não possuem elementos em comum)</li></ul><p>Acima estão as oito principais estruturas de dados que você deve, definitivamente, conhecer antes de começar uma entrevista de programação. </p><p><em>Se você está procurando por mais material sobre estruturas de dados para entrevistas de programação, dê uma olhada nesses cursos interativos e baseados em desafios: Data Structures for Coding Interviews (<a href="https://www.educative.io/collection/5642554087309312/5634727314718720" rel="noopener">Python</a>, <a href="https://www.educative.io/collection/5642554087309312/5724822843686912" rel="noopener">Java</a> ou <a href="https://www.educative.io/collection/5642554087309312/5663204961157120" rel="noopener">JavaScript</a> - em inglês).</em></p><p><em>Para perguntas mais avançadas, confira<em> <a href="https://www.educative.io/collection/5642554087309312/5679846214598656" rel="noopener">Coderust 3.0: Faster Coding Interview Preparation with Interactive Challenges &amp; Visualizations</a></em> (em inglês)<em>.</em></em></p><p>Se você está se preparando para entrevistas em engenharia de software, aqui você encontra um <a href="https://medium.com/educative/3-month-coding-interview-bootcamp-904422926ce8">roteiro abrangente para se preparar para entrevistas de programação</a> (em inglês).</p><p>Boa sorte e bom aprendizado! :)</p><p><em><strong>Nota do tradutor:</strong> O freeCodeCamp.org possui um vasto material gratuito e em português para auxiliá-lo na <a href="https://www.freecodecamp.org/portuguese/learn/coding-interview-prep">preparação para entrevistas de programação</a>, incluindo inúmeros exercícios com algoritmos e estruturas de dados.</em></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
