<?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: Lais Frigério</title>
    <description>The latest articles on DEV Community by Lais Frigério (@laisfrigerio).</description>
    <link>https://dev.to/laisfrigerio</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1034364%2F4c0279d3-4446-4441-a250-010d8f8b4cb9.png</url>
      <title>DEV Community: Lais Frigério</title>
      <link>https://dev.to/laisfrigerio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/laisfrigerio"/>
    <language>en</language>
    <item>
      <title>Programação funcional e a imutabilidade: 4 maneiras de clonar objetos no JavaScript</title>
      <dc:creator>Lais Frigério</dc:creator>
      <pubDate>Mon, 10 Apr 2023 12:33:02 +0000</pubDate>
      <link>https://dev.to/laisfrigerio/programacao-funcional-e-a-imutabilidade-4-maneiras-de-clonar-objetos-no-javascript-1h8l</link>
      <guid>https://dev.to/laisfrigerio/programacao-funcional-e-a-imutabilidade-4-maneiras-de-clonar-objetos-no-javascript-1h8l</guid>
      <description>&lt;p&gt;A imutabilidade é um princípio da Programação Funcional que se baseia em não alterar o estado dos dados.&lt;/p&gt;

&lt;p&gt;No entanto, no JavaScript, as variáveis não-primitivas, tais como objetos e arrays, podem ser modificadas, mesmo quando declaradas utilizando a palavra reservada &lt;code&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E, para aplicar a imutabilidade usando a linguagem de programação JavaScript, vamos aprender 4 maneiras de clonar objetos ao invés de modificá-los.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operador Spread
&lt;/h2&gt;

&lt;p&gt;Com este operador podemos copiar o conteúdo de um objeto ou array para uma nova variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2&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;person1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "John", role: { name: "Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas este operador usa uma técnica chamada &lt;strong&gt;Shallow cloning&lt;/strong&gt; que basicamente clona apenas a raiz do seu objeto para poupar processamento, e para todos os subs objetos é usado a referência do objeto principal.&lt;/p&gt;

&lt;p&gt;Isso significa que, ao alterar a propriedade &lt;code&gt;role.name&lt;/code&gt; do objeto &lt;code&gt;person2&lt;/code&gt; também vai refletir no objeto &lt;code&gt;person1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Associate Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Associate Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "John", role: { name: "Associate Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para resolver isso podemos usar uma técnica chamada &lt;strong&gt;Deep cloning&lt;/strong&gt; que consiste em clonar tanto o objeto raiz quanto os subs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2&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;person1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&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;person1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Associate Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "John", role: { name: "Associate Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Object.assign
&lt;/h2&gt;

&lt;p&gt;Com este método podemos copiar ou mesclar o conteúdo de um ou mais objetos para uma nova variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "John", role: { name: "Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas este método também usa a técnica &lt;strong&gt;Shallow cloning&lt;/strong&gt;. Portanto, é recomendado que este método seja utilizado para clonar objetos que não tenham objetos aninhados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Object.freeze
&lt;/h2&gt;

&lt;p&gt;Já este método, além de copiar o conteúdo de um objeto para uma nova variável, também deixa as propriedades congeladas, ou seja, as propriedades não podem ser modificadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;freeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas este método também usa a técnica &lt;strong&gt;Shallow cloning&lt;/strong&gt;. Portanto, mais uma vez é recomendado que este método seja utilizado apenas para clonar objetos que não tenham objetos aninhados.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSON.stringify e JSON.parse
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;JSON.stringify()&lt;/code&gt; transforma um objeto JSON em uma string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2Str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// '{"name":"Anne","role":{"name":"Software Engineer"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já o método &lt;code&gt;JSON.parse()&lt;/code&gt; transforma uma string JSON válida em um objeto e/ou array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anne&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2Str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// '{"name":"Anne","role":{"name":"Software Engineer"}}'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2Str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Associate Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "Anne", role: { name: "Software Engineer" }}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// { name: "John", role: { name: "Associate Software Engineer" }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o método &lt;code&gt;JSON.stringify()&lt;/code&gt; é acionado, ele transforma o conteúdo do objeto original em uma string JSON e as referências dos subs objetos são perdidas.&lt;/p&gt;

&lt;p&gt;E ao usar o método &lt;code&gt;JSON.parse()&lt;/code&gt; todo o objeto e/ou array é recriado em memória.&lt;/p&gt;

&lt;p&gt;Portanto, é possível clonar objetos e/ou arrays usando os métodos &lt;code&gt;stringify&lt;/code&gt; e &lt;code&gt;parse&lt;/code&gt;. Mas cuidado com seu uso pois pode ocasionar problemas de desempenho.&lt;/p&gt;




&lt;p&gt;Conhece mais maneiras de clonar objetos no JavaScript? Deixa nos comentários 👇&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Variáveis primitivas no JavaScript (string, number) são imutáveis</title>
      <dc:creator>Lais Frigério</dc:creator>
      <pubDate>Thu, 06 Apr 2023 22:27:15 +0000</pubDate>
      <link>https://dev.to/laisfrigerio/variaveis-primitivas-no-javascript-string-number-sao-imutaveis-5118</link>
      <guid>https://dev.to/laisfrigerio/variaveis-primitivas-no-javascript-string-number-sao-imutaveis-5118</guid>
      <description>&lt;p&gt;No JavaScript temos 2 tipos de variáveis:&lt;/p&gt;

&lt;p&gt;👉 Primitivas: String, Number, Boolean, Null, Undefined, BigInt e Symbol.&lt;/p&gt;

&lt;p&gt;👉 Não Primitivas: Objetos (objeto, array e função)&lt;/p&gt;

&lt;p&gt;As primitivas são consideradas IMUTÁVEIS. Isso mesmo: os tipos primitivos não são alterados 😮&lt;/p&gt;

&lt;p&gt;"Como assim, Lais??"&lt;/p&gt;

&lt;p&gt;As variáveis primitivas são alocadas em uma região da memória conhecidas como Stack - static allocation.&lt;/p&gt;

&lt;p&gt;Nesta área, quando uma variável é reatribuída, um novo espaço em memória é alocado para guardar o novo valor. O antigo valor não é mais utilizado e, na sequência, o Garbage Collector vai limpar o espaço em memória que não é mais referenciado.&lt;/p&gt;

&lt;p&gt;Por isso, as variáveis primitivas são consideradas IMUTÁVEIS!!&lt;/p&gt;

&lt;p&gt;E como eu posso testar este comportamento?&lt;/p&gt;

&lt;p&gt;Abre o navegador, vai na aba "Console", declara uma variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na sequência tente realizar a seguinte alteração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&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="s2"&gt;o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se fosse mutável, o seguinte console deveria retornar "bolo":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas como a variável é imutável, o seguinte console continua retornando "bola":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Li diversos artigos para entender esse comportamento. Vou indicar abaixo algumas leituras (todas em inglês):&lt;/p&gt;

&lt;p&gt;👉&lt;a href="https://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/"&gt;The Secret Life of JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://levelup.gitconnected.com/primitive-vs-non-primitive-value-in-javascript-82030928fd9"&gt;Primitive X Non-Primitive&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec"&gt;How  Memory works in JavaScript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tem algo a complementar sobre o assunto? Deixa nos comentários 👇&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Programação funcional: o que são funções puras, determinísticas e que não provocam efeitos colaterais</title>
      <dc:creator>Lais Frigério</dc:creator>
      <pubDate>Wed, 22 Mar 2023 11:38:27 +0000</pubDate>
      <link>https://dev.to/laisfrigerio/programacao-funcional-o-que-sao-funcoes-puras-deterministicas-e-que-nao-provocam-efeitos-colaterais-1i2g</link>
      <guid>https://dev.to/laisfrigerio/programacao-funcional-o-que-sao-funcoes-puras-deterministicas-e-que-nao-provocam-efeitos-colaterais-1i2g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Programação funcional&lt;/strong&gt; é um paradigma de construção e desenvolvimento de um software baseado em funções. Essas funções podem ser puras, que não provocam efeitos colaterais, ou impuras. &lt;/p&gt;

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

&lt;p&gt;É uma função que dada a mesma entrada (parâmetros), sempre retornará a mesma saída. Por conta disso, também são conhecidas como funções &lt;strong&gt;determinísticas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A função a seguir, responsável por somar 2 valores, sempre retorna a mesma saída quando a mesma entrada é informada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num2&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="nx"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;num2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;sum&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// sempre vai retornar 3&lt;/span&gt;
&lt;span class="nx"&gt;sum&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// sempre vai retornar 4&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, funções puras também são conhecidas por não provocarem &lt;strong&gt;mutação de estado&lt;/strong&gt; ou &lt;strong&gt;efeitos colaterais&lt;/strong&gt;. Isso significa que uma dependência externa (e.g variável) nunca pode ser alterada.&lt;/p&gt;

&lt;p&gt;A seguir, vamos conhecer alguns exemplos de funções impuras.&lt;/p&gt;

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

&lt;p&gt;Analise o seguinte trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;showMessage&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newMessage&lt;/span&gt;
  &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// o alerta exibe o texto 'Hello'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Hello&lt;/span&gt;

&lt;span class="nx"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bye, Bye&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// o alerta exibe o texto 'Bye, Bye'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Bye, Bye&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;showMessage&lt;/code&gt; provoca um efeito colateral ao alterar o estado de uma variável externa: &lt;code&gt;message&lt;/code&gt;. Logo, esta função é considerada impura.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se uma função tem dependência de uma ou mais variáveis que podem ser alteradas, a função é considerada impura.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Lembra que as funções puras retornam sempre o mesmo valor ao passar como parâmetro a mesma entrada?&lt;/p&gt;

&lt;p&gt;Pois bem, nas funções impuras isto não acontece.&lt;/p&gt;

&lt;p&gt;As funções impuras podem retornar diferentes valores para a mesma entrada. No exemplo a seguir, a função &lt;code&gt;multiplication&lt;/code&gt; pode retornar um valor diferente a cada chamada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;multiplicationTable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;multiplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&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="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;multiplicationTable&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso, a função &lt;code&gt;multiplication&lt;/code&gt; tem uma dependência externa, a variável &lt;code&gt;multiplicationTable&lt;/code&gt;. Ao chamar a função &lt;code&gt;multiplication&lt;/code&gt; passando o valor 5 como parâmetro o retorno é 10:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;multiplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// retorna 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas, se o valor da variável &lt;code&gt;multiplicationTable&lt;/code&gt; for alterado em outro momento no código, ao acionar a função &lt;code&gt;multiplication&lt;/code&gt; mesmo passando o valor 5 como parâmetro, a função vai ter um retorno diferente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;multiplicationTable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="nx"&gt;multiplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// retorna 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Um software construído com base no paradigma funcional é composto tanto por funções puras e impuras. O ideal é construir uma aplicação através do desenvolvimento do maior número possível de funções determinísticas.&lt;/p&gt;

&lt;p&gt;As funções puras são mais fáceis de testar, debugar e de fazer manutenção. Além do mais, é altamente recomendável que seu código tenha uma alta cobertura de casos de testes para funções puras.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>computerscience</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Criando um clone do Jogo Wordle com JavaScript e praticando TDD</title>
      <dc:creator>Lais Frigério</dc:creator>
      <pubDate>Mon, 27 Feb 2023 12:00:24 +0000</pubDate>
      <link>https://dev.to/laisfrigerio/criando-um-clone-do-jogo-wordle-com-javascript-e-praticando-tdd-2o57</link>
      <guid>https://dev.to/laisfrigerio/criando-um-clone-do-jogo-wordle-com-javascript-e-praticando-tdd-2o57</guid>
      <description>&lt;p&gt;A &lt;a href="https://www.alura.com.br/"&gt;Alura&lt;/a&gt; compõe o maior ecossistema de ensino em tecnologia do Brasil e tem como missão transformar vidas e carreiras. Hoje a plataforma consta com mais de 1200 cursos em diversas áreas de atuação, como back-end, front-end, mobile, dados, UX, entre outros. &lt;/p&gt;

&lt;p&gt;Ademais, a escola consta com uma grande gama de conteúdos gratuitos, como &lt;a href="https://www.alura.com.br/artigos"&gt;artigos&lt;/a&gt;, vídeos em seu canal do &lt;a href="https://www.youtube.com/c/Alura"&gt;Youtube&lt;/a&gt;, os &lt;a href="https://www.alura.com.br/podcasts"&gt;Podcasts&lt;/a&gt; (Hipsters Ponto Tech, Dev Sem Fronteiras), as &lt;a href="https://www.alura.com.br/imersao"&gt;Imersões Dev&lt;/a&gt;, o &lt;a href="https://techguide.sh/"&gt;Tech Guide&lt;/a&gt; (um guia de carreira para se transformar em um profissional em T) e o &lt;a href="https://7daysofcode.io/"&gt;7 Days Of Code&lt;/a&gt; para você colocar em prática seus conhecimentos através de desafios diários.&lt;/p&gt;

&lt;p&gt;E, com o objetivo de contribuir para a comunidade, eu me juntei a Alura e  lançamos um novo desafio no 7 Days Of Code: &lt;a href="https://7daysofcode.io/matricula/javascript-e-dom-wordle"&gt;construir um clone do jogo Wordle usando HTML, CSS, JavaScript e Jest aplicando TDD&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DyJi5aQb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nahj2lpccqiyaqd8m53h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DyJi5aQb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nahj2lpccqiyaqd8m53h.png" alt="Layout no Figma: Wordle board game preenchido" width="880" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.nytimes.com/games/wordle/index.html"&gt;jogo Wordle&lt;/a&gt; foi desenvolvido pelo &lt;strong&gt;Josh Wardle&lt;/strong&gt; e tornou-se viral durante a pandemia do COVID-19. O jogo foi adquirido pelo jornal The New York Times em Janeiro de 2022. &lt;/p&gt;

&lt;p&gt;A seguir veja mais detalhes de cada dia do desafio.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Este é apenas o primeiro post de uma série que vou trazer relacionado a este desafio. Os próximos vão ser de cunho mais prático com foco na escrita dos testes automatizados.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Dia 01
&lt;/h3&gt;

&lt;p&gt;No primeiro dia do desafio, você recebe um link para acessar o layout da aplicação no Figma. O objetivo é recriar a página com base no design proposto construindo a estrutura HTML e a estilização com CSS. Você é desafiado a usar &lt;strong&gt;HTML semântico&lt;/strong&gt;, alinhamento de elementos da página utilizando &lt;strong&gt;Flexbox&lt;/strong&gt; e/ou &lt;strong&gt;CSS Grid&lt;/strong&gt;, além do &lt;strong&gt;reset de CSS&lt;/strong&gt; para sobrepor a formatação original que cada navegador aplica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 02
&lt;/h3&gt;

&lt;p&gt;No segundo dia, você deve definir um banco de palavras e desenvolver uma função que será responsável por escolher randomicamente a palavra que será adivinhada no jogo. Você é desafiado a desenvolver testes automatizados seguindo a prática &lt;strong&gt;TDD&lt;/strong&gt; (Test Driven Development), que basicamente consiste em um desenvolvimento orientado a testes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 03
&lt;/h3&gt;

&lt;p&gt;Esse é um dos dias mais importantes! Você vai começar a tornar a sua página mais dinâmica e interativa: você vai desenvolver toda a lógica para realizar palpites, levando em consideração as regras do jogo. Neste desafio, você precisa interagir com as funções de &lt;strong&gt;DOM&lt;/strong&gt; (Document Object Model) do JavaScript, como o evento &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Element/keydown_event"&gt;keydown&lt;/a&gt;. Além disso, para a escrita do testes é recomendado o uso da biblioteca &lt;a href="https://github.com/jsdom/jsdom"&gt;JSDom&lt;/a&gt; responsável por facilitar a manipulação da página HTML usando Jest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 04
&lt;/h3&gt;

&lt;p&gt;No quarto dia, você vai verificar se o palpite está correto, levando em consideração as regras do jogo e, se o palpite completo for correto, irá exibir um alerta. Você continua sendo desafio a escrever testes automatizados usando Jest, mock de funções e a biblioteca JSDom. &lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 05
&lt;/h3&gt;

&lt;p&gt;Nesse dia, você vai customizar a caixa de diálogo (alerta) usando uma biblioteca externa chamada &lt;a href="https://github.com/apvarun/toastify-js"&gt;Toastify&lt;/a&gt;, incluindo essa dependência no projeto. Depois disso, você terá um jogo funcional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 06
&lt;/h3&gt;

&lt;p&gt;Chegando quase no final, o foco do dia é o uso do DOM. O desafio do dia será tornar o teclado virtual clicável, ou seja, ao pressionar uma das teclas, isso deverá refletir no board do seu jogo, usando o evento de &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Element/click_event"&gt;clique&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dia 07
&lt;/h3&gt;

&lt;p&gt;No sétimo e último dia do desafio, você precisa adicionar um botão na página que irá zerar as informações, para que o jogador possa jogar novamente do início. Você irá fechar com chave de ouro!&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;Como uma pessoa desenvolvedora front-end é fundamental solidificar seus conhecimentos de HTML, CSS e JavaScript. Nada melhor do que pegar um design definido no Figma e transformar em código. Com isso, você terá uma boa base para dar mergulhos mais profundos em outras tecnologias, como React, pré-processadores de CSS.&lt;/p&gt;

&lt;p&gt;Ademais, além de praticar a escrita de testes, você é desafiado a configurar o Github para executar seus testes automaticamente e publicar sua aplicação usando o &lt;a href="https://docs.github.com/pt/actions/automating-builds-and-tests/building-and-testing-nodejs"&gt;Github Actions&lt;/a&gt; e o &lt;a href="https://docs.github.com/pt/pages/getting-started-with-github-pages/creating-a-github-pages-site"&gt;Gitub Pages&lt;/a&gt;, respectivamente.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>css</category>
      <category>html</category>
    </item>
  </channel>
</rss>
