{"id":232447,"date":"2023-01-12T11:41:00","date_gmt":"2023-01-12T08:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232447"},"modified":"2022-11-10T09:35:43","modified_gmt":"2022-11-10T06:35:43","slug":"5-funzionalita-javascript-allavanguardia-per-migliorare-il-tuo-codice","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/5-funzionalita-javascript-allavanguardia-per-migliorare-il-tuo-codice\/","title":{"rendered":"5 funzionalit\u00e0 JavaScript all&#8217;avanguardia per migliorare il tuo codice"},"content":{"rendered":"\n<p>Le funzionalit\u00e0 JavaScript sono in continua crescita e ne ricevono di nuove come operatori, costruzioni di sintassi, espressioni. Molti che sono stati introdotti negli ultimi anni e alcuni di essi sono gi\u00e0 una seconda natura, come l&#8217;espressione della freccia grassa o l&#8217; operatore <code>=&gt;<\/code>di diffusione dell&#8217;oggetto .<code>...<\/code><\/p>\n<h2>Le funzionalit\u00e0 JavaScript iniziano come proposte<\/h2>\n<p>Tutte queste funzionalit\u00e0 JavaScript iniziano come proposte presentate al TC 39. Il <a href=\"https:\/\/www.ecma-international.org\/memento\/tc39-rf-tg.htm\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Comitato tecnico 39<\/a> \u00e8 incaricato di standardizzare:<\/p>\n<blockquote>\n<p>il linguaggio di programmazione ECMAScript (JavaScript) per scopi generici, multipiattaforma e indipendente dal fornitore. Ci\u00f2 include la sintassi del linguaggio, la semantica e le librerie e le tecnologie complementari che supportano il linguaggio.<\/p>\n<\/blockquote>\n<p>Ci sono molte proposte JavaScript che possiamo iniziare ad aggiungere al nostro flusso oggi, grazie a <a href=\"https:\/\/babeljs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Babel, il compilatore JavaScript<\/a>. Alcuni di essi offrono maggiore chiarezza, come il separatore numerico. Altri, come le <code>do<\/code>espressioni, introducono la possibilit\u00e0 di avere condizionali complessi mescolati con i tag React JSX.<\/p>\n<p>Diamo un&#8217;occhiata in questo articolo a 5 funzionalit\u00e0 JavaScript che sono ancora in fase di proposta ma che possiamo utilizzare con Babel e miglioreranno notevolmente la tua esperienza di codifica.<\/p>\n<p>Ognuno ha un link alla sua pagina Babel dove puoi vedere come configurare Babel per usarlo, anche se le funzionalit\u00e0 JavaScript proposte qui descritte sono gi\u00e0 incluse in Babel 7. Ogni sezione ha anche un link alla sua proposta nell&#8217;organizzazione <a href=\"https:\/\/github.com\/tc39\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ecma TC39<\/a> su <a href=\"https:\/\/startfunction.com\/tag\/github\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GitHub<\/a>.<\/p>\n<h2>Operatore di coalescenza nullo<\/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 funzionalit\u00e0 JavaScript all&#039;avanguardia per migliorare il tuo codice\" ><\/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>Questa proposta JavaScript descrive un operatore che consente di fornire un valore di fallback sul lato destro dell&#8217;operatore quando una variabile o una propriet\u00e0 di un oggetto non \u00e8 definita. Se non \u00e8 indefinito, utilizzer\u00e0 il lato sinistro dell&#8217;operatore:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef ?? 2021; <\/code><\/pre>\n<p>Questo \u00e8 simile a scriverlo come operatore ternario:<\/p>\n<pre><code>const maybeUndef = undefined;\nconst val = maybeUndef? maybeUndef: 2021; <\/code><\/pre>\n<p>Si noti che questo operatore non verifica che var non esista. Questo generer\u00e0 un errore:<\/p>\n<pre><code>const val = maybeUndef ?? 2021;  <\/code><\/pre>\n<p>Ma attenzione, questo operatore non \u00e8 al 100% come un operatore ternario che restituisce il primo lato se la condizione valutata \u00e8 vera. Non valuter\u00e0 i valori che di solito sono falsi in <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> in <code>false<\/code>. Ad esempio, una stringa vuota non verr\u00e0 considerata <code>false<\/code>:<\/p>\n<pre><code>const someEmptyString = '';\nconst val = someEmptyString ?? 'fallback'; <\/code><\/pre>\n<p>A differenza di questo operatore di coalescenza nullo, un operatore ternario sarebbe stato lanciato <code>fallback<\/code>come risultato di questa valutazione.<\/p>\n<h2>Operatore di concatenamento opzionale<\/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 funzionalit\u00e0 JavaScript all&#039;avanguardia per migliorare il tuo codice\" ><\/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>Questo operatore funziona anche su variabili e propriet\u00e0 degli oggetti: controlla se le propriet\u00e0 annidate che stiamo attraversando esistono o meno. Senza questo operatore, dobbiamo controllare ogni propriet\u00e0 nidificata:<\/p>\n<pre><code>const val = anObj &amp;&amp; anObj.aProp &amp;&amp; anObj.aProp.aNestedProp<\/code><\/pre>\n<p>Con il nuovo operatore di concatenamento opzionale, possiamo fare qualcosa del tipo:<\/p>\n<pre><code>const val = anObj.aProp?.aNestedProp<\/code><\/pre>\n<p>Questo sembra molto pi\u00f9 chiaro ed \u00e8 pi\u00f9 breve da scrivere. Questo operatore funziona anche con gli array numerici, quindi \u00e8 utile lavorare con le raccolte:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp<\/code><\/pre>\n<p>E possiamo impilare pi\u00f9 operatori:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp?.aNestedProp<\/code><\/pre>\n<p>E se combiniamo questo con il precedente, una coalescenza nulla? Otteniamo una sintassi che controlla che ogni propriet\u00e0 attraversata esista e, in caso contrario, fornisce un valore di fallback:<\/p>\n<pre><code>const val = anObj.anArray[0]?.someProp ?? 'someDefaultValue'<\/code><\/pre>\n<p>Se uno qualsiasi dei valori non esiste, restituir\u00e0 <code>someDefaultValue<\/code>. <a href=\"https:\/\/lodash.com\/docs#get\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">La combinazione di questi due operatori \u00e8 un ottimo modo per sostituire la funzione get<\/a> di lodash .<\/p>\n<h2>Operatore di condotte<\/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 funzionalit\u00e0 JavaScript all&#039;avanguardia per migliorare il tuo codice\" ><\/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>Questo operatore fa parte di diverse funzionalit\u00e0 JavaScript sperimentali e questo fornisce una maggiore leggibilit\u00e0 quando si concatenano pi\u00f9 funzioni insieme. Considera la seguente funzione:<\/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 abbiamo bisogno di riutilizzare queste trasformazioni parziali che sono concatenate insieme, possiamo suddividerle in diverse funzioni e quindi comporre il risultato usandole:<\/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>La cosa strana di questo \u00e8 che dobbiamo iniziare a leggere questo dal basso, dalla <code>splitBySpace<\/code>riga, verso l&#8217;alto, per capire le trasformazioni applicate alla stringa. Questo va contro il nostro flusso di lettura naturale, dall&#8217;alto verso il basso. Finiamo anche con tutte quelle brutte parentesi penzolanti. Questo potrebbe essere scritto in una riga e non \u00e8 molto pi\u00f9 carino:<\/p>\n<pre><code>const reverseWords = str =&gt; joinWithSpace( reverseArray( splitBySpace( str)) );<\/code><\/pre>\n<p>Qui, dobbiamo iniziare a leggere dalla funzione centrale verso le funzioni esterne, o da destra a sinistra, il che \u00e8 controintuitivo per la lettura occidentale da sinistra a destra.<\/p>\n<p>L&#8217;operatore della pipeline pu\u00f2 rendere queste costruzioni molto pi\u00f9 leggibili e simili al concatenamento che avevamo originariamente prima di spostare le trasformazioni in funzioni separate:<\/p>\n<pre><code>const reverseWords =\n    str =&gt; str\n        |&gt; splitBySpace\n        |&gt; reverseArray\n        |&gt; joinWithSpace;<\/code><\/pre>\n<p>Ora le trasformazioni applicate sono scritte in modo simile al nostro modo di scrivere, dall&#8217;alto verso il basso, sono pi\u00f9 chiare da leggere e non abbiamo parentesi in giro. Successo!<\/p>\n<h2>Separatore numerico<\/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 funzionalit\u00e0 JavaScript all&#039;avanguardia per migliorare il tuo codice\" ><\/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>Questo separatore numerico \u00e8 diverso dalle altre funzionalit\u00e0 JavaScript poich\u00e9 non \u00e8 un operatore. \u00c8 una costruzione della sintassi che rende pi\u00f9 leggibili i valori letterali numerici creando una separazione visiva tra gruppi di cifre. I valori letterali numerici di grandi dimensioni sono difficili da analizzare e comprendere rapidamente, in particolare quando una cifra viene ripetuta pi\u00f9 volte. Per esempio:<\/p>\n<pre><code>const longNum = 1000000000000;<\/code><\/pre>\n<p>\u00c8 difficile da capire con una rapida occhiata. Questo separatore lo rende pi\u00f9 leggibile:<\/p>\n<pre><code>const longNum = 1_000_000_000_000;<\/code><\/pre>\n<p>Ora possiamo capire rapidamente che questo \u00e8 un trilione.<\/p>\n<h2>Fai espressioni<\/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 funzionalit\u00e0 JavaScript all&#039;avanguardia per migliorare il tuo codice\" ><\/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>L&#8217;ultima delle nuove funzionalit\u00e0 JavaScript che esamineremo \u00e8 un&#8217;espressione che pu\u00f2 essere valutata. Il risultato di questa espressione arriva dopo l&#8217;esecuzione di un blocco che pu\u00f2 avere pi\u00f9 istruzioni all&#8217;interno. Possiamo facilmente capire le espressioni do se traduciamo un&#8217;espressione di operatore ternario come questa:<\/p>\n<pre><code>const res = isCold( color )? 'light-blue': 'orange';<\/code><\/pre>\n<p><code>do{}<\/code>Scriveremmo l&#8217; espressione equivalente in questo modo:<\/p>\n<pre><code>const res = do {\n    if (isCold( color)) {\n        'light-blue';\n    } else {\n        'orange';\n    }\n};<\/code><\/pre>\n<p>Si noti che non \u00e8 necessario restituire il valore poich\u00e9 questa non \u00e8 una funzione. Mentre in questo caso particolare, questo pu\u00f2 essere scritto in modo pi\u00f9 succinto come ternario, le espressioni do sono molto pi\u00f9 potenti, consentendo pi\u00f9 affermazioni, ad esempio:<\/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>Dove questo \u00e8 davvero potente \u00e8 in JSX, dove possiamo mescolarlo con i suoi tag senza dover prima calcolare il risultato esternamente. Ad esempio, potremmo fare quanto segue se usiamo <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> per renderizzare questi componenti:<\/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>Altre proposte JavaScript<\/h2>\n<p>Ogni giorno vengono discusse pi\u00f9 proposte per aggiungere funzionalit\u00e0 pi\u00f9 interessanti al linguaggio JavaScript. Un elenco sempre crescente di queste funzionalit\u00e0 JavaScript proposte pu\u00f2 essere letto su <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>. Le proposte qui sono prossime al completamento e quindi prossime all&#8217;aggiunta allo standard ECMAScript come spiegato in questa tabella che descrive <a href=\"https:\/\/tc39.es\/process-document\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il processo di accettazione<\/a>.<\/p>\n<p>Alcune delle nuove funzionalit\u00e0 JavaScript che abbiamo esplorato in questo articolo, come le espressioni do o l&#8217;operatore della pipeline, sono <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\">proposte di fase 1<\/a>, il che significa che hanno ancora molta strada da fare prima di entrare a far parte dello standard ECMAScript.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scopri 5 nuove funzionalit\u00e0, operatori ed espressioni JavaScript che miglioreranno il tuo codice, rendendolo pi\u00f9 leggibile ed efficiente.<\/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":[896,731,751,720,844],"tags":[1168],"class_list":["post-232447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-javascript-6","category-open-source-projektmanagement-3","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=232447"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232447\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/157555"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=232447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=232447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=232447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}