<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bruno Moutinho</title>
    <description>The latest articles on DEV Community by Bruno Moutinho (@brunomoutinho).</description>
    <link>https://dev.to/brunomoutinho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F554725%2Faf7dc326-d6a0-455a-bd63-2913af40d52a.png</url>
      <title>DEV Community: Bruno Moutinho</title>
      <link>https://dev.to/brunomoutinho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brunomoutinho"/>
    <language>en</language>
    <item>
      <title>Introdução à programação em JS - elementos básicos parte 2</title>
      <dc:creator>Bruno Moutinho</dc:creator>
      <pubDate>Fri, 08 Oct 2021 16:18:13 +0000</pubDate>
      <link>https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-2-530o</link>
      <guid>https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-2-530o</guid>
      <description>&lt;p&gt;Computadores são extremamente bons em tarefas repetitivas. Eles conseguem executar os mesmos cálculos e procedimentos milhares de vezes sem erros que seres humanos geralmente cometem por causa do cansaço ou falta de atenção. Entretanto, não parece uma boa ideia escrever o código milhares de vezes para que o procedimento aconteça milhares de vezes.&lt;/p&gt;

&lt;p&gt;Funções são blocos de código que podem ser invocados quando conveniente, evitando a necessidade de se repetir o código várias vezes em uma aplicação. Hoje estudaremos as funções e operadores.&lt;/p&gt;




&lt;h2&gt;
  
  
  Índice da série:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-1-lf4"&gt;Introdução à programação em JS - elementos básicos parte 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introdução à programação em JS - elementos básicos parte 2 (você está aqui)&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;

&lt;p&gt;Em JavaScript, funções podem ser declaradas de duas formas: usando a palavra &lt;code&gt;function&lt;/code&gt; ou usando a sintaxe de "flecha". Existem diferenças entre essas duas formas de se declarar uma função, mas, por enquanto, essas diferenças são irrelevantes e podemos escolher a sintaxe que acharmos melhor. Abaixo, um exemplo de como usar cada uma das formas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Usando a palavra "function"&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;minhaFunção&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Usando a sintaxe de flecha&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;minhaFunçãoFlecha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Neste caso é importante frisar que estamos criando&lt;/span&gt;
&lt;span class="c1"&gt;// uma variável e inicializando ela com uma função.&lt;/span&gt;
&lt;span class="c1"&gt;// Como estamos criando uma variável, poderíamos ter&lt;/span&gt;
&lt;span class="c1"&gt;// utilizado "let" (dado) ou "var" (variável) ao invés&lt;/span&gt;
&lt;span class="c1"&gt;// de "const" (constante).&lt;/span&gt;
&lt;span class="c1"&gt;// Entretanto, exceto quando você precisar, é uma boa&lt;/span&gt;
&lt;span class="c1"&gt;// prática utilizar "const", pois evita que se&lt;/span&gt;
&lt;span class="c1"&gt;// modifique o valor da variável de maneiras inesperadas.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As partes principais da declaração são o nome da função (&lt;code&gt;minhaFuncao&lt;/code&gt; e &lt;code&gt;minhaFuncaoFlecha&lt;/code&gt;), os parâmetros (delimitados por &lt;code&gt;(&lt;/code&gt; e &lt;code&gt;)&lt;/code&gt;, embora não tenhamos adicionado nenhum parâmetro nesses exemplos) e o corpo da função (delimitado por &lt;code&gt;{&lt;/code&gt; e &lt;code&gt;}&lt;/code&gt;, embora não tenhamos adicionado nenhuma expressão no corpo).&lt;/p&gt;

&lt;p&gt;O nome da função pode receber qualquer texto, desde que obedeça às seguintes restrições (que são as mesmas restrições aplicadas a nomes de variáveis):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deve começar por uma letra ou o caractere &lt;code&gt;_&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Não pode conter espaço, caracteres especiais ou sinais de pontuação;&lt;/li&gt;
&lt;li&gt;Não se pode usar palavras reservadas (a lista de palavras reservadas no JavaScript pode ser vista aqui: &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Lexical_grammar#Palavras-chave"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Lexical_grammar#Palavras-chave&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É importante lembrar que os interpretadores de JavaScript diferenciam os nomes entre letras maiúsculas e minúsculas, ou seja, os nomes &lt;code&gt;minhaFunção&lt;/code&gt; e &lt;code&gt;minhafunção&lt;/code&gt; são diferentes. Da mesma forma, caracteres com acentuação são diferentes dos caracteres sem acentuação, ou seja, os nomes &lt;code&gt;minhaFuncao&lt;/code&gt; e &lt;code&gt;minhaFunção&lt;/code&gt; são diferentes.&lt;/p&gt;

&lt;p&gt;Como as duas formas de declarar funções são equivalentes para os exemplos que usaremos aqui, vou utilizar, por preferência pessoal, a sintaxe de flecha, principalmente por precisar escrever menos.&lt;/p&gt;

&lt;p&gt;Toda função retorna um valor quando executada. No caso das funções &lt;code&gt;minhaFunção&lt;/code&gt; e &lt;code&gt;minhaFunçãoFlecha&lt;/code&gt; que definimos anteriormente, como elas não têm um retorno explícito, elas retornam, implicitamente, o valor &lt;em&gt;indefinido&lt;/em&gt; (&lt;code&gt;undefined&lt;/code&gt;). Para definirmos um retorno explícito em uma função, nós usamos a palavra &lt;code&gt;return&lt;/code&gt;, cuja tradução é &lt;em&gt;retorna&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A função abaixo retorna o valor verdadeiro&lt;/span&gt;
&lt;span class="c1"&gt;// quando executada&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornaVeradeiro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;retornaVerdadeiro&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="c1"&gt;// A função abaixo retorna o valor falso&lt;/span&gt;
&lt;span class="c1"&gt;// quando executada.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retornaFalso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Perceba que eu omiti as chaves ({}) e a&lt;/span&gt;
&lt;span class="c1"&gt;// palavra de retorno (return). Quando&lt;/span&gt;
&lt;span class="c1"&gt;// escrevemos uma função com sintaxe de flecha&lt;/span&gt;
&lt;span class="c1"&gt;// que tem apenas a expressão de retorno, podemos&lt;/span&gt;
&lt;span class="c1"&gt;// omitir esses elementos, diminuindo ainda mais&lt;/span&gt;
&lt;span class="c1"&gt;// a quantidade de código que precisamos escrever.&lt;/span&gt;
&lt;span class="c1"&gt;// Compare com a função equivalente abaixo:&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;tambémRetornaFalso&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;retornaFalso&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="nx"&gt;tambémRetornaFalso&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando definimos uma função, podemos indicar valores que serão utilizados para calcular o valor de retorno da função. Esses valores são chamados de &lt;em&gt;parâmetros&lt;/em&gt;. Abaixo temos um exemplo simples de uma função com parâmetros definidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A função abaixo recebe como parâmetro dois&lt;/span&gt;
&lt;span class="c1"&gt;// valores, que demos o nome de x e y, e retorna&lt;/span&gt;
&lt;span class="c1"&gt;// a soma desses valores.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adição&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// A expressão abaixo executa a função "adição"&lt;/span&gt;
&lt;span class="c1"&gt;// atribuindo para o parâmetro "x" o valor 40 e&lt;/span&gt;
&lt;span class="c1"&gt;// para o parâmetro "y" o valor 2.&lt;/span&gt;
&lt;span class="nx"&gt;adição&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Operadores
&lt;/h2&gt;

&lt;p&gt;No exemplo acima, utilizamos o &lt;em&gt;operador&lt;/em&gt; &lt;code&gt;+&lt;/code&gt;. Não havíamos comentado anteriormente nessa série sobre os operadores ainda, mas podemos entender eles como funções que são "chamadas" com uma sintaxe diferente: enquanto a nossa função &lt;code&gt;adição&lt;/code&gt; recebe o valor dos parâmetros dentro dos parênteses (&lt;code&gt;adição(40, 2)&lt;/code&gt;), o operador &lt;code&gt;+&lt;/code&gt; recebe os parâmetros um de cada lado (&lt;code&gt;40 + 2&lt;/code&gt;). Outras operações matemáticas também existem em JavaScript, como &lt;code&gt;-&lt;/code&gt; (subtração), &lt;code&gt;*&lt;/code&gt; (multiplicação), &lt;code&gt;/&lt;/code&gt; (divisão) e &lt;code&gt;^&lt;/code&gt; (potenciação).&lt;/p&gt;

&lt;p&gt;Também existem operadores lógicos: temos o "e" lógico (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;), o "ou" lógico (&lt;code&gt;||&lt;/code&gt;) e o "não" lógico (&lt;code&gt;!&lt;/code&gt;). Esses operadores seguem as regras da lógica Booleana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Só são aceitos dois valores: verdadeiro (&lt;code&gt;true&lt;/code&gt;) e falso (&lt;code&gt;false&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;Uma expressão lógica pode ser:

&lt;ul&gt;
&lt;li&gt;Um valor Booleano;&lt;/li&gt;
&lt;li&gt;O operador lógico "não" (&lt;code&gt;!&lt;/code&gt;) e uma expressão lógica;&lt;/li&gt;
&lt;li&gt;Duas expressões lógicas conectadas por um operador lógico "e" (&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;) ou "ou" (&lt;code&gt;||&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Toda expressão lógica resolve para um valor Booleano.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observe abaixo cada um dos casos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Expressões lógicas com somente um valor Booleano:&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="c1"&gt;// Expressões lógicas com o operador lógico "não":&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="c1"&gt;// O espaço entre o operador lógico e o valor Booleano é opcional.&lt;/span&gt;

&lt;span class="c1"&gt;// Expressões lógicas conectadas por um operador lógico:&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="c1"&gt;// E podemos tornar tudo isso mais complicado:&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="c1"&gt;// Assim como na matemática, é interessante o uso&lt;/span&gt;
&lt;span class="c1"&gt;// de parênteses para identificar a ordem das&lt;/span&gt;
&lt;span class="c1"&gt;// operações. Nesse caso, queremos aplicar o&lt;/span&gt;
&lt;span class="c1"&gt;// operador "não" ao valor "verdadeiro" antes de&lt;/span&gt;
&lt;span class="c1"&gt;// avaliarmos o resultado do operador "e".&lt;/span&gt;
&lt;span class="c1"&gt;// Como '( ! true )' é avaliado para o valor&lt;/span&gt;
&lt;span class="c1"&gt;// "falso", e o resultado da expressão&lt;/span&gt;
&lt;span class="c1"&gt;// 'false &amp;amp;&amp;amp; true' é falso, o resultado da&lt;/span&gt;
&lt;span class="c1"&gt;// expressão '( ! true ) &amp;amp;&amp;amp; true' é "falso".&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma breve explicação sobre cada um dos operadores lógicos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;!&lt;/code&gt; - Operador de negação. Retorna o valor negado da expressão que vem à sua direita.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; - Operador de intersecção; "e" lógico. Retorna o valor "verdadeiro" apenas quando todos os operandos são verdadeiros. É chamado de intersecção quando pensamos em conjuntos matemáticos, pois quando queremos a intersecção de um conjunto A com um conjunto B, queremos os elementos que fazem parte do conjunto A e também fazem parte do conjunto B. A imagem abaixo ilustra essa relação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GdklGYq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4421df08-9ad8-4669-b598-637468573353/AB.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GdklGYq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4421df08-9ad8-4669-b598-637468573353/AB.svg" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4421df08-9ad8-4669-b598-637468573353/AB.svg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  PraCegoVer - A imagem acima mostra dois círculos parcialmente sobrepostos, um com a letra "A" ao centro, o outro com a letra B ao centro. A área em que um círculo se sobrepõe ao outro está rabiscada em vermelho, indicando que é a área de intersecção dos círculos. Imagem criada em &lt;a href="https://excalidraw.com/"&gt;https://excalidraw.com/&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;||&lt;/code&gt; - Operador de união; "ou" lógico. Retorna o valor "verdadeiro" quando pelo menos um dos operandos é verdadeiro. É chamado de união quando pensamos em conjuntos matemáticos, pois quando queremos a união de um conjunto A com um conjunto B, queremos os elementos que fazem parte do conjunto A, do conjunto B ou dos dois conjuntos. A imagem abaixo ilustra essa relação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y4mRk5FA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/323497ae-f779-4b60-8771-b9c86c20d0ed/A_OR_B.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y4mRk5FA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/323497ae-f779-4b60-8771-b9c86c20d0ed/A_OR_B.svg" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/323497ae-f779-4b60-8771-b9c86c20d0ed/A_OR_B.svg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  PraCegoVer - A imagem acima mostra dois círculos parcialmente sobrepostos, um com a letra "A" ao centro, o outro com a letra "B" ao centro. A área dos dois círculos, sobreposta ou não, está rabiscada em vermelho, indicando que é a área de união dos círculos. Imagem criada em &lt;a href="https://excalidraw.com/"&gt;https://excalidraw.com/&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Para cada um dos operadores, os valores apresentados nos exemplos acima são o conjunto de valores possíveis para qualquer expressão lógica. Se organizamos esses conjuntos em uma tabela, essa tabela é chamada de "tabela verdade".&lt;/p&gt;

&lt;h2&gt;
  
  
  Funções puras
&lt;/h2&gt;

&lt;p&gt;Um conceito muito importante quando estamos lidando com funções é o de &lt;em&gt;funções puras&lt;/em&gt;. Funções puras adicionam certas restrições que devem ser seguidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;São &lt;em&gt;determinísticas&lt;/em&gt;, ou seja, sempre que a função for executada com os mesmos parâmetros, ela terá o mesmo resultado;&lt;/li&gt;
&lt;li&gt;Não existe efeito colateral para a execução do código da função.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alguns dos benefícios que temos com esse tipo de função são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por conta do determinismo, é fácil criar testes automatizados para funções puras, pois sabemos que o resultado para aquele conjunto de parâmetros é sempre o mesmo;&lt;/li&gt;
&lt;li&gt;Por conta do determinismo, podemos aplicar otimizações de execução, salvando o resultado da execução com determinado conjunto de parâmetros, de forma a não precisar executar o código uma segunda vez para obter o resultado correto;&lt;/li&gt;
&lt;li&gt;Por conta da ausência de efeitos colaterais, podemos executar o mesmo código paralelamente em diferentes partes da aplicação sem o receio de que uma execução interfira com a outra.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Funções puras são extremamente simples em conceito, mas é muito fácil não seguir suas restrições.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A função pintar recebe 2 parâmetros: "casa" e "cor",&lt;/span&gt;
&lt;span class="c1"&gt;// modifica a cor da casa atribuindo a ela o valor&lt;/span&gt;
&lt;span class="c1"&gt;// recebido no parâmetro "cor" e retorna a casa.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pintar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;branca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;pintar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;azul&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "azul" }&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "azul" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, estamos &lt;em&gt;modificando&lt;/em&gt; a propriedade &lt;code&gt;cor&lt;/code&gt; da variável &lt;code&gt;casa&lt;/code&gt;. Como estamos modificando o valor da variável, estamos criando um efeito colateral da execução do nosso código. Se outro ponto da aplicação estiver executando um código utilizando, também, a mesma variável &lt;code&gt;casa&lt;/code&gt;, podemos ter algum comportamento estranho e muito difícil de reproduzir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A função pintar recebe 2 parâmetros: "casa" e "cor",&lt;/span&gt;
&lt;span class="c1"&gt;// cria uma nova casa com todas as propriedades do parâmetro&lt;/span&gt;
&lt;span class="c1"&gt;// "casa", sobrescrevendo o valor da propriedade "cor" com&lt;/span&gt;
&lt;span class="c1"&gt;// o valor do parâmetro "cor" e retorna a nova casa.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pintar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;novaCasa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;novaCasa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;branca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;pintar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;azul&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "azul" }&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "branca" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa vez, os valores do parâmetro &lt;code&gt;casa&lt;/code&gt; não foram alterados. Ao invés disso, nós copiamos as propriedades da variável e criamos uma nova variável sobrescrevendo o valor da propriedade &lt;code&gt;cor&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador de expansão
&lt;/h2&gt;

&lt;p&gt;Antes de finalizarmos, deixe eu explicar o que está acontecendo na linha &lt;code&gt;const novaCasa = { ...casa, cor };&lt;/code&gt;. O símbolo &lt;code&gt;...&lt;/code&gt; é um operador chamado de &lt;code&gt;spread&lt;/code&gt;, cuja tradução é "expansão". No contexto em que ele está sendo usado, ele "expande" o objeto &lt;code&gt;casa&lt;/code&gt;, expondo todas as suas propriedades. Outra coisa que deve parecer estranha é que eu coloquei tanto &lt;code&gt;...casa&lt;/code&gt; quanto &lt;code&gt;cor&lt;/code&gt; sem determinar seus valores. Isso acontece por que, quando uma propriedade tem o mesmo valor de uma variável, os interpretadores de JavaScript conseguem inferir que o valor da propriedade será o valor da variável. Observe os exemplos abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Os dois exemplos abaixo criam um objeto&lt;/span&gt;
&lt;span class="c1"&gt;// com as mesmas propriedades e com o mesmo&lt;/span&gt;
&lt;span class="c1"&gt;// valor em cada uma das propriedades.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;branca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "branca" }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;material&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;andares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;branca&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outraCasa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;material&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;outraCasa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "branca" }&lt;/span&gt;

&lt;span class="c1"&gt;// Os dois exemplos abaixo criam cópias&lt;/span&gt;
&lt;span class="c1"&gt;// do objeto "casa" definido anteriormente.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cópiaDaCasa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;material&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;cópiaDaCasa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "branca" }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outraCópiaDaCasa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;casa&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;outraCópiaDaCasa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 1, cor: "branca" }&lt;/span&gt;

&lt;span class="c1"&gt;// Os dois exemplos abaixo criam cópias&lt;/span&gt;
&lt;span class="c1"&gt;// do objeto casa, mas sobrescrevem a propriedade&lt;/span&gt;
&lt;span class="c1"&gt;// andares.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casaMaisAlta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;material&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;casaMaisAlta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 2, cor: "branca" }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outraCasaMaisAlta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;outraCasaMaisAlta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: "tijolo", andares: 2, cor: "branca" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando criamos um objeto, podemos definir a mesma propriedade duas vezes na declaração, porém o objeto não pode ter duas propriedades diferentes com o mesmo nome. Toda propriedade deve ter um nome único. O que os interpretadores fazem quando definimos duas propriedades com o mesmo nome é sobrescrever a primeira propriedade declarada pela segunda. Na prática, a última propriedade declarada com cada nome terá o seu valor no objeto criado. Por isso, quando expandimos um objeto (expondo as suas propriedades na criação de um outro objeto) e declaramos uma propriedade que já existia no objeto expandido com um valor diferente, estamos sobrescrevendo o valor daquela propriedade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Parabéns! Você deu mais um importante passo na compreensão dos elementos básicos para escrever aplicações em JavaScript!&lt;/p&gt;

&lt;p&gt;Neste texto, exploramos as diferentes formas de declarar uma função. Vimos, também, o que são operadores. Aprendemos o que são funções puras e quais são seus benefícios. Por fim, aprendemos sobre o operador de expansão e como podemos criar novos objetos a partir de outros objetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Funções
&lt;/h3&gt;

&lt;p&gt;Podem ser declaradas com a palavra &lt;code&gt;function&lt;/code&gt; ou com a sintaxe de flecha. Utilizando a sintaxe de flecha, podemos omitir as chaves (&lt;code&gt;{&lt;/code&gt; e &lt;code&gt;}&lt;/code&gt;) e a palavra &lt;code&gt;return&lt;/code&gt; (retorna) caso a única expressão do corpo da função seja a expressão de retorno.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operadores
&lt;/h3&gt;

&lt;p&gt;São como funções que não usam os parênteses (&lt;code&gt;(&lt;/code&gt; e &lt;code&gt;)&lt;/code&gt;) para delimitar onde estão seus parâmetros, mas utilizam ou o que vem imediatamente após como parâmetro (como no caso do operador lógico de negação &lt;code&gt;!&lt;/code&gt;) ou o que vem imediatamente antes e imediatamente após (como no caso do operador de adição &lt;code&gt;+&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;No caso dos operadores lógicos, nós testamos todos os valores possíveis para cada operador.&lt;/p&gt;

&lt;h3&gt;
  
  
  Funções puras
&lt;/h3&gt;

&lt;p&gt;São funções determinísticas, ou seja, dado um conjunto de parâmetros, sempre retorna o mesmo valor, e que não têm efeitos colaterais. Isso as torna mais fáceis de serem testadas e evita problemas de execução paralela.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operador de expansão
&lt;/h3&gt;

&lt;p&gt;Nos permite expandir as propriedades de um objeto para que seja mais simples de criar uma cópia dele.&lt;/p&gt;

&lt;p&gt;Da mesma forma que no último texto, é importante que todos os conceitos tratados nesse texto fiquem claros. A releitura ajuda a fixar esses conceitos. Caso algum conceito não esteja bem explicado, por favor entre em contato por qualquer forma listada na página Contato no menu.&lt;/p&gt;

&lt;p&gt;No próximo texto iremos aprender sobre listas e controle de fluxo!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introdução à programação em JS - elementos básicos parte 1</title>
      <dc:creator>Bruno Moutinho</dc:creator>
      <pubDate>Fri, 08 Oct 2021 16:17:57 +0000</pubDate>
      <link>https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-1-lf4</link>
      <guid>https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-1-lf4</guid>
      <description>&lt;p&gt;Programação, para muitos que não estudaram o tópico, pode parecer extremamente complexo. Entretanto, todo programa é construído a partir de conceitos muito simples. A combinação desses elementos gera os mais diversos resultados e, assim, conseguimos criar os diferentes programas que conhecemos.&lt;/p&gt;

&lt;p&gt;Assim, quero dar uma pequena introdução sobre programação utilizando a linguagem JavaScript, que é uma das linguagens de programação mais utilizadas hoje em dia.&lt;/p&gt;




&lt;p&gt;Neste texto, vou falar sobre os tipos de dados básicos que existem em JavaScript e como utilizar variáveis. Caso não tenha entendido algum dos termos que utilizei, siga lendo, pois tentarei aprofundar todos eles ao longo do texto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Índice da série:
&lt;/h2&gt;

&lt;p&gt;Introdução à programação em JS - elementos básicos parte 1 (você está aqui)&lt;br&gt;
&lt;a href="https://dev.to/brunomoutinho/introducao-a-programacao-em-js-elementos-basicos-parte-2-530o"&gt;Introdução à programação em JS - elementos básicos parte 2&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Tipos de dados
&lt;/h2&gt;

&lt;p&gt;Dados são quaisquer informações. Tipos de dados são grupos de dados que compartilham características em comum. Cada tipo de dados representa algum conceito abstrato.&lt;/p&gt;

&lt;p&gt;Em JavaScript, temos os tipos de dados primitivos e os tipos de dados estruturais.&lt;/p&gt;

&lt;p&gt;Os tipos de dados primitivos são tipos que não podem ser modificados, enquanto os tipos estruturais podem. Uma explicação mais clara sobre esse conceito será discutida nos exemplos.&lt;/p&gt;

&lt;p&gt;Os tipos de dados &lt;em&gt;primitivos&lt;/em&gt; são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;undefined&lt;/code&gt; - tradução: indefinido. Esse tipo de dados indica que algum valor não foi definido em algum momento. Por convenção, esse valor acontece quando, não intencionalmente, um valor não foi inicializado;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;null&lt;/code&gt; - tradução: nulo. Esse tipo de dados indica que algum valor foi inicializado com um valor inexistente. Assim como indefinido, indica que não existe um valor naquele espaço, mas, ao contrário de indefinido, isso é intencional.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Boolean&lt;/code&gt; - tradução: booleano. Esses são valores lógicos de verdadeiro (&lt;code&gt;true&lt;/code&gt;) ou falso (&lt;code&gt;false&lt;/code&gt;). O nome deriva de Boole (sobrenome do matemático George Boole) que criou um sistema baseado nesses dois valores lógicos e conectores lógicos (como "e", "ou", "não"). Não entraremos a fundo nesse tópico no momento. Por ora, memorize os valores possíveis: &lt;code&gt;true&lt;/code&gt; (verdadeiro) e &lt;code&gt;false&lt;/code&gt; (falso).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number&lt;/code&gt; - tradução: número. Números são quaisquer números reais. Valores como &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;0,5&lt;/code&gt;, &lt;code&gt;3,14&lt;/code&gt;, &lt;code&gt;42&lt;/code&gt;, ficam nessa categoria.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BigInt&lt;/code&gt; - contração de Big Integer; tradução - inteiro grande. Eventualmente, nossa aplicação pode precisar lidar com valores matemáticos muito grandes. Para indicar para o computador que precisamos de mais espaço de memória para usar esses valores, podemos utilizar esse tipo de dados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; - tradução: texto. Apesar de "texto" não ser a tradução literal da palavra &lt;em&gt;string&lt;/em&gt;, é a tradução que faz sentido. A tradução literal de &lt;em&gt;string&lt;/em&gt; seria "fio" ou "corda". Esse nome existe por que a representação em memória do computador de um texto é de um "fio" ou "corda" de caracteres. Um caractere, em várias linguagens de programação, é um tipo de dados básico, enquanto o texto deriva desse tipo de dados. Quando se junta vários caracteres, se tem um fio de caracteres, ou &lt;em&gt;string&lt;/em&gt;. Ainda assim, é possível ter uma &lt;em&gt;string&lt;/em&gt; vazia (&lt;code&gt;""&lt;/code&gt;) ou uma &lt;em&gt;string&lt;/em&gt; de um só caractere (&lt;code&gt;"a"&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Symbol&lt;/code&gt; - tradução: símbolo. Símbolos são valores únicos e randômicos. Toda vez que um símbolo é criado, ele será diferente de outros símbolos já criados. Seus usos comuns serão discutidos em um post futuro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os tipos &lt;em&gt;estruturais&lt;/em&gt; são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; - tradução: objeto. Objetos são como objetos do mundo real. Se pensamos em uma bola, ela vai ter propriedades, como diâmetro, material, cor, peso... Objetos podem ter essas propriedades e podemos dar um valor para cada uma delas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Function&lt;/code&gt; - tradução: função. São procedimentos ou métodos que guardam uma série de passos para que sejam executados quando for conveniente. Ainda não vou aprofundar este tema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A grande diferença entre tipos primitivos e tipos estruturais é que os tipos primitivos são &lt;em&gt;imutáveis&lt;/em&gt;, enquanto os tipos estruturais apenas têm uma referência imutável. Isso significa que não podemos mudar o valor do número &lt;code&gt;1&lt;/code&gt;, por exemplo, ou da letra &lt;code&gt;A&lt;/code&gt;. Tipos estruturais, entretanto, podem ter seu valor modificado, mas continuarão sendo referenciados pelo mesmo endereço de memória. É como se eu fizesse uma reforma na minha casa: alguma coisa mudou na casa, mas ela ainda fica na mesma rua e número.&lt;/p&gt;
&lt;h2&gt;
  
  
  Variáveis
&lt;/h2&gt;

&lt;p&gt;Variáveis são como caixas. Em JavaScript elas podem "guardar" quaisquer valores - um de cada vez, não interessando o tipo que está sendo guardado. Assim, o valor pode ser utilizado em diferentes partes do programa.&lt;/p&gt;

&lt;p&gt;Quando guardamos um valor em uma variável, dizemos que a variável foi &lt;em&gt;inicializada&lt;/em&gt; com o valor escolhido. Assim, toda vez que fizermos referência a essa variável, receberemos o valor que atribuímos a ela.&lt;/p&gt;

&lt;p&gt;Como o nome sugere, o valor de uma variável pode mudar durante a execução do programa. Não devemos confundir essa mudança de valor com uma alteração do valor dos tipos primitivos, que, como definimos anteriormente, não podem ser alterados.&lt;/p&gt;

&lt;p&gt;Na prática, todo valor de um tipo primitivo que for usado no programa é guardado em uma posição de memória. Se eu inicializo uma variável com um valor primitivo, eu vou alocar um espaço da memória do computador para esse valor e a variável receberá esse endereço - dizemos que a variável &lt;em&gt;aponta&lt;/em&gt; para esse endereço ou valor.&lt;/p&gt;

&lt;p&gt;Se duas variáveis são inicializadas com o valor &lt;code&gt;0&lt;/code&gt;, por exemplo, as duas apontarão para o mesmo endereço de memória, que guarda o valor primitivo &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se uma dessas variáveis posteriormente &lt;em&gt;recebe&lt;/em&gt; o valor &lt;code&gt;1&lt;/code&gt; (aqui, &lt;em&gt;recebe&lt;/em&gt; indica que estamos atribuindo à variável um valor diferente), ela deixa de apontar para o endereço de memória que guarda o valor &lt;code&gt;0&lt;/code&gt;, e passa a apontar para o endereço de memória que guarda o valor &lt;code&gt;1&lt;/code&gt;. A outra variável segue apontando para o mesmo endereço onde o valor &lt;code&gt;0&lt;/code&gt; se encontra.&lt;/p&gt;

&lt;p&gt;Quando uma variável é inicializada com um tipo estrutural (objeto ou função), mesmo que os valores mudem, ela ainda apontará para o mesmo endereço de memória.&lt;/p&gt;

&lt;p&gt;Citei anteriormente o exemplo de uma casa em um endereço. Digamos que a casa tenha as propriedades &lt;code&gt;material&lt;/code&gt; , com o valor &lt;code&gt;tijolo&lt;/code&gt;, &lt;code&gt;andares&lt;/code&gt;, com o valor &lt;code&gt;1&lt;/code&gt;, e &lt;code&gt;cor&lt;/code&gt; com o valor &lt;code&gt;amarela&lt;/code&gt;. No caso da reforma feita, se eu pintasse as paredes externas de azul, poderia expressar isso modificando o valor da propriedade &lt;code&gt;cor&lt;/code&gt; para &lt;code&gt;azul&lt;/code&gt;. A variável que guarda esse objeto vai continuar apontando para o mesmo endereço de memória, mas o conteúdo daquele espaço vai ser diferente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Bom, até o momento procurei passar bastante da teoria de como tipos (primitivos e estruturais) e variáveis funcionam, mas pode ser muito complicado entender todos esses conceitos sem exemplos. Aqui vou dar exemplos e você pode reproduzir cada um deles no seu computador. Para que seja possível executar o código, você deve abrir as ferramentas de desenvolvedor no seu navegador apertando a tecla &lt;code&gt;f12&lt;/code&gt; do seu teclado. Então, procure pela aba &lt;code&gt;Console&lt;/code&gt;. Caso tudo carregar da forma correta, ela se parecerá com isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sXLq5oBQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/451f7319-2d48-4b45-a5b0-fffd3f87ae1c/Untitled.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sXLq5oBQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s3-us-west-2.amazonaws.com/secure.notion-static.com/451f7319-2d48-4b45-a5b0-fffd3f87ae1c/Untitled.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/451f7319-2d48-4b45-a5b0-fffd3f87ae1c/Untitled.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É possível que existam mensagens na área inferior, mas não se preocupe. Ao lado da seta (&lt;code&gt;&amp;gt;&lt;/code&gt;), você pode clicar e começar a digitar (ou colar) comandos em JavaScript que serão executados.&lt;/p&gt;

&lt;p&gt;Ainda antes de começarmos, sempre que vocês virem os símbolos &lt;code&gt;//&lt;/code&gt; no código, isso indica que tudo o que está à direita deles, é um comentário e será ignorado. Eu utilizarei isso para ajudar na compreensão de tudo que estamos fazendo.  Após cada linha que não estiver comentada, a primeira linha comentada será o retorno que o interpretador de JavaScript irá retornar. &lt;/p&gt;

&lt;p&gt;Em primeiro lugar, vamos testar usar valores de tipos primitivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vamos começar utilizando Números! Escolha um&lt;/span&gt;
&lt;span class="c1"&gt;// número e o digite ao lado do símbolo &amp;gt; no console:&lt;/span&gt;
&lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="c1"&gt;// 42&lt;/span&gt;
&lt;span class="c1"&gt;// Você verá que o console imprimirá uma nova linha&lt;/span&gt;
&lt;span class="c1"&gt;// na sequência com o mesmo valor que foi colocado&lt;/span&gt;
&lt;span class="c1"&gt;// como um comentário acima.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Toda vez que escrevemos algo no console, o interpretador do JavaScript tentará avaliar o que foi digitado. Esses comandos são chamados de &lt;em&gt;expressões&lt;/em&gt;. Uma expressão, em JavaScript, pode ser um valor de um tipo primitivo, um valor de um tipo estrutural, uma variável, ou uma combinação entre eles (lembrando que funções também são um tipo estrutural que não discutimos ainda). Quando a expressão é interpretada, ela retornará um resultado, que, no caso de colocarmos um valor primitivo, será o próprio valor primitivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vamos testar colocar outros valores primitivos que&lt;/span&gt;
&lt;span class="c1"&gt;// aprendemos e ver o resultado:&lt;/span&gt;
&lt;span class="c1"&gt;// Textos, em JavaScript, podem ser declarados de&lt;/span&gt;
&lt;span class="c1"&gt;// duas formas:&lt;/span&gt;
&lt;span class="c1"&gt;// Usando aspas simples:&lt;/span&gt;
&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// "Javascript"&lt;/span&gt;
&lt;span class="c1"&gt;// Usando aspas duplas:&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;// "Javascript"&lt;/span&gt;

&lt;span class="c1"&gt;// Booleanos:&lt;/span&gt;
&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="c1"&gt;// false&lt;/span&gt;

&lt;span class="c1"&gt;// Nulo:&lt;/span&gt;
&lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="c1"&gt;// null&lt;/span&gt;

&lt;span class="c1"&gt;// Indefinido:&lt;/span&gt;
&lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="c1"&gt;// Inteiros grandes também podem ser declarados de&lt;/span&gt;
&lt;span class="c1"&gt;// duas formas:&lt;/span&gt;
&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;
&lt;span class="c1"&gt;// 123456789n&lt;/span&gt;
&lt;span class="nx"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123456789&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// 123456789n&lt;/span&gt;

&lt;span class="c1"&gt;// Símbolo:&lt;/span&gt;
&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// Symbol()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos ter expressões com tipos estruturais, conforme falamos antes. Vamos testar com objetos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Assim como textos são identificados com aspas simples&lt;/span&gt;
&lt;span class="c1"&gt;// ou duplas e inteiros grandes podem ser identificados&lt;/span&gt;
&lt;span class="c1"&gt;// pelo n no final ou com a função BigInt(), objetos são&lt;/span&gt;
&lt;span class="c1"&gt;// declarados de uma forma específica:&lt;/span&gt;
&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; {}&lt;/span&gt;
&lt;span class="c1"&gt;// Você verá que o retorno dessa expressão será diferente&lt;/span&gt;
&lt;span class="c1"&gt;// de outros retornos. A grande diferença aqui é a seta&lt;/span&gt;
&lt;span class="c1"&gt;// que tem antes do retorno {}. Essa seta indica que você&lt;/span&gt;
&lt;span class="c1"&gt;// pode clicar ali e ver alguma nova informação. No caso &lt;/span&gt;
&lt;span class="c1"&gt;// de objetos, você poderá ver propriedades e, nesse caso &lt;/span&gt;
&lt;span class="c1"&gt;// em particular, a única propriedade disponível é a&lt;/span&gt;
&lt;span class="c1"&gt;// propriedade __proto__: Object. A propriedade __proto__&lt;/span&gt;
&lt;span class="c1"&gt;// identifica o *protótipo* do objeto. Trataremos disso&lt;/span&gt;
&lt;span class="c1"&gt;// mais pra frente.&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;amarela&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; { material: 'tijolo', andares: 1, cor: 'amarela' }&lt;/span&gt;
&lt;span class="c1"&gt;// Clicando na seta nesse exemplo, veremos cada uma das&lt;/span&gt;
&lt;span class="c1"&gt;// propriedades que listamos assim como a propriedade&lt;/span&gt;
&lt;span class="c1"&gt;// __proto__.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando queremos usar um mesmo valor várias vezes em nosso programa, é interessante utilizarmos as variáveis. Em JavaScript, temos 3 formas de criar (ou declarar) uma variável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ao executar cada uma dessas linhas, o retorno será o&lt;/span&gt;
&lt;span class="c1"&gt;// valor undefined. Sempre que uma variável é declarada,&lt;/span&gt;
&lt;span class="c1"&gt;// a expressão resolve para o valor indefinido (undefined).&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;minhaVariavel&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;outraVariavel&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;span class="c1"&gt;// Uma variável declarada com a palavra const não pode&lt;/span&gt;
&lt;span class="c1"&gt;// ser declarada sem um valor explícito, então&lt;/span&gt;
&lt;span class="c1"&gt;// inicializaremos a variável abaixo com o valor&lt;/span&gt;
&lt;span class="c1"&gt;// null&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;maisUmaVariavel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A palavra &lt;code&gt;var&lt;/code&gt; é uma contração da palavra &lt;code&gt;variable&lt;/code&gt;, cuja tradução é "variável". Até o ano de 2015, essa era a única forma de se declarar uma variável em JavaScript. Em 2015, foram introduzidas as palavras &lt;code&gt;let&lt;/code&gt;, que pode ser traduzida como "dado", do verbo "dar", e &lt;code&gt;const&lt;/code&gt;, que é uma contração de &lt;code&gt;constant&lt;/code&gt;, cuja tradução é "constante". A &lt;code&gt;const&lt;/code&gt; é chamada assim pois é a única cujo endereço apontado não pode ser alterado, ou seja, se a variável aponta para um valor primitivo, ela não pode ser alterada. Caso a variável aponte para um valor estrutural, o conteúdo do objeto ou da função pode ser alterado, mas não podemos ter uma nova atribuição de valor à variável.&lt;/p&gt;

&lt;p&gt;Como mostramos antes, quando uma variável tem um valor primitivo e nós atribuímos outro valor para ela, o endereço para o qual a variável aponta, muda. Vamos ver o que isso significa na prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// No exemplo acima, criamos as variáveis:&lt;/span&gt;
&lt;span class="c1"&gt;// * minhaVariavel, utilizando a palavra "var"&lt;/span&gt;
&lt;span class="c1"&gt;//   (que é uma contração de "variable", cuja&lt;/span&gt;
&lt;span class="c1"&gt;//   tradução é "variável";&lt;/span&gt;
&lt;span class="c1"&gt;// * outraVariavel, utilizando a palavra "let"&lt;/span&gt;
&lt;span class="c1"&gt;//  (cuja tradução mais próxima, acredito,&lt;/span&gt;
&lt;span class="c1"&gt;//   seja "dado", do verbo "dar"); e&lt;/span&gt;
&lt;span class="c1"&gt;// * maisUmaVariavel, utilizando a palavra "const"&lt;/span&gt;
&lt;span class="c1"&gt;//   (que é uma contração de "constant",&lt;/span&gt;
&lt;span class="c1"&gt;//   cuja tradução é "constante").&lt;/span&gt;
&lt;span class="c1"&gt;// Agora, iremos tentar modificar o valor de cada&lt;/span&gt;
&lt;span class="c1"&gt;// uma delas:&lt;/span&gt;
&lt;span class="nx"&gt;minhaVariavel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="c1"&gt;// Perceba que, quando a variável recebe um novo&lt;/span&gt;
&lt;span class="c1"&gt;// valor, o resultado da expressão é o valor que&lt;/span&gt;
&lt;span class="c1"&gt;// foi atribuído à variável, e não mais indefinido.&lt;/span&gt;

&lt;span class="nx"&gt;outraVariavel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "JavaScript"&lt;/span&gt;

&lt;span class="c1"&gt;// Não se assuste! A expressão abaixo irá disparar&lt;/span&gt;
&lt;span class="c1"&gt;// um erro. Isso acontece por que não é permitido&lt;/span&gt;
&lt;span class="c1"&gt;// alterar o endereço para o qual uma variável&lt;/span&gt;
&lt;span class="c1"&gt;// inicializada com const aponta.&lt;/span&gt;
&lt;span class="nx"&gt;maisUmaVariavel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; Uncaught TypeError: Assignment to constant variable.&lt;/span&gt;
&lt;span class="c1"&gt;// A tradução do erro acima é:&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;gt; Erro de tipo não capturado: Atribuição a variável&lt;/span&gt;
&lt;span class="c1"&gt;// constante.&lt;/span&gt;

&lt;span class="c1"&gt;// Agora veja a diferença se criarmos uma variável&lt;/span&gt;
&lt;span class="c1"&gt;// com o exemplo da casa que citamos:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;casa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;material&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tijolo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;andares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;amarela&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="c1"&gt;// Quando queremos ver o valor de uma propriedade&lt;/span&gt;
&lt;span class="c1"&gt;// de um objeto, podemos escrever isso de duas&lt;/span&gt;
&lt;span class="c1"&gt;// maneiras:&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "amarela"&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// "amarela"&lt;/span&gt;

&lt;span class="c1"&gt;// Na segunda forma, utilizamos um texto (ou string)&lt;/span&gt;
&lt;span class="c1"&gt;// para acessar a propriedade do objeto.&lt;/span&gt;
&lt;span class="c1"&gt;// O resultado das duas formas de acessar propriedades&lt;/span&gt;
&lt;span class="c1"&gt;// de um objeto é exatamente o mesmo.&lt;/span&gt;
&lt;span class="c1"&gt;// O caso onde usamos um texto pode ser usado quando&lt;/span&gt;
&lt;span class="c1"&gt;// o nome da propriedade contém caracteres que podem&lt;/span&gt;
&lt;span class="c1"&gt;// ser confundidos pelo interpretador de código (como&lt;/span&gt;
&lt;span class="c1"&gt;// um ponto, um hífen) ou ainda quando, no momento que&lt;/span&gt;
&lt;span class="c1"&gt;// estamos escrevendo o código, não sabemos qual o nome&lt;/span&gt;
&lt;span class="c1"&gt;// do campo que queremos acessar.&lt;/span&gt;
&lt;span class="c1"&gt;// No caso de não sabermos o valor previamente, ao&lt;/span&gt;
&lt;span class="c1"&gt;// invés de colocar o valor do texto diretamente,&lt;/span&gt;
&lt;span class="c1"&gt;// utilizamos uma variável, por exemplo:&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;propriedade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propriedade&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// "amarela"&lt;/span&gt;

&lt;span class="c1"&gt;// A expressão acima é equivalente às duas formas de&lt;/span&gt;
&lt;span class="c1"&gt;// acesso que citamos antes, mas, se mudamos o valor&lt;/span&gt;
&lt;span class="c1"&gt;// da variável propriedade, podemos acessar uma&lt;/span&gt;
&lt;span class="c1"&gt;// propriedade diferente:&lt;/span&gt;
&lt;span class="nx"&gt;propriedade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;material&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "material"&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propriedade&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// "tijolo"&lt;/span&gt;

&lt;span class="c1"&gt;// Vamos tentar, então, modificar a propriedade "cor":&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;azul&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "azul"&lt;/span&gt;

&lt;span class="c1"&gt;// Perceba que, dessa vez, não aconteceu erro nenhum!&lt;/span&gt;
&lt;span class="c1"&gt;// Poderíamos, sem problema algum, utilizar as outras&lt;/span&gt;
&lt;span class="c1"&gt;// formas de acesso da propriedade:&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;verde&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "verde"&lt;/span&gt;
&lt;span class="nx"&gt;propriedade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "cor"&lt;/span&gt;
&lt;span class="nx"&gt;casa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propriedade&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rosa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// "rosa"&lt;/span&gt;

&lt;span class="c1"&gt;// Como discutimos antes, os tipos estruturais podem&lt;/span&gt;
&lt;span class="c1"&gt;// ser alterados, mas seu endereço continua o mesmo.&lt;/span&gt;
&lt;span class="c1"&gt;// Por isso é possível alterar propriedades de objetos&lt;/span&gt;
&lt;span class="c1"&gt;// que foram declarados com a palavra const.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não fizemos nenhum teste apenas com as funções até o momento. Vamos falar sobre funções em mais detalhes em um próximo texto, mas podemos mostrar qual o modo padrão de se definir uma função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A expressão abaixo irá criar uma função com o nome&lt;/span&gt;
&lt;span class="c1"&gt;// minhaFuncao, que pode ser executada sempre que&lt;/span&gt;
&lt;span class="c1"&gt;// quisermos.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="c1"&gt;// Temos aqui 4 partes na declaração:&lt;/span&gt;
&lt;span class="c1"&gt;// A palavra function, que indica que vamos declarar uma&lt;/span&gt;
&lt;span class="c1"&gt;//   função;&lt;/span&gt;
&lt;span class="c1"&gt;// O nome da função, que é opcional (podemos criar uma&lt;/span&gt;
&lt;span class="c1"&gt;//   função sem nome);&lt;/span&gt;
&lt;span class="c1"&gt;// Os parênteses indicam o espaço para parâmetros; e&lt;/span&gt;
&lt;span class="c1"&gt;// As chaves delimitam o corpo da função, ou a sequência&lt;/span&gt;
&lt;span class="c1"&gt;//   de expressões que serão executadas.&lt;/span&gt;
&lt;span class="c1"&gt;// Esse caso em especial não executa expressões.&lt;/span&gt;
&lt;span class="c1"&gt;// Podemos executar a expressão assim:&lt;/span&gt;
&lt;span class="nx"&gt;minhaFuncao&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="c1"&gt;// Nesse caso, o retorno da expressão será indefinido&lt;/span&gt;
&lt;span class="c1"&gt;// (undefined), já que não declaramos explicitamente o&lt;/span&gt;
&lt;span class="c1"&gt;// retorno da função.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Parabéns! Você acabou de dar o primeiro passo para aprender a programar!&lt;/p&gt;

&lt;p&gt;Nesse texto, aprendemos que existem tipos de dados que podem ser representados em JavaScript. Esses tipos estão divididos em 2 grupos: &lt;em&gt;primitivos&lt;/em&gt; e &lt;em&gt;estruturais&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Os tipos primitivos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;undefined&lt;/code&gt; - para indicar a ausência não intencional de valor;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;null&lt;/code&gt; - para indicar a ausência intencional de valor;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Boolean&lt;/code&gt; - valor lógico, podendo ser verdadeiro (&lt;code&gt;true&lt;/code&gt;) ou falso (&lt;code&gt;false&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number&lt;/code&gt; - um número real;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BigInt&lt;/code&gt; - um número inteiro muito grande;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; - um texto; e&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Symbol&lt;/code&gt; - um valor único;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os tipos estruturais são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; - estrutura que guarda mais de um valor, cada um em uma propriedade; e&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Function&lt;/code&gt; - bloco de código que pode ser executado quando conveniente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aprendemos também que podemos usar variáveis para guardar quaisquer valores que possam ser representados pelos tipos citados. Essas variáveis podem ser criadas usando uma de 3 palavras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;var&lt;/code&gt; - declara uma variável que pode ter o endereço a que ela se refere alterado;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt; - declara uma variável que pode ter o endereço a que ela se refere alterado; e&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;const&lt;/code&gt; - declara uma variável cujo endereço não pode ser alterado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nós vimos, também, que determinadas expressões podem gerar erros de execução, como quando tentamos atribuir um valor diferente a uma variável declarada com a palavra &lt;code&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É muita coisa!&lt;/p&gt;

&lt;p&gt;Todos os conceitos que tratamos nesse texto são conceitos fundamentais e entender eles plenamente vai ajudar você conforme nós avançarmos em tópicos mais avançados. Reler o texto pode ajudar a desenvolver essa compreensão e a criar a relação entre os termos em português e inglês. Caso o texto não tenha sido claro em algum ponto, envie uma mensagem por alguma das formas de contato na página Contato no menu.&lt;/p&gt;

&lt;p&gt;Nos próximos textos iremos explorar mais as expressões do JavaScript assim como criar funções simples!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
