{"id":232319,"date":"2023-01-12T11:18:00","date_gmt":"2023-01-12T08:18:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232319"},"modified":"2022-11-10T08:42:06","modified_gmt":"2022-11-10T05:42:06","slug":"5-recursos-javascript-de-ponta-para-melhorar-seu-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/5-recursos-javascript-de-ponta-para-melhorar-seu-codigo\/","title":{"rendered":"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo"},"content":{"rendered":"\n<p>Os recursos do JavaScript est\u00e3o sempre crescendo e recebendo novos, como operadores, constru\u00e7\u00f5es de sintaxe, express\u00f5es. Muitos que foram introduzidos nos \u00faltimos anos e alguns deles j\u00e1 s\u00e3o uma segunda natureza, como a express\u00e3o de seta gorda ou o operador de <code>=&gt;<\/code>propaga\u00e7\u00e3o de objeto .<code>...<\/code><\/p>\n<h2>Os recursos do JavaScript come\u00e7am como propostas<\/h2>\n<p>Todos esses recursos JavaScript come\u00e7am como propostas submetidas ao TC 39. O <a href=\"https:\/\/www.ecma-international.org\/memento\/tc39-rf-tg.htm\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Comit\u00ea T\u00e9cnico 39<\/a> se encarrega de padronizar:<\/p>\n<blockquote>\n<p>a linguagem de programa\u00e7\u00e3o ECMAScript (JavaScript) de uso geral, plataforma cruzada e neutra em rela\u00e7\u00e3o ao fornecedor. Isso inclui a sintaxe, a sem\u00e2ntica e as bibliotecas da linguagem e as tecnologias complementares que suportam a linguagem.<\/p>\n<\/blockquote>\n<p>Existem muitas propostas JavaScript que podemos come\u00e7ar a adicionar ao nosso fluxo hoje, gra\u00e7as ao <a href=\"https:\/\/babeljs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Babel, o compilador JavaScript<\/a>. Alguns deles oferecem mais clareza, como o separador num\u00e9rico. Outros, como as <code>do<\/code>express\u00f5es, introduzem a capacidade de ter condicionais complexas misturadas com tags React JSX.<\/p>\n<p>Vejamos neste artigo 5 recursos JavaScript que ainda est\u00e3o em est\u00e1gios de proposta, mas que podemos usar com o Babel e melhorar\u00e3o significativamente sua experi\u00eancia de codifica\u00e7\u00e3o.<\/p>\n<p>Cada uma tem um link para sua p\u00e1gina do Babel onde voc\u00ea pode ver como configurar o Babel para us\u00e1-lo, embora os recursos JavaScript propostos descritos aqui j\u00e1 estejam inclu\u00eddos no Babel 7. Cada se\u00e7\u00e3o tamb\u00e9m tem um link para sua proposta na organiza\u00e7\u00e3o <a href=\"https:\/\/github.com\/tc39\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ecma TC39<\/a> em <a href=\"https:\/\/startfunction.com\/tag\/github\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GitHub<\/a>.<\/p>\n<h2>Operador de coalesc\u00eancia nulo<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbe16eaf.png\" alt=\"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo\" ><\/a><\/p>\n<p>Proposta: <a href=\"https:\/\/github.com\/tc39\/proposal-nullish-coalescing\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-nullish-coalescing<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-nullish-coalescing-operator.html<\/a><\/p>\n<p>Esta proposta JavaScript descreve um operador que permite fornecer um valor de fallback no lado direito do operador quando uma vari\u00e1vel ou uma propriedade de objeto \u00e9 indefinida. Se n\u00e3o for indefinido, usar\u00e1 o lado esquerdo do operador:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef ?? 2021; <\/code><\/pre>\n<p>Isso \u00e9 semelhante a escrev\u00ea-lo como um operador tern\u00e1rio:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef? maybeUndef: 2021; <\/code><\/pre>\n<p>Observe que esse operador n\u00e3o verifica se o var n\u00e3o existe. Isso lan\u00e7ar\u00e1 um erro:<\/p>\n<pre><code>const val = maybeUndef ?? 2021;  <\/code><\/pre>\n<p>Mas cuidado, esse operador n\u00e3o \u00e9 100% como um operador tern\u00e1rio que retorna o primeiro lado se a condi\u00e7\u00e3o avaliada for verdadeira. Ele n\u00e3o avaliar\u00e1 valores que geralmente s\u00e3o falsos em <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> para <code>false<\/code>. Por exemplo, uma string vazia n\u00e3o ser\u00e1 considerada <code>false<\/code>:<\/p>\n<pre><code>const someEmptyString = '';\nconst val = someEmptyString ?? 'fallback'; <\/code><\/pre>\n<p>Ao contr\u00e1rio desse operador de coalesc\u00eancia nulo, um operador tern\u00e1rio seria lan\u00e7ado <code>fallback<\/code>como resultado dessa avalia\u00e7\u00e3o.<\/p>\n<h2>Operador de encadeamento opcional<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbbfc7df0.png\" alt=\"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo\" ><\/a><\/p>\n<p>Proposta: <a href=\"https:\/\/github.com\/tc39\/proposal-optional-chaining\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-optional-chaining<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-optional-chaining.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-optional-chaining.html<\/a><\/p>\n<p>Este operador tamb\u00e9m funciona em vari\u00e1veis \u200b\u200be propriedades de objetos: ele verifica se as propriedades aninhadas que estamos percorrendo existem ou n\u00e3o. Sem este operador, temos que verificar cada propriedade aninhada:<\/p>\n<pre><code>const val = anObj &amp;&amp; anObj.aProp &amp;&amp; anObj.aProp.aNestedProp<\/code><\/pre>\n<p>Com o novo operador de encadeamento opcional, podemos fazer algo como:<\/p>\n<pre><code>const val = anObj.aProp?.aNestedProp<\/code><\/pre>\n<p>Isso parece muito mais claro e \u00e9 mais curto para escrever. Esse operador tamb\u00e9m funciona com arrays num\u00e9ricos, ent\u00e3o \u00e9 bom trabalhar com cole\u00e7\u00f5es:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp<\/code><\/pre>\n<p>E podemos empilhar v\u00e1rios operadores:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp?.aNestedProp<\/code><\/pre>\n<p>E se combinarmos isso com o anterior, coalesc\u00eancia nula? Obtemos uma sintaxe que verifica se cada propriedade atravessada existe e, se n\u00e3o existir, fornece um valor de fallback:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp ?? 'someDefaultValue'<\/code><\/pre>\n<p>Se algum dos valores n\u00e3o existir, ele retornar\u00e1 <code>someDefaultValue<\/code>. <a href=\"https:\/\/lodash.com\/docs#get\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Combinar esses dois operadores \u00e9 uma \u00f3tima maneira de substituir a fun\u00e7\u00e3o get<\/a> do lodash .<\/p>\n<h2>Operador de pipeline<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc121b73.png\" alt=\"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo\" ><\/a><\/p>\n<p>Proposta: <a href=\"https:\/\/github.com\/tc39\/proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-pipeline-operator<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-op<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e<\/a> <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-pipeline-operator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rator<\/a><\/p>\n<p>Esse operador faz parte de v\u00e1rios recursos experimentais do JavaScript e fornece mais legibilidade ao encadear v\u00e1rias fun\u00e7\u00f5es. Considere a seguinte fun\u00e7\u00e3o:<\/p>\n<pre><code>const reverseWords = \n      str =&gt; str\n        .split( ' ') .reduce( (revStr, word) =&gt; [ word, ...revStr ], []) .join( ' ' );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p>Se precisarmos reutilizar essas transforma\u00e7\u00f5es parciais que est\u00e3o encadeadas, podemos dividi-las em fun\u00e7\u00f5es diferentes e compor o resultado usando-as:<\/p>\n<pre><code>const splitBySpace = str =&gt; str.split( ' ' );\nconst reverseArray = arr =&gt; arr.reduce( (acc, cur) =&gt; [ cur, ...acc ], [] );\nconst joinWithSpace = arr =&gt; arr.join( ' ' );\n\nconst reverseWords =\n    str =&gt; joinWithSpace(\n        reverseArray(\n            splitBySpace(\n                str)) );\n\nconsole.log( reverseWords( 'this is fun') ); <\/code><\/pre>\n<p>O que \u00e9 estranho nisso \u00e9 que temos que come\u00e7ar a ler isso de baixo, a <code>splitBySpace<\/code>linha, para cima, para entender as transforma\u00e7\u00f5es aplicadas \u00e0 string. Isso vai contra nosso fluxo natural de leitura, de cima para baixo. Tamb\u00e9m acabamos com todos aqueles par\u00eanteses pendurados feios. Isso poderia ser escrito em uma linha e n\u00e3o \u00e9 muito mais bonito:<\/p>\n<pre><code>const reverseWords = str =&gt; joinWithSpace( reverseArray( splitBySpace( str)) );<\/code><\/pre>\n<p>Aqui, temos que come\u00e7ar a ler da fun\u00e7\u00e3o central para as fun\u00e7\u00f5es externas, ou da direita para a esquerda, o que \u00e9 contra-intuitivo para a leitura ocidental da esquerda para a direita.<\/p>\n<p>O operador de pipeline pode tornar essas constru\u00e7\u00f5es muito mais leg\u00edveis e semelhantes ao encadeamento que t\u00ednhamos originalmente antes de mover as transforma\u00e7\u00f5es para fun\u00e7\u00f5es separadas:<\/p>\n<pre><code>const reverseWords =\n    str =&gt; str\n        |&gt; splitBySpace\n        |&gt; reverseArray\n        |&gt; joinWithSpace;<\/code><\/pre>\n<p>Agora as transforma\u00e7\u00f5es aplicadas s\u00e3o escritas de forma semelhante \u00e0 nossa maneira de escrever, de cima para baixo, s\u00e3o mais claras para ler, e n\u00e3o temos nenhum par\u00eantese pendurado. Sucesso!<\/p>\n<h2>Separador num\u00e9rico<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc276ca0.png\" alt=\"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo\" ><\/a><\/p>\n<p>Proposta: <a href=\"https:\/\/github.com\/tc39\/proposal-numeric-separator\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-numeric-separator<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/next\/babel-plugin-proposal-numeric-separator.html<\/a><\/p>\n<p>Esse separador num\u00e9rico \u00e9 diferente dos outros recursos do JavaScript, pois n\u00e3o \u00e9 um operador. \u00c9 uma constru\u00e7\u00e3o de sintaxe que torna os literais num\u00e9ricos mais leg\u00edveis criando uma separa\u00e7\u00e3o visual entre grupos de d\u00edgitos. Literais num\u00e9ricos grandes s\u00e3o dif\u00edceis de analisar e entender rapidamente, principalmente quando um d\u00edgito \u00e9 repetido v\u00e1rias vezes. Por exemplo:<\/p>\n<pre><code>const longNum = 1000000000000;<\/code><\/pre>\n<p>\u00c9 dif\u00edcil entender com uma olhada r\u00e1pida. Este separador torna mais leg\u00edvel:<\/p>\n<pre><code>const longNum = 1_000_000_000_000;<\/code><\/pre>\n<p>Agora podemos entender rapidamente que isso \u00e9 um trilh\u00e3o.<\/p>\n<h2>Fazer express\u00f5es<\/h2>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157554-61e6bbc5290ed.png\" alt=\"5 recursos JavaScript de ponta para melhorar seu c\u00f3digo\" ><\/a><\/p>\n<p>Proposta: <a href=\"https:\/\/github.com\/tc39\/proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposal-do-expressions<\/a><\/p>\n<p>Babel: <a href=\"https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/babeljs.io\/docs\/en\/babel-plugin-proposal-do-expressions<\/a><\/p>\n<p>O \u00faltimo dos novos recursos JavaScript que veremos \u00e9 uma express\u00e3o que pode ser avaliada. O resultado dessa express\u00e3o vem ap\u00f3s a execu\u00e7\u00e3o de um bloco que pode conter v\u00e1rias instru\u00e7\u00f5es. Podemos entender facilmente as express\u00f5es do se traduzirmos uma express\u00e3o de operador tern\u00e1rio como esta:<\/p>\n<pre><code>const res = isCold( color )? 'light-blue': 'orange';<\/code><\/pre>\n<p>Escrever\u00edamos a <code>do{}<\/code>express\u00e3o equivalente assim:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else {\n        'orange';\n    }\n};<\/code><\/pre>\n<p>Observe que n\u00e3o precisamos retornar o valor, pois isso n\u00e3o \u00e9 uma fun\u00e7\u00e3o. Embora neste caso em particular, isso possa ser escrito de forma mais sucinta como um tern\u00e1rio, as express\u00f5es do s\u00e3o muito mais poderosas, permitindo v\u00e1rias instru\u00e7\u00f5es, por exemplo:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else if (isHot( color)) {\n        'orange';\n    } else if (isRain( color)) {\n        'purple';\n    } else {\n        'green';\n    }\n};<\/code><\/pre>\n<p>Onde isso \u00e9 realmente poderoso \u00e9 no JSX, onde podemos mistur\u00e1-lo com suas tags sem precisar calcular o resultado externamente primeiro. Por exemplo, poder\u00edamos fazer o seguinte se estiv\u00e9ssemos usando <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> para renderizar esses componentes:<\/p>\n<pre><code>const MyComp = ({ color }) =&gt; ({\n            do {\n                if (isCold( color)) {\n                    ;\n                } else if (isHot( color)) {\n                    ;\n                } else if (isRain( color)) {\n                    ;\n                } else {\n                    ;\n                }\n            }\n        }\n\n);<\/code><\/pre>\n<h2>Mais propostas de JavaScript<\/h2>\n<p>H\u00e1 mais propostas sendo discutidas a cada dia para adicionar recursos mais interessantes \u00e0 linguagem JavaScript. Uma lista cada vez maior desses recursos JavaScript propostos pode ser lida em <a href=\"https:\/\/github.com\/tc39\/proposals#ecmascript-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/tc39\/proposals#ecmascript-proposals<\/a>. As propostas aqui est\u00e3o quase conclu\u00eddas e, portanto, pr\u00f3ximas de serem adicionadas ao padr\u00e3o ECMAScript, conforme explicado nesta tabela que descreve <a href=\"https:\/\/tc39.es\/process-document\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o processo de aceita\u00e7\u00e3o<\/a>.<\/p>\n<p>Alguns dos novos recursos de JavaScript que exploramos neste artigo, como as express\u00f5es do ou o operador de pipeline, s\u00e3o <a href=\"https:\/\/github.com\/tc39\/proposals\/blob\/master\/stage-1-proposals.md#stage-1-proposals\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">propostas de est\u00e1gio 1<\/a>, o que significa que eles ainda t\u00eam um caminho a percorrer antes de se tornarem parte do padr\u00e3o ECMAScript.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conhe\u00e7a 5 novos recursos, operadores e express\u00f5es JavaScript, que ir\u00e3o melhorar seu c\u00f3digo, tornando-o mais leg\u00edvel e eficiente.<\/p>\n","protected":false},"author":1,"featured_media":157555,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,733,846],"tags":[1170],"class_list":["post-232319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-javascript-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=232319"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232319\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/157555"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=232319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=232319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=232319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}