<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Dario Di Cillo - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Dario Di Cillo - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 14 May 2026 19:58:21 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/author/dario/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ [object, object] in JavaScript – Cosa Significa in JS ]]>
                </title>
                <description>
                    <![CDATA[ Lavorando con gli oggetti in JavaScript, potresti esserti imbattuto nell'output  [object, object]. Potrebbe sembrare irrilevante, ma non è necessariamente un  errore. [object, object] è la rappresentazione in formato stringa di un oggetto in JavaScript. Capirai meglio continuando a leggere questo articolo. Ci sono due situazioni principali in cui incontrerai ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/object-object-in-javascript-cosa-significa-in-js/</link>
                <guid isPermaLink="false">644164fe0b6bdd0668cda643</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Fri, 21 Apr 2023 06:26:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/clement-helardot-95YRwf6CNw8-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/object-object-in-javascript-meaning-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">[object, object] in JavaScript – Meaning in JS</a>
      </p><p>Lavorando con gli oggetti in JavaScript, potresti esserti imbattuto nell'output <code>[object, object]</code>. Potrebbe sembrare irrilevante, ma non è necessariamente un &nbsp;errore.</p><p><code>[object, object]</code> è la rappresentazione in formato stringa di un oggetto in JavaScript. Capirai meglio continuando a leggere questo articolo.</p><p>Ci sono due situazioni principali in cui incontrerai un output del genere:</p><ul><li>Provando a mostrare un oggetto usando il metodo <code>alert()</code> (il più comune).</li><li>Usando il metodo <code>toString()</code> su un oggetto.</li></ul><p>Diamo un'occhiata a qualche esempio.</p><h2 id="cosa-accade-se-usi-alert-su-un-oggetto-in-javascript"><strong>Cosa accade se usi <code>alert()</code> su un oggetto in JavaScript?</strong></h2><p>In questa sezione vedrai cosa accade quando usi il metodo <code>alert()</code> per mostrare un oggetto in JavaScript. Ecco il codice di esempio:</p><pre><code class="language-javascript">const student = {
  name: "John",
  school: "freeCodeCamp",
};

alert(student)</code></pre><p>Nel codice qui sopra, abbiamo creato un oggetto chiamato <code>student</code>. Dopo aver usato il metodo <code>alert()</code> per mostrare l'oggetto nel browser, otteniamo il seguente output:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/07/Screenshot--301-.png" class="kg-image" alt="Screenshot--301-" width="600" height="400" loading="lazy"></figure><p>Invece di visualizzare l'oggetto con le sue proprietà, vediamo <code>[object, object]</code>.</p><p>Questo accade perché quando utilizzi il metodo <code>alert()</code> per mostrare un oggetto in JavaScript, viene visualizzato in formato stringa.</p><p>Per ovviare a questo problema puoi usare il metodo <code>JSON.stringify()</code>, così da trasformare l'oggetto in una stringa che può essere mostrata &nbsp;nel browser con il metodo <code>alert()</code>. Ecco un esempio:</p><pre><code class="language-javascript">const student = {
  name: "John",
  school: "freeCodeCamp",
};

alert(JSON.stringify(student));</code></pre><p>Quando esegui il codice qui sopra, dovresti visualizzare l'oggetto con le sue proprietà – come nell'immagine seguente.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/07/Screenshot--303-.png" class="kg-image" alt="Screenshot--303-" width="600" height="400" loading="lazy"></figure><h2 id="cosa-accade-se-usi-il-metodo-tostring-su-un-oggetto-in-javascript"><strong>Cosa accade se usi il metodo <code>toString()</code> su un oggetto in JavaScript?</strong></h2><p>Il metodo <code>toString()</code> in JavaScript restituisce la rappresentazione in formato stringa di un oggetto. Questa sezione ti aiuterà a capire cosa è accaduto dietro le quinte nella sezione precedente.</p><p>Quando usi il metodo <code>toString()</code> su un oggetto in JavaScript, viene restituita la rappresentazione – <code>[object, object]</code>.</p><pre><code class="language-javascript">const student = {
  name: "John",
  school: "freeCodeCamp",
};

console.log(student.toString());
// [object Object]</code></pre><p>Come puoi vedere nel codice qui sopra, abbiamo usato il metodo <code>toString()</code> su un oggetto chiamato <code>student</code>: <code>student.toString()</code>.</p><p>Quando lo stampiamo sulla console, otteniamo <code>[object, object]</code>.</p><p>Questo è esattamente quelle che avviene quando mostri un oggetto nel browser usando il metodo <code>alert()</code> (come abbiamo visto nella sezione precedente).</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, abbiamo parlato dello strano output <code>[object, object]</code> in JavaScript.</p><p>Questo output è la rappresentazione in formato stringa di un oggetto in JavaScript.</p><p>Probabilmente ti capiterà di vedere un output del genere quando provi a mostrare un oggetto nel browser usando il metodo <code>alert()</code> oppure quando usi il metodo <code>toString()</code> su un oggetto.</p><p>Abbiamo anche analizzato alcuni esempi di codice e immagini per dimostrare come puoi vedere <code>[object, object]</code> in JavaScript.</p><p>Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Una Guida Semplice e Veloce alle Espressioni Regolari in JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ > Vuoi imparare JavaScript? Scarica il mio ebook su jshandbook.com [https://jshandbook.com/] Introduzione alle espressioni regolari Un'espressione regolare (anche detta regex) è un modo rapido per lavorare con le stringhe di testo. Creando un'espressione regolare con una sintassi speciale puoi:  * cercare un testo in una stringa  * sostituire ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/una-guida-semplice-e-veloce-alle-espressioni-regolari-in-javascript/</link>
                <guid isPermaLink="false">64342d7d88ecf5067c8906c9</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ regex ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 18 Apr 2023 09:29:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/regex.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/a-quick-and-simple-guide-to-javascript-regular-expressions-48b46a68df29/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A quick and simple guide to JavaScript Regular Expressions</a>
      </p><blockquote>Vuoi imparare JavaScript? Scarica il mio ebook su <a href="https://jshandbook.com/" rel="noopener">jshandbook.com</a></blockquote><h3 id="introduzione-alle-espressioni-regolari"><strong>Introduzione alle espressioni regolari</strong></h3><p>Un'espressione regolare (anche detta regex) è un modo rapido per lavorare con le stringhe di testo.</p><p>Creando un'espressione regolare con una sintassi speciale puoi:</p><ul><li><strong>cercare un testo</strong> in una stringa</li><li><strong>sostituire del testo</strong> in una stringa</li><li>ed <strong>estrarre informazioni</strong> da una stringa</li></ul><p>Quasi ogni linguaggio di programmazione presenta una qualche implementazione delle espressioni regolari. Esistono piccole differenze tra ogni implementazione, ma i concetti generali si applicano quasi ovunque.</p><p>Le espressioni regolari risalgono agli anni '50 del Novecento, quando vennero formalizzate come modello di ricerca concettuale per gli algoritmi di elaborazione di stringhe.</p><p>Implementate in strumenti UNIX come grep, sed e in editor di testo comuni, le espressioni regolari crebbero in popolarità. Vennero introdotte nel linguaggio di programmazione Perl e, successivamente, anche in altri linguaggi.</p><p>JavaScript, insieme a Perl, è uno dei linguaggi di programmazione che comprende il supporto per le espressioni regolari direttamente integrato nel linguaggio.</p><h3 id="difficili-ma-utili"><strong>Difficili ma utili</strong></h3><p>Se non si impiega il tempo necessario per comprenderle, le espressioni regolari possono sembrare totalmente insensate per un principiante e, molte volte, anche per uno sviluppatore professionista.</p><p>Espressioni regolari criptiche sono <strong>difficili da scrivere</strong>, <strong>difficili da leggere</strong> e <strong>difficili da modificare/manutenere</strong>.</p><p>Ma delle volte un'espressione regolare è <strong>il solo modo sensato</strong> per manipolare delle stringhe, quindi è uno strumento di grande valore in tuo possesso.</p><p>Questo tutorial mira a introdurti alle espressioni regolari in JavaScript in un modo semplice e a darti tutte le informazioni per leggere e creare espressioni regolari.</p><p>La regola generale è che <strong>più semplici sono le espressioni regolari e più è semplice leggerle e scriverle</strong>, mentre <strong>le espressioni regolari complesse possono diventare velocemente un pasticcio</strong> se non afferri appieno le basi.</p><h3 id="che-aspetto-ha-un-espressione-regolare"><strong>Che aspetto ha un'espressione regolare?</strong></h3><p>In JavaScript, un'espressione regolare è un oggetto che può essere definito in due modi.</p><p>Il primo è istanziare un nuovo oggetto usando il <strong>costruttore RegEx</strong>:</p><pre><code>const re1 = new RegExp('hey')</code></pre><p>Il secondo è usare un'<strong>espressione regolare letterale</strong>:</p><pre><code>const re1 = /hey/</code></pre><p>Sai che JavaScript ha <strong>oggetti e array letterali</strong>? Ha anche <strong>espressioni regolari letterali</strong>.</p><p>Nell'esempio precedente, <code>hey</code> è detto <strong><strong>pattern</strong></strong>. Nella forma letterale è delimitato da barre oblique, mentre non lo è all'interno del costruttore.</p><p>Questa è la prima importante differenza tra le due forme, ma ne vedremo altre in seguito.</p><h3 id="come-funziona"><strong>Come funziona?</strong></h3><p>L'espressione regolare che abbiamo precedentemente definito come <code>re1</code> è molto semplice. Cerca la stringa <code>hey</code>, senza alcuna limitazione. La stringa può contenere molto testo e <code>hey</code> nel mezzo e l'espressione è soddisfatta. Può anche contenere solo <code>hey</code> e anche in questo caso l'espressione è soddisfatta.</p><p>Piuttosto semplice.</p><p>Puoi testare un'espressione regolare usando <code>RegExp.test(String)</code>, che restituisce un booleano:</p><pre><code>re1.test('hey') //✅
re1.test('blablabla hey blablabla') //✅
re1.test('he') //❌
re1.test('blablabla') //❌</code></pre><p>Nell'esempio qui sopra, abbiamo verificato se <code>"hey"</code> soddisfa il pattern dell'espressione regolare memorizzata in <code>re1</code>.</p><p>Questo è il caso più semplice, ma adesso conosci già molti concetti sulle espressioni regolari.</p><h3 id="ancoraggi"><strong>Ancoraggi</strong></h3><pre><code>/hey/</code></pre><p>indica <code>hey</code> in qualsiasi posizione di una stringa.</p><p>Se vuoi trovare stringhe che <strong>iniziano </strong>con <code>hey</code>, usa l'operatore <code>^</code>:</p><pre><code>/^hey/.test('hey') //✅
/^hey/.test('bla hey') //❌</code></pre><p>Se vuoi trovare stringhe che <strong>finiscono </strong>con <code>hey</code>, usa l'operatore <code>$</code>:</p><pre><code>/hey$/.test('hey') //✅
/hey$/.test('bla hey') //✅
/hey$/.test('hey you') //❌</code></pre><p>Se combini i due, troverai esattamente e soltanto la stringa <code>hey</code>:</p><pre><code>/^hey$/.test('hey') //✅</code></pre><p>Per trovare una stringa che inizia con una sottostringa e finisce con un'altra, puoi usare <code><strong><strong>.*</strong></strong></code>, che indica qualsiasi carattere ripetuto 0 o più volte:</p><pre><code>/^hey.*joe$/.test('hey joe') //✅
/^hey.*joe$/.test('heyjoe') //✅
/^hey.*joe$/.test('hey how are you joe') //✅
/^hey.*joe$/.test('hey joe!') //❌</code></pre><h3 id="intervalli">Intervalli</h3><p>Invece di trovare una particolare stringa, puoi scegliere di trovare qualsiasi carattere in un intervallo, ad esempio:</p><pre><code>/[a-z]/ //a, b, c, ... , x, y, z
/[A-Z]/ //A, B, C, ... , X, Y, Z
/[a-c]/ //a, b, c
/[0-9]/ //0, 1, 2, 3, ... , 8, 9</code></pre><p>Queste espressioni regolari indicano stringhe che contengono almeno uno dei caratteri compresi negli intevalli:</p><pre><code>/[a-z]/.test('a') //✅
/[a-z]/.test('1') //❌
/[a-z]/.test('A') //❌
/[a-c]/.test('d') //❌
/[a-c]/.test('dc') //✅</code></pre><p>Gli intervalli possono essere combinati:</p><pre><code>/[A-Za-z0-9]/

/[A-Za-z0-9]/.test('a') // ✅
/[A-Za-z0-9]/.test('1') // ✅
/[A-Za-z0-9]/.test('A') // ✅</code></pre><h3 id="intervalli-con-elementi-multipli"><strong>Intervalli con elementi multipli</strong></h3><p>Puoi verificare se una stringa contiene uno e soltanto un carattere nell'intervallo usando il carattere <code>-</code>:</p><pre><code>/^[A-Za-z0-9]$/

/^[A-Za-z0-9]$/.test('A') // ✅
/^[A-Za-z0-9]$/.test('Ab') // ❌</code></pre><h3 id="pattern-negati"><strong>Pattern negati</strong></h3><p>Il carattere <code>^</code> all'inizio di un pattern lo ancora all'inizio della stringa.</p><p>Se usato in un intervallo, <strong>nega </strong>i suoi elementi:</p><pre><code>/[^A-Za-z0-9]/.test('a') //❌
/[^A-Za-z0-9]/.test('1') //❌
/[^A-Za-z0-9]/.test('A') //❌
/[^A-Za-z0-9]/.test('@') //✅</code></pre><ul><li><code><strong><strong>\d</strong></strong></code> corrisponde a qualsiasi cifra, equivalente a <code>[0-9]</code></li><li><code><strong><strong>\D</strong></strong></code> corrisponde a qualsiasi carattere che non è una cifra, equivalente a <code>[^0-9]</code></li><li><code><strong><strong>\w</strong></strong></code> corrisponde a qualsiasi carattere alfanumerico, equivalente a <code>[A-Za-z0-9]</code></li><li><code><strong><strong>\W</strong></strong></code> corrisponde a qualsiasi carattere non alfanumerico, equivalente a <code>[^A-Za-z0-9]</code></li><li><code><strong><strong>\s</strong></strong></code> corrisponde a qualsiasi carattere di spazio: spazio, tab, nuova riga e spazi Unicode</li><li><code><strong><strong>\S</strong></strong></code> corrisponde a qualsiasi carattere che non è uno spazio</li><li><code><strong><strong>\0</strong></strong></code> corrisponde a null</li><li><code><strong><strong>\n</strong></strong></code> corrisponde al carattere nuova riga</li><li><code><strong><strong>\t</strong></strong></code> corrisponde al carattere tab</li><li><code><strong><strong>\uXXXX</strong></strong></code> corrisponde al carattere Unicode con codice XXXX (richiede il flag <code>u</code>)</li><li><code><strong><strong>.</strong></strong></code> corrisponde a qualsiasi carattere che non è una nuova riga (e.g. <code>\n</code>) (a meno che non usi il flag <code>s</code>, spiegato in seguito)</li><li><code><strong><strong>[^]</strong></strong></code> corrisponde a qualsiasi carattere, incluso il carattere nuova riga. Utile su stringhe multi-riga.</li></ul><h3 id="scelte-nelle-espressioni-regolari"><strong>Scelte nelle espressioni regolari</strong></h3><p>Se vuoi cercare una stringa <strong>oppure</strong> un'altra, usa l'operatore <code>|</code>.</p><pre><code>/hey|ho/.test('hey') //✅
/hey|ho/.test('ho') //✅</code></pre><h3 id="quantificatori"><strong>Quantificatori</strong></h3><p>Supponiamo di avere questa espressione regolare che verifica se una stringa ha una cifra al suo interno e nient'altro:</p><pre><code>/^\d$/</code></pre><p>Puoi usare il <strong>quantificatore </strong><code>?</code> per renderla opzionale (presente 0 o 1 volta):</p><pre><code>/^\d?$/</code></pre><p>Ma se volessi trovare più cifre?</p><p>Puoi farlo in 4 modi, usando <code>+</code>, <code>*</code>, <code>{n}</code> e <code>{n,m}</code>. Vediamo queste opzioni una alla volta.</p><h3 id="-"><strong><code>+</code></strong></h3><p>indica 1 o più (&gt;=1) elementi</p><pre><code>/^\d+$/

/^\d+$/.test('12') // ✅
/^\d+$/.test('14') // ✅
/^\d+$/.test('144343') // ✅
/^\d+$/.test('') // ❌
/^\d+$/.test('1a') // ❌</code></pre><h3 id="--1"><strong><code>*</code></strong></h3><p>indica 0 o più (&gt;= 0) elementi</p><pre><code>/^\d+$/

/^\d*$/.test('12') // ✅
/^\d*$/.test('14') // ✅
/^\d*$/.test('144343') // ✅
/^\d*$/.test('') // ✅
/^\d*$/.test('1a') // ❌</code></pre><h3 id="-n-"><strong><code>{n}</code></strong></h3><p>indica esattamente <code>n</code> elementi</p><pre><code>/^\d{3}$/

/^\d{3}$/.test('123') // ✅
/^\d{3}$/.test('12') // ❌
/^\d{3}$/.test('1234') // ❌
/^[A-Za-z0-9]{3}$/.test('Abc') // ✅</code></pre><h3 id="-n-m-"><strong><code>{n,m}</code></strong></h3><p>indica elementi tra <code>n</code> e <code>m</code> volte:</p><pre><code>/^\d{3,5}$/

/^\d{3,5}$/.test('123') // ✅
/^\d{3,5}$/.test('1234') // ✅
/^\d{3,5}$/.test('12345') // ✅
/^\d{3,5}$/.test('123456') // ❌</code></pre><p><code>m</code> può essere omesso per un intervallo aperto, così da avere almeno <code>n</code> elementi:</p><pre><code>/^\d{3,}$/

/^\d{3,}$/.test('12') // ❌
/^\d{3,}$/.test('123') // ✅
/^\d{3,}$/.test('12345') // ✅
/^\d{3,}$/.test('123456789') // ✅</code></pre><h3 id="elementi-opzionali"><strong>Elementi opzionali</strong></h3><p>Apporre un <code>?</code> dopo un elemento lo rende opzionale:</p><pre><code>/^\d{3}\w?$/

/^\d{3}\w?$/.test('123') // ✅
/^\d{3}\w?$/.test('123a') // ✅
/^\d{3}\w?$/.test('123ab') // ❌</code></pre><h3 id="gruppi"><strong>Gruppi</strong></h3><p>Usando le parentesi puoi creare gruppi di caratteri: <code>(...)</code></p><p>Questo esempio indica esattamente 3 cifre seguite da uno o più caratteri alfanumerici:</p><pre><code>/^(\d{3})(\w+)$/

/^(\d{3})(\w+)$/.test('123') // ❌
/^(\d{3})(\w+)$/.test('123s') // ✅
/^(\d{3})(\w+)$/.test('123something') // ✅
/^(\d{3})(\w+)$/.test('1234') // ✅</code></pre><p>I caratteri di ripetizione posti dopo la parentesi di chiusura di un gruppo fanno riferimento all'intero gruppo:</p><pre><code>/^(\d{2})+$/

/^(\d{2})+$/.test('12') //✅
/^(\d{2})+$/.test('123') //❌
/^(\d{2})+$/.test('1234') //✅</code></pre><h3 id="gruppi-di-acquisizione"><strong>Gruppi di acquisizione</strong></h3><p>Finora, abbiamo visto come testare delle stringhe e verificare se contengono un certo pattern.</p><p>Una funzionalità molto bella delle espressioni regolari è la possibilità di <strong>acquisire parti di una stringa</strong> e inserirle in un array.</p><p>Puoi farlo usando i gruppi e in particolare i <strong>gruppi di acquisizione</strong> (capturing group).</p><p>Di default, un gruppo è un gruppo di acquisizione. Adesso, invece di usare <code>RegExp.test(String)</code>, che restituisce un booleano se il pattern è soddisfatto, useremo <code>String.match(RegExp)</code> o <code>RegExp.exec(String)</code>.</p><p>Funzionano esattamente allo stesso modo e restituiscono un array con l'intera stringa trovata come primo elemento, seguita dal contenuto dei gruppi.</p><p>Se non c'è corrispondenza, restituiscono <code>null</code>:</p><pre><code>'123s'.match(/^(\d{3})(\w+)$/)
// Array [ "123s", "123", "s" ]

/^(\d{3})(\w+)$/.exec('123s')
// Array [ "123s", "123", "s" ]

'hey'.match(/(hey|ho)/)
// Array [ "hey", "hey" ]

/(hey|ho)/.exec('hey')
// Array [ "hey", "hey" ]

/(hey|ho)/.exec('ha!')
// null</code></pre><p>Quando un gruppo viene trovato più volte, solo l'ultima corrispondenza viene inserita nell'array:</p><pre><code>'123456789'.match(/(\d)+/) //Array [ "123456789", "9" ]</code></pre><h3 id="gruppi-opzionali"><strong>Gruppi opzionali</strong></h3><p>Un gruppo di acquisizione può essere reso opzionale usando <code>(...)?</code>. Se non viene trovato, la posizione corrispondente nell'array conterrà <code>undefined</code>:</p><pre><code>/^(\d{3})(\s)?(\w+)$/.exec('123 s')
// Array [ "123 s", "123", " ", "s" ]

/^(\d{3})(\s)?(\w+)$/.exec('123s')
// Array [ "123s", "123", undefined, "s" ]</code></pre><h3 id="riferimenti-dei-gruppi-trovati"><strong>Riferimenti dei gruppi trovati</strong></h3><p>A ogni gruppo che viene trovato viene assegnato un numero. <code>$1</code> si riferisce al primo, <code>$2</code> al secondo e via dicendo. Questo sarà utile quando parleremo più avanti di sostituire parti di una stringa.</p><h3 id="gruppi-di-acquisizione-con-nome"><strong>Gruppi di acquisizione con nome</strong></h3><p>Questa è una nuova funzionalità di <a href="https://flaviocopes.com/ecmascript/" rel="noopener">ES2018</a>.</p><p>A un gruppo può essere assegnato un nome piuttosto che uno slot nell'array dei risultati:</p><pre><code>const re = /(?&lt;year&gt;\d{4})-(?&lt;month&gt;\d{2})-(?&lt;day&gt;\d{2})/
const result = re.exec('2015-01-02')

// result.groups.year === '2015';
// result.groups.month === '01';
// result.groups.day === '02';</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/O7t7h0vXGY1EDMe6jWKDV7K-K7QZskPzCcGs" class="kg-image" alt="O7t7h0vXGY1EDMe6jWKDV7K-K7QZskPzCcGs" width="800" height="411" loading="lazy"></figure><h3 id="usare-match-ed-exec-senza-gruppi"><strong>Usare match ed exec senza gruppi</strong></h3><p>Esiste una differenza nell'uso di <code>match</code> e <code>exec</code> senza gruppi: il primo elemento dell'array non è l'intera stringa trovata, ma direttamente la corrispondenza:</p><pre><code>/hey|ho/.exec('hey')
// [ "hey" ]

/(hey).(ho)/.exec('hey ho')
// [ "hey ho", "hey", "ho" ]</code></pre><h3 id="gruppi-non-acquisiti"><strong>Gruppi non acquisiti</strong></h3><p>Dato che i gruppi sono per impostazione predefinita gruppi di acquisizione, ti serve un modo per ignorare alcuni gruppi nell'array dei risultati. Questo è possibile usando i cosiddetti <strong>non-capturing group</strong>, che iniziano con <code>(?:...)</code>:</p><pre><code>'123s'.match(/^(\d{3})(?:\s)(\w+)$/)
// null

'123 s'.match(/^(\d{3})(?:\s)(\w+)$/)
// Array [ "123 s", "123", "s" ]</code></pre><h3 id="flag"><strong>Flag</strong></h3><p>Puoi usare i seguenti flag su qualsiasi espressione regolare:</p><ul><li><code>g</code>: trova il pattern più volte</li><li><code>i</code>: rende la regex indifferente a maiuscole/minuscole</li><li><code>m</code>: abilita la modalità multi-riga. In questa modalità, <code>^</code> e <code>$</code> indicano l'inizio e la fine dell'intera stringa. Senza questo flag con stringhe multi-riga indicano l'inizio e la fine di ogni riga.</li><li><code>u</code>: consente il supporto Unicode (introdotto in ES6/ES2015)</li><li><code>s</code>: (nuovo in <a href="https://flaviocopes.com/ecmascript/" rel="noopener">ES2018</a>) abbreviazione per <strong><strong>single line</strong></strong> (riga singola), fa sì che il <code>.</code> trovi anche il carattere nuova riga.</li></ul><p>I flag possono essere combinati e sono aggiunti alla fine dell'espressione regolare letterale:</p><pre><code>/hey/ig.test('HEy') //✅</code></pre><p>o come secondo parametro nel costruttore RegEx:</p><pre><code>new RegExp('hey', 'ig').test('HEy') //✅</code></pre><h3 id="analizzare-un-espressione-regolare"><strong>Analizzare un'espressione regolare</strong></h3><p>Data un'espressione regolare, puoi consultare le seguenti proprietà:</p><ul><li><code>source</code> è il pattern</li><li><code>multiline</code> è true con il flag <code>m</code></li><li><code>global</code> è true con il flag <code>g</code></li><li><code>ignoreCase</code> è true con il flag <code>i</code></li><li><code>lastIndex</code></li></ul><pre><code>/^(\w{3})$/i.source //"^(\\d{3})(\\w+)$" /^(\w{3})$/i.multiline //false /^(\w{3})$/i.lastIndex //0 /^(\w{3})$/i.ignoreCase //true /^(\w{3})$/i.global //false</code></pre><h3 id="escaping"><strong>Escaping</strong></h3><p>Questi caratteri sono speciali:</p><ul><li><code>\</code></li><li><code>/</code></li><li><code>[ ]</code></li><li><code>( )</code></li><li><code>{ }</code></li><li><code>?</code></li><li><code>+</code></li><li><code>*</code></li><li><code>|</code></li><li><code>.</code></li><li><code>^</code></li><li><code>$</code></li></ul><p>Sono speciali perché sono caratteri di controllo che hanno un significato nel pattern dell'espressione regolare. Se vuoi usarli all'interno del pattern come caratteri da ricercare, devi eseguirne l'escape anteponendo loro una barra rovesciata:</p><pre><code>/^\\$/ /^\^$/ // /^\^$/.test('^') ✅ /^\$$/ // /^\$$/.test('$') ✅</code></pre><h3 id="confini-di-stringa"><strong>Confini di stringa</strong></h3><p><code>\b</code> e <code>\B</code> ti consentono di verificare se una stringa si trovi all'inizio o alla fine di una parola:</p><ul><li><code><strong><strong>\b</strong></strong></code> indica un insieme di caratteri all'inizio o alla fine di una parola</li><li><code><strong><strong>\B</strong></strong></code> indica un insieme di caratteri che non si trovano all'inizio o alla fine di una parola</li></ul><p>Esempio:</p><pre><code>'I saw a bear'.match(/\bbear/) //Array ["bear"]
'I saw a beard'.match(/\bbear/) //Array ["bear"]
'I saw a beard'.match(/\bbear\b/) //null
'cool_bear'.match(/\bbear\b/) //null</code></pre><h3 id="sostituire-usando-le-espressioni-regolari"><strong>Sostituire usando le espressioni regolari</strong></h3><p>Abbiamo già visto come verificare se una stringa contiene un pattern.</p><p>Abbiamo anche visto come estrarre parte di una stringa in un array, tramite la corrispondenza con un pattern.</p><p>Ora vediamo come <strong>sostituire parti di una stringa</strong> sulla base di un pattern.</p><p>L'oggetto <code>String</code> in JavaScript ha un metodo <code>replace()</code> che può essere usato senza espressioni regolari per eseguire una <strong>singola sostituzione</strong> in una stringa:</p><pre><code>"Hello world!".replace('world', 'dog')
// Hello dog!

"My dog is a good dog!".replace('dog', 'cat')
// My cat is a good dog!</code></pre><p>Questo metodo accetta anche un'espressione regolare come argomento:</p><pre><code>"Hello world!".replace(/world/, 'dog') //Hello dog!</code></pre><p>Usare il flag <code>g</code> è l'<strong>unico modo</strong> per sostituire più occorrenze in una stringa in JavaScript:</p><pre><code>"My dog is a good dog!".replace(/dog/g, 'cat') //My cat is a good cat!</code></pre><p>I gruppi ci consentono di fare cose più complesse, come muovere parti di una stringa:</p><pre><code>"Hello, world!".replace(/(\w+), (\w+)!/, '$2: $1!!!') // "world: Hello!!!"</code></pre><p>Invece di usare una stringa, puoi usare una funzione per fare cose ancora più complesse. Potrà ricevere diversi argomenti come quelli restituiti da <code>String.match(RegExp)</code> o <code>RegExp.exec(String)</code>, con il numero di argomenti che dipende dal numero di gruppi:</p><pre><code>"Hello, world!".replace(/(\w+), (\w+)!/, (matchedString, first, second) =&gt; { 
  console.log(first); 
  console.log(second); 
  return `${second.toUpperCase()}: ${first}!!!` 
}) 
// "WORLD: Hello!!!"</code></pre><h3 id="avidit-"><strong>Avidità</strong></h3><p>Le espressioni regolari di default mostrano un comportamento per cui sono dette <strong><strong>greedy</strong></strong>.</p><p>Cosa vuol dire?</p><p>Prendiamo questa regex:</p><pre><code>/\$(.+)\s?/</code></pre><p>Ci aspettiamo che estragga una somma di dollari da una stringa:</p><pre><code>/\$(.+)\s?/.exec('This costs $100')[1] //100</code></pre><p>Ma se abbiamo altre parole dopo il numero, dà di matto:</p><pre><code>/\$(.+)\s?/.exec('This costs $100 and it is less than $200')[1] //100 and it is less than $200</code></pre><p>Questo accade perché l'espressione regolare, dopo il segno <code>$</code>, cerca qualsiasi carattere con <code>.+</code> e non si fermerà finché non viene raggiunta la fine della stringa. Poi termina perché <code>\s?</code> rende lo spazio finale opzionale.</p><p>Per sistemare questo aspetto, dobbiamo dire alla regex di essere pigra (lazy) e trovare la minor corrispondenza possibile. Possiamo farlo usando il simbolo <code>?</code> dopo il quantificatore:</p><pre><code>/\$(.+?)\s/.exec('This costs $100 and it is less than $200')[1] //100</code></pre><blockquote><em>Ho rimosso<em> <code>?</code> </em>dopo <em><code>\s</code> .</em> Altrimenti avrebbe trovato soltanto la prima cifra, dato che lo spazio era opzionale.</em></blockquote><p>Quindi <code>?</code> ha diversi significati in base alla sua posizione, perché può essere sia un quantificatore che un indicatore della modalità lazy.</p><h3 id="lookahead-trovare-una-stringa-in-base-a-cosa-c-dopo"><strong>Lookahead: trovare una stringa in base a cosa c'è dopo</strong></h3><p>Usa <code>?=</code> per trova una stringa che è seguita da una specifica sottostringa:</p><pre><code class="language-js">/Roger(?=Waters)/

/Roger(?= Waters)/.test('Roger is my dog') // false
/Roger(?= Waters)/.test('Roger is my dog and Roger Waters is a famous musician')
// true</code></pre><p><code>?!</code> svolge l'operazione inversa, cercando una stringa che <strong>non</strong> è seguita da una specifica sottostringa:</p><pre><code class="language-js">/Roger(?!Waters)/

/Roger(?! Waters)/.test('Roger is my dog') // true
/Roger(?! Waters)/.test('Roger Waters is a famous musician')
// false</code></pre><h3 id="lookbehind-trovare-una-stringa-in-base-a-cosa-c-prima"><strong>Lookbehind: trovare una stringa in base a cosa c'è prima</strong></h3><p>Questa è una funzionalità di <a href="https://flaviocopes.com/ecmascript/" rel="noopener">ES2018</a>.</p><p>I lookahead utilizzano il simbolo <code>?=</code> symbol. I lookbehind usano <code>?&lt;=</code>:</p><pre><code class="language-js">/(?&lt;=Roger) Waters/
/(?&lt;=Roger) Waters/.test('Pink Waters is my dog') 
// false

/(?&lt;=Roger) Waters/.test('Roger is my dog and Roger Waters is a famous musician')
// true</code></pre><p>Un lookbehind viene negato usando <code>?&lt;!</code>:</p><pre><code class="language-js">/(?&lt;!Roger) Waters/

/(?&lt;!Roger) Waters/.test('Pink Waters is my dog') 
// true

/(?&lt;!Roger) Waters/.test('Roger is my dog and Roger Waters is a famous musician')
// false</code></pre><h3 id="espressioni-regolari-e-unicode"><strong>Espressioni regolari e Unicode</strong></h3><p>Il flag <code>u</code> è obbligatorio per lavorare con le stringhe Unicode. Ciò è particolarmente vero quando hai bisogno di gestire caratteri non inclusi tra i primi 1600 caratteri Unicode.</p><p>Le emoji sono un buon esempio, ma non sono l'unico.</p><p>Se non aggiungi il flag, questa semplice regex che dovrebbe trovare un carattere non funzionerà perché per JavaScript quella emoji è rappresentata internamente da 2 caratteri (vedi <a href="https://flaviocopes.com/javascript-unicode/">Unicode in JavaScript</a>):</p><pre><code class="language-js">/^.$/.test('a') // ✅
/^.$/.test('🐶') // ❌
/^.$/u.test('🐶') // ✅
</code></pre><p>Quindi usa sempre il flag <code>u</code>.</p><p>Unicode, proprio come i normali caratteri, accetta gli intervalli:</p><pre><code class="language-js">/[a-z]/.test('a') // ✅
/[1-9]/.test('1') // ✅
/[🐶-🦊]/u.test('🐺') // ✅
/[🐶-🦊]/u.test('🐛') // ❌
</code></pre><p>JavaScript verifica la rappresentazione interna del codice, quindi 🐶 &lt; 🐺 &lt; 🦊 perché <code>\u1F436</code> &lt; <code>\u1F43A</code> &lt; <code>\u1F98A</code>. Dai un'occhiata alla <a href="https://unicode.org/emoji/charts/full-emoji-list.html">lista completa delle emoji</a> per vedere i codici e scoprire l'ordine (suggerimento: il selettore di emoji macOS ha alcune emoji in diverso ordine, quindi non farci affidamento).</p><h3 id="propriet-unicode"><strong>Proprietà Unicode</strong></h3><p>Come abbiamo visto prima, nel pattern di un'espressione regolare puoi usare <code>\d</code> per indicare qualsiasi cifra, <code>\s</code> per indicare qualsiasi carattere di spazio, <code>\w</code> per indicare qualsiasi carattere alfanumerico e così via.</p><p>Le proprietà Unicode costituiscono una funzionalità di <a href="https://flaviocopes.com/ecmascript/" rel="noopener ugc nofollow">ES2018</a> che estende questo concetto a tutti caratteri Unicode grazie a <code>\p{}</code> e alla sua negazione <code>\P{}</code>.</p><p>Ogni carattere Unicode ha una serie di proprietà. Ad esempio <code>Script</code> determina la famiglia della lingua, <code>ASCII</code> è un booleano che è <code>true</code> per ogni carattere ASCII e così via. Puoi inserire una proprietà tra parentesi graffe e l'espressione regolare controllerà se è vera:</p><pre><code class="language-js">/^\p{ASCII}+$/u.test('abc') // ✅
/^\p{ASCII}+$/u.test('ABC@') // ✅
/^\p{ASCII}+$/u.test('ABC🙃') // ❌
</code></pre><p><code>ASCII_Hex_Digit</code> è un'altra proprietà booleana che verifica se la stringa contiene solo cifre esadecimali valide:</p><pre><code class="language-js">/^\p{ASCII_Hex_Digit}+$/u.test('0123456789ABCDEF') // ✅
/^\p{ASCII_Hex_Digit}+$/u.test('h') // ❌
</code></pre><p>Esistono molte altre proprietà booleane che puoi controllare aggiungendone il nome tra parentesi graffe. Tra queste <code>Uppercase</code>, <code>Lowercase</code>, <code>White_Space</code>, <code>Alphabetic</code>, <code>Emoji</code> e altre:</p><pre><code class="language-js">/^\p{Lowercase}$/u.test('h') // ✅
/^\p{Uppercase}$/u.test('H') // ✅
/^\p{Emoji}+$/u.test('H') // ❌
/^\p{Emoji}+$/u.test('🙃🙃') // ✅
</code></pre><p>In aggiunta a queste proprietà binarie, puoi verificare se le proprietà corrispondono a un valore specifico. In questo esempio, verifico se la stringa è scritta in alfabeto greco o latino:</p><pre><code class="language-js">/^\p{Script=Greek}+$/u.test('ελληνικά') // ✅
/^\p{Script=Latin}+$/u.test('hey') // ✅
</code></pre><p>Se vuoi sapere altro sulle proprietà che puoi usare consulta direttamente <a href="https://github.com/tc39/proposal-regexp-unicode-property-escapes">la proposta</a>.</p><h3 id="esempi"><strong>Esempi</strong></h3><p>Supponendo che una stringa contenga solo un numero che hai bisogno di estrarre, <code>/\d+/</code> dovrebbe andare bene:</p><pre><code>'Test 123123329'.match(/\d+/) 
// Array [ "123123329" ]</code></pre><h4 id="trovare-un-indirizzo-email"><strong>Trovare un indirizzo email</strong></h4><p>Un approccio semplicistico è verificare i caratteri che non sono spazi prima e dopo il segno <code>@</code>, usando <code>\S</code>:</p><pre><code class="language-js">/(\S+)@(\S+)\.(\S+)/
/(\S+)@(\S+)\.(\S+)/.exec('copesc@gmail.com')
               
// ["copesc@gmail.com", "copesc", "gmail", "com"]
</code></pre><p>Tuttavia, questo è un esempio riduttivo, dato che molti indirizzi email non validi soddisfano comunque questa regex.</p><h4 id="acquisire-il-testo-tra-virgolette-doppie">Acquisire il testo tra virgolette doppie</h4><p>Supponi di avere una stringa che contiene qualcosa tra virgolette doppie e di voler estrarre quel contenuto.</p><p>Il modo migliore per farlo è usare un gruppo di acquisizione, in quanto sappiamo che la parte di interesse inizia e termina con <code>"</code>, e possiamo facilmente selezionarla, ma vogliamo anche rimuovere le virgolette dal risultato.</p><p>Troveremo ciò che ci serve in <code>result[1]</code>:</p><pre><code class="language-js">const hello = 'Hello "nice flower"'
const result = /"([^']*)"/.exec(hello)
// Array [ "\"nice flower\"", "nice flower" ]</code></pre><h4 id="ottenere-il-contenuto-di-un-tag-html"><strong>Ottenere il contenuto di un tag HTML</strong></h4><p>Per esempio, possiamo ottenere il contenuto di un tag span, consentendo qualsiasi numero di argomenti nel tag:</p><pre><code class="language-js">/&lt;span\b[^&gt;]*&gt;(.*?)&lt;\/span&gt;/

/&lt;span\b[^&gt;]*&gt;(.*?)&lt;\/span&gt;/.exec('test')
// null

/&lt;span\b[^&gt;]*&gt;(.*?)&lt;\/span&gt;/.exec('&lt;span&gt;test&lt;/span&gt;')
// ["&lt;span&gt;test&lt;/span&gt;", "test"]

/&lt;span\b[^&gt;]*&gt;(.*?)&lt;\/span&gt;/.exec('&lt;span class="x"&gt;test&lt;/span&gt;')
// ["&lt;span class="x"&gt;test&lt;/span&gt;", "test"]
</code></pre><p>Vuoi imparare JavaScript? Scarica il mio <a href="https://flaviocopes.com/page/javascript-handbook" rel="noopener ugc nofollow">JavaScript Handbook</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Controllare se un Oggetto è Vuoto in JavaScript – Equivalente JS di isEmpty in Java ]]>
                </title>
                <description>
                    <![CDATA[ Gli oggetti costituiscono il tipo di dato più utilizzato nella programmazione. Un oggetto è un insieme di dati correlati memorizzati come coppie chiave-valore. Ad esempio: let userDetails = {   name: "John Doe",   username: "jonnydoe",   age: 14, } Quando lavori con gli oggetti, potresti dover ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-controllare-se-un-oggetto-e-vuoto-in-javascript/</link>
                <guid isPermaLink="false">64353ecf88ecf5067c890c15</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Thu, 13 Apr 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/emptyobj.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/check-if-an-object-is-empty-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Check if an Object is Empty in JavaScript – JS Java isEmpty Equivalent</a>
      </p><p>Gli oggetti costituiscono il tipo di dato più utilizzato nella programmazione. Un oggetto è un insieme di dati correlati memorizzati come coppie chiave-valore. Ad esempio:</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14,
}
</code></pre><p>Quando lavori con gli oggetti, potresti dover verificare se un oggetto è vuoto prima di svolgere un'operazione.</p><p>In JavaScript esistono vari modi per controllare se un oggetto è vuoto. In questo articolo, imparerai le varie strategie utilizzabili, quali sono le opzioni che puoi applicare e perché.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> un oggetto è considerato vuoto se non ha coppie chiave-valore.</p><p>Se sei di fretta, ecco un esempio molto semplice::</p><pre><code class="language-js">const myEmptyObj = {};

// Funziona meglio con i browser nuovi
Object.keys(myEmptyObj).length === 0 &amp;&amp; myEmptyObj.constructor === Object

// Funziona con tutti i browser
_.isEmpty(myEmptyObj)
</code></pre><p>Entrambi i metodi restituiranno <code>true</code>. Adesso cerchiamo di capire questo codice e le altre opzioni che puoi usare per verificare se un oggetto è vuoto in JavaScript.</p><h2 id="come-controllare-se-un-oggetto-vuoto-con-object-keys-"><strong>Come controllare se un oggetto è vuoto con <code>Object.keys()</code></strong></h2><p>Il metodo <code>Object.keys()</code> è un metodo statico per oggetti introdotto con ECMAScript6 (ES6) e supportato da tutti i browser moderni. Questo metodo restituisce un array con le chiavi di un oggetto. Ad esempio:</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

console.log(Object.keys(userDetails)); // ["name","username","age"]
</code></pre><p>A questo, puoi applicare la proprietà <code>.length</code>. Se restituisce zero, l'oggetto è vuoto.</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};

console.log(Object.keys(userDetails).length); // 3
console.log(Object.keys(myEmptyObj).length); // 0
</code></pre><p>Puoi usare questo metodo per controllare se un oggetto è vuoto con un'istruzione if oppure creando una funzione apposita.</p><pre><code class="language-js">const isObjectEmpty = (objectName) =&gt; {
  return Object.keys(objectName).length === 0
}
</code></pre><p>Restituirà <code>true</code> o <code>false</code>. Se l'oggetto è vuoto, restituirà <code>true</code>, altrimenti restituirà <code>false</code>.</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};

const isObjectEmpty = (objectName) =&gt; {
  return Object.keys(objectName).length === 0
}

console.log(isObjectEmpty(userDetails)); // false
console.log(isObjectEmpty(myEmptyObj)); // true
</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> controllare soltanto la lunghezza non è l'opzione migliore quando vuoi verificare che un oggetto o qualsiasi altro tipo di dato sia vuoto. È sempre meglio avere conferma che il tipo di dato sia corretto.</p><p>A questo scopo puoi controllare il costruttore:</p><pre><code class="language-js">const isObjectEmpty = (objectName) =&gt; {
  return Object.keys(objectName).length === 0 &amp;&amp; objectName.constructor === Object;
}
</code></pre><p>In tal modo, puoi eseguire una verifica più approfondita.</p><p>Finora è andato tutto bene, ma potresti voler evitare di ottenere un <code>TypeError</code> quando una variabile è <code>undefined</code> o un valore <code>null</code> viene passato invece di <code>{}</code>. Per risolvere questo problema puoi aggiungere un controllo extra:</p><pre><code class="language-js">const isObjectEmpty = (objectName) =&gt; {
  return (
    objectName &amp;&amp;
    Object.keys(objectName).length === 0 &amp;&amp;
    objectName.constructor === Object
  );
};
</code></pre><p>Nel codice qui sopra, è stato aggiunto un ulteriore controllo. Questo vuol dire che verrà restituito <code>null</code> o <code>undefined</code> se non si tratta di un oggetto vuoto, come mostrato nell'esempio seguente:</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};
let nullObj = null;
let undefinedObj;

const isObjectEmpty = (objectName) =&gt; {
  return (
    objectName &amp;&amp;
    Object.keys(objectName).length === 0 &amp;&amp;
    objectName.constructor === Object
  );
};

console.log(isObjectEmpty(userDetails)); // false
console.log(isObjectEmpty(myEmptyObj)); // true
console.log(isObjectEmpty(undefinedObj)); // undefined
console.log(isObjectEmpty(nullObj)); // null
</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> ciò vale anche per altri metodi statici per oggetti, ovvero puoi usare <code>Object.entries()</code> o <code>Object.values()</code> invece di <code>Object.keys()</code>.</p><h2 id="come-verificare-se-un-oggetto-vuoto-con-un-loop-for-in"><strong>Come verificare se un oggetto è vuoto con un loop <code>for…in</code></strong></h2><p>Un altro metodo che puoi usare è il loop <code>for…in</code> introdotto con ES6. Puoi usare questo loop insieme al metodo <code>hasOwnProperty()</code>.</p><pre><code class="language-js">const isObjectEmpty = (objectName) =&gt; {
  for (let prop in objectName) {
    if (objectName.hasOwnProperty(prop)) {
      return false;
    }
  }
  return true;
};
</code></pre><p>Il codice qui sopra itererà su ogni proprietà dell'oggetto. Se avviene una singola iterazione, l'oggetto non è vuoto. Inoltre, <code>hasOwnProperty()</code> restituirà un booleano che indica se l'oggetto possiede la proprietà specificata.</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};

const isObjectEmpty = (objectName) =&gt; {
  for (let prop in objectName) {
    if (objectName.hasOwnProperty(prop)) {
      return false;
    }
  }
  return true;
};

console.log(isObjectEmpty(userDetails)); // false
console.log(isObjectEmpty(myEmptyObj)); // true
</code></pre><h2 id="come-verificare-se-un-oggetto-vuoto-con-json-stringify-"><strong>Come verificare se un oggetto è vuoto con <code>JSON.stringify()</code></strong></h2><p>Puoi anche utilizzare il metodo <code>JSON.stingify()</code>, che serve per convertire un valore JavaScript in una stringa JSON. Questo vuol dire che convertirà i valori del tuo oggetto in una stringa. Ad esempio:</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

console.log(JSON.stringify(userDetails)); 

Output:
"{'name':'John Doe','username':'jonnydoe','age':14}"
</code></pre><p>Quando l'oggetto è vuoto, restituisce <code>"{}"</code>. Puoi usare questo valore per controllare se l'oggetto è vuoto.</p><pre><code class="language-js">const isObjectEmpty = (objectName) =&gt; {
  return JSON.stringify(objectName) === "{}";
};
</code></pre><p>Restituirà <code>true</code> se l'oggetto è vuoto, oppure <code>false</code>:</p><pre><code class="language-js">let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};

const isObjectEmpty = (objectName) =&gt; {
  return JSON.stringify(objectName) === "{}";
};

console.log(isObjectEmpty(userDetails)); // false
console.log(isObjectEmpty(myEmptyObj)); // true
</code></pre><h2 id="come-verificare-se-un-oggetto-vuoto-con-lodash"><strong>Come verificare se un oggetto è vuoto con Lodash</strong></h2><p>Alcuni dei metodi che ho spiegato potrebbero andare bene per i browser più vecchi, ma potrebbero non funzionare con altri. Se ti interessa trovare una soluzione che funzioni sia per le versioni vecchie che per quelle moderne, puoi usare <a href="https://lodash.com/">Lodash</a>.</p><p>Lodash è una libreria di utilità JavaScript moderna che può svolgere svariate funzionalità con una sintassi molto semplice.</p><p>Ad esempio, se vuoi controllare che un oggetto sia vuoto, devi soltanto usare il metodo "isEmpty".</p><pre><code class="language-js">_.isEmpty(objectName);
</code></pre><p>Installare Lodash nei tuoi progetti è piuttosto facile. Tutto ciò che devi fare è usare questo comando:</p><pre><code class="language-js">$ npm install lodash
</code></pre><p>Adesso puoi inizializzare il metodo con il trattino basso e utilizzarlo.</p><pre><code class="language-js">const _ = require('lodash');

let userDetails = {
  name: "John Doe",
  username: "jonnydoe",
  age: 14
};

let myEmptyObj = {};

const isObjectEmpty = (objectName) =&gt; {
  return _.isEmpty(objectName);
};

console.log(isObjectEmpty(userDetails)); // false
console.log(isObjectEmpty(myEmptyObj)); // true
</code></pre><h2 id="ecco-fatto-"><strong>Ecco fatto! 💪</strong></h2><p>Mi sono divertito molto a esplorare i diversi modi con cui puoi verificare che un oggetto sia vuoto. Usa il metodo che si presta meglio alle tue necessità.</p><p>Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Verificare se una Stringa JavaScript è un URL Valido ]]>
                </title>
                <description>
                    <![CDATA[ Un URL – o Uniform Resource Locator – è un testo usato per identificare risorse come pagine web, immagini e video su internet. Gli URL sono chiamati comunemente indirizzi dei siti web e vengono usati per trasferire file, per le email e altre applicazioni. Gli URL consistono di più parti ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-verificare-se-una-stringa-javascript-e-un-url-valido/</link>
                <guid isPermaLink="false">643289e488ecf5067c8902a8</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 11 Apr 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/freecodecamp_new.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/check-if-a-javascript-string-is-a-url/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Check if a JavaScript String is a Valid URL</a>
      </p><p>Un URL – o Uniform Resource Locator – è un testo usato per identificare risorse come pagine web, immagini e video su internet.</p><p>Gli URL sono chiamati comunemente indirizzi dei siti web e vengono usati per trasferire file, per le email e altre applicazioni.</p><p>Gli URL consistono di più parti – protocollo, nome di dominio e via dicendo – che dicono al browser come e dove recuperare la risorsa.</p><p>In JavaScript, potresti usare un URL in un tag di ancoraggio o un pulsante per rimandare l'utente a un'altra pagina web. In una situazione del genere, questa stringa URL deve essere verificata per assicurarsi che sia valida.</p><p>Questo tutorial ti mostrerà alcuni modi per verificare se una stringa JavaScript è un URL valido.</p><p>Per imparare come ottenere l'URL corrente in JavaScript, puoi leggere <a href="https://www.jsowl.com/how-to-get-the-current-url-in-javascript/">questo articolo</a> (risorsa in inglese).</p><h2 id="come-verificare-se-una-stringa-un-url-valido-usando-un-espressione-regolare"><strong>Come verificare se una stringa è un URL valido usando un'espressione regolare</strong></h2><p>Le espressioni regolari (regex) sono dei pattern (modelli) che indicano combinazioni di caratteri in una stringa. In JavaScript, le <a href="https://www.freecodecamp.org/news/a-quick-and-simple-guide-to-javascript-regular-expressions-48b46a68df29/">espressioni regolari</a> sono degli oggetti che offrono diversi metodi per svolgere operazioni varie.</p><p>Puoi costruire un'espressione regolare in due modi:</p><ul><li>Usando un'espressione regolare letterale</li><li>Usando il costruttore RegEx</li></ul><p><strong><strong>Not</strong>a<strong>:</strong></strong> è consigliabile usare il metodo letterale quando vuoi soltanto verificare se una stringa è un URL valido senza creare alcun oggetto aggiuntivo.</p><p>Vediamo come funzionano questi due metodi.</p><h3 id="come-usare-le-espressioni-regolari-letterali"><strong>Come usare le espressioni regolari letterali</strong></h3><p>In un'espressione regolare letterale, il pattern è racchiuso tra barre oblique, come puoi vedere di seguito.</p><p>Il pattern include la validazione delle parti necessarie per l'URL. Ad esempio, un protocollo, <code>https</code>, le barre, <code>//</code>, e via dicendo.</p><pre><code>const urlPattern = /(?:https?):\/\/(\w+:?\w*)?(\S+)(:\d+)?(\/|\/([\w#!:.?+=&amp;%!\-\/]))?/;
</code></pre><h3 id="come-usare-il-costruttore-di-espressioni-regolari"><strong>Come usare il costruttore di espressioni regolari</strong></h3><p>Per creare un'espressione regolare usando l'approccio del costruttore, usa il costruttore <code>RegExp()</code> e passa il pattern come parametro.</p><pre><code>const urlPattern = new RegExp('(?:https?):\/\/(\w+:?\w*)?(\S+)(:\d+)?(\/|\/([\w#!:.?+=&amp;%!\-\/]))?');
</code></pre><p>Per dimostrare come verificare se una stringa è un URL, creiamo un metodo che validerà la stringa JavaScript usando il costruttore di espressioni regolari, restituendo vero o falso in base al riscontro.</p><pre><code class="language-js">	const isValidUrl = urlString=&gt; {
	  	var urlPattern = new RegExp('^(https?:\\/\\/)?'+ // protocollo
	    '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // nome dominio
	    '((\\d{1,3}\\.){3}\\d{1,3}))'+ // o indirizzo ip (v4)
	    '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // porta e percorso
	    '(\\?[;&amp;a-z\\d%_.~+=-]*)?'+ // query string
	    '(\\#[-a-z\\d_]*)?$','i'); // fragment locator
	  return !!urlPattern.test(urlString);
	}
</code></pre><h3 id="come-usare-un-espressione-regolare-per-validare-un-url"><strong>Come usare un'espressione regolare per validare un URL</strong></h3><p>Il seguente codice mostra come validare diverse stringhe URL usando il metodo appena creato:</p><pre><code class="language-js">	var url = "invalidURL";
	console.log(isValidUrl(url));      //false
	 
	var url = "htt//jsowl";            //false
	console.log(isValidUrl(url));
	
    var url = "www.jsowl.com";         //true
    console.log(isValidUrl(url));
    
    var url = "https://www.jsowl.com"; //true
    console.log(isValidUrl(url));
    
    var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
    console.log(isValidUrl(url));      //true
</code></pre><h2 id="come-verificare-se-una-stringa-un-url-valido-usando-il-costruttore-url"><strong>Come verificare se una stringa è un URL valido usando il costruttore URL</strong></h2><p>Puoi usare il costruttore URL per verificare se una stringa è un URL valido.</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/API/URL">Il costruttore URL</a> (<code>new URL(url)</code>) restituisce un oggetto URL definito dai parametri URL.</p><p>Se l'URL dato non è valido, JavaScript dà un'eccezione <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError"><code>TypeError</code></a>.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> è indicato usare questo approccio quando vuoi costruire un oggetto URL nel tuo programma per ulteriori utilizzi.</p><h3 id="sintassi-del-costruttore-url"><strong>Sintassi del costruttore URL</strong></h3><p>La seguente sintassi spiega come creare un oggetto URL con una stringa JavaScript.</p><pre><code>new URL(url);
new URL(url, base);
</code></pre><p>Dove,</p><ul><li><code>url</code> è una stringa o qualsiasi oggetto dotato di uno <a href="https://developer.mozilla.org/en-US/docs/Glossary/Stringifier">stringifier</a> che rappresenta un URL assoluto o relativo. Se l'URL è assoluto, <code>base</code> va ignorato. Se l'URL è relativo, è richiesto anche <code>base</code>.</li><li><code>base</code> (opzionale) è una stringa che rappresenta l'URL base. Deve essere passato quando l'URL è relativo. Risulta <em><em>undefined</em></em> quando ignorato.</li></ul><h3 id="esempio-del-metodo-costruttore-url"><strong>Esempio del metodo costruttore URL</strong></h3><p>Per dimostrare come funziona il costruttore URL, creiamo una funzione lambda per costruire un nuovo URL con la stringa passata.</p><ul><li>Se la stringa è un URL valido, viene creato un oggetto URL e viene restituito <code>true</code></li><li>Se la stringa non è un URL valido, si verifica un <code>TypeError</code> e viene restituito <code>false</code></li></ul><pre><code>const isValidUrl = urlString=&gt; {
      try { 
      	return Boolean(new URL(urlString)); 
      }
      catch(e){ 
      	return false; 
      }
  }
</code></pre><h3 id="come-usare-il-metodo-isvalidurl-"><strong>Come usare il metodo <code>isValidURL()</code></strong></h3><p>Invochiamo il metodo <code>isValidURL()</code> per diversi tipi di stringhe e vediamo i risultati.</p><pre><code>  var url = "invalidURL";
  console.log(isValidUrl(url));     //false
  
  var url = "htt//jsowl";
  console.log(isValidUrl(url));     //false
  
  var url = "www.jsowl.com";
  console.log(isValidUrl(url));     //false
  
  var url = "tcp://www.jsowl.com";
  console.log(isValidUrl(url));     //true
  
  var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
  console.log(isValidUrl(url));     //true
</code></pre><p>Nei primi tre casi, puoi vedere che è stata passata una stringa che <em>non è un URL valido</em>. Come risultato, la creazione dell'oggetto URL fallisce con un <code>TypeError</code> e viene restituito <code>false</code>.</p><p>Negli ultimi due casi, è stato passato un<em> URL valido</em>. Quindi viene creato un oggetto URL e viene restituito <code>true</code>, confermando che l'URL è corretto.</p><p>Vediamo un altro esempio per validare una parte specifica di un URL.</p><p>In questo esempio, valideremo un protocollo specifico nell'URL, che dovrà contenere il protocollo <code>http</code> o <code>https</code>.</p><pre><code>	const isValidUrl = urlString=&gt; {
		let url;
		try { 
	      	url =new URL(urlString); 
	    }
	    catch(e){ 
	      return false; 
	    }
	    return url.protocol === "http:" || url.protocol === "https:";
	}
</code></pre><h3 id="esempio-di-come-validare-una-parte-di-un-url"><strong>Esempio di come validare una parte di un URL</strong></h3><p>Invochiamo il metodo <code>isValidURL()</code> per diversi tipi di stringhe e protocolli e vediamo i risultati.</p><pre><code>var url = "tcp://www.jsowl.com";
console.log(isValidUrl(url));      //false

var url = "https://www.jsowl.com";
console.log(isValidUrl(url));      //true
</code></pre><p>Nel primo caso, la stringa <em><em>(tcp://www.jsowl.com)</em></em> è un URL valido, ma non contiene un protocollo specifico (<code>HTTP</code>/<code>HTTPS</code>). Quindi viene restituito <code>false</code>.</p><p>Nel secondo caso, la stringa <em><em><a href="https://www.jsowl.com/">https://www.jsowl.com</a></em></em> è un URL <em><em>valid</em>o</em> e contiene il protocollo specifico, quindi viene restituito <code>true</code>.</p><h2 id="come-verificare-se-una-stringa-un-url-valido-con-un-elemento-input"><strong>Come verificare se una stringa è un URL valido con un elemento input</strong></h2><p>L'HTML supporta gli elementi input di tipo <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/url"><code>url</code></a>, per rappresentare in modo specifico gli URL.</p><p>L'attributo <code>value</code> di un elemento <code>&lt;input&gt;</code> contenente la stringa viene validato automaticamente dal confronto con la sintassi URL (<em>come un URL vuoto o formato in modo appropriato</em>) prima che il modulo sia inviato.</p><p>Il metodo <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/checkValidity"><code>HTMLInputElement.checkValidity()</code></a> viene usato per controllare se l'attributo value di un elemento <code>&lt;input&gt;</code> è un URL. Il metodo <code>checkvalidity()</code> restituisce <code>true</code> se il valore è un URL corretto e <code>false</code> se l'input non è un URL corretto.</p><p>Creiamo un metodo che genera un elemento input di tipo URL e lo valida usando il metodo <code>checkValidity()</code>.</p><pre><code>    const isValidUrl = urlString =&gt;{
      var inputElement = document.createElement('input');
      inputElement.type = 'url';
      inputElement.value = urlString;

      if (!inputElement.checkValidity()) {
        return false;
      } else {
        return true;
      }
    } 
</code></pre><p>Adesso usiamo questo metodo per validare diverse stringhe e vedere se sono URL validi.</p><pre><code>    var url = "invalidURL";
    console.log(isValidUrl(url));     //false
    
    var url = "htt//jsowl";
    console.log(isValidUrl(url));     //false
    
    var url = "www.jsowl.com";
    console.log(isValidUrl(url));     //false
    
    var url = "https://www.jsowl.com";
    console.log(isValidUrl(url));     //true
    
    var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
    console.log(isValidUrl(url));     //true
</code></pre><p>Ed ecco come puoi usare l'approccio input type per verificare se una stringa è un URL valido.</p><h2 id="come-verificare-se-una-stringa-un-url-valido-con-il-metodo-del-tag-di-ancoraggio"><strong>Come verificare se una stringa è un URL valido con il metodo del tag di ancoraggio</strong></h2><p>Questa sezione ti mostra come usare un <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement">HTMLAnchorElement</a> per controllare se una stringa JavaScript è un URL.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> è consigliabile usare questo metodo quando vuoi assegnare un URL a un tag di ancoraggio e assicurarti che la stringa sia un URL valido.</p><p>L'interfaccia <code>HTMLAnchorElement</code> rappresenta degli elementi hyperlink. Fornisce proprietà e metodi speciali per manipolare il layout e la presentazione di tali elementi. Viene anche chiamata tag di ancoraggio.</p><p>Puoi assegnare un URL a un tag di ancoraggio usando l'attributo <code>href</code>. Nell'assegnazione,</p><ul><li>Se la stringa passata è un URL valido, viene assegnata al tag di ancoraggio</li><li>Se la stringa passata non è un URL valido, la <a href="https://www.jsowl.com/how-to-get-the-current-url-in-jquery/">posizione attuale del browser</a> viene assegnata al tag </li><li>Di default, il tag di ancoraggio avrà un URL vuoto (“”)</li></ul><p>Una volta che l'URL è assegnato, puoi estrarre una parte specifica dell'URL usando gli attributi spiegati di seguito.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Attributo</th>
<th>Utilizzo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>host</code></td>
<td>una stringa che rappresenta nome dell'host e porta</td>
</tr>
<tr>
<td><code>hostname</code></td>
<td>una stringa che rappresenta il nome dell'host</td>
</tr>
<tr>
<td><code>href</code></td>
<td>una stringa contenente un URL valido</td>
</tr>
<tr>
<td><code>origin</code></td>
<td>restituisce una stringa contenente origine, schema dominio e porta</td>
</tr>
<tr>
<td><code>port</code></td>
<td>una stringa che rappresenta la porta se specificata</td>
</tr>
<tr>
<td><code>protocol</code></td>
<td>una stringa che rappresenta il protocollo, incluso <code>:</code></td>
</tr>
<tr>
<td><code>pathname</code></td>
<td>una stringa che contiene il percorso URL dalla prima <code>/</code> senza query string</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Adesso vediamo come controllare se la stringa assegnata è un URL corretto.</p><p>Se lo è, viene assegnata al tag di ancoraggio. Altrimenti, gli sarà assegnata la posizione attuale del browser.</p><p>Quindi per vedere se l'URL è corretto, puoi controllare se l'<code>host</code> del tag di ancoraggio NON è uguale a quello della posizione attuale usando l'istruzione <code>a.host != window.location.host</code>.</p><p>Vediamo il codice.</p><p>Creiamo un funzione lambda e la assegniamo alla costante <code>isValidUrl</code>.</p><p>La funzione crea un tag di ancoraggio e gli assegna la stringa con l'URL. Dopodiché, verifica se l'attributo <code>host</code> dell'elemento è <code>null</code> o non definito.</p><p>Se non è null, verifica se l'attributo <code>host</code> NON è uguale alla posizione attuale del browser e restituisce <code>true</code> se non è uguale.</p><p>Questo perché se l'URL passato è valido, il tag di ancoraggio avrà un valore URL. Ma se l'URL non è valido, il tag di ancoraggio avrà la posizione attuale del browser. In questo caso, la funzione lambda restituisce <code>false</code>.</p><pre><code>const isValidUrl = urlString =&gt;{	
  	var a  = document.createElement('a');
   	a.href = urlString;
   	return (a.host &amp;&amp; a.host != window.location.host);
  }
</code></pre><p>Il codice seguente invoca la funzione lambda <code>isValidUrl()</code> con input differenti e stampa l'output sulla console.</p><pre><code class="language-js">  var url = "invalidURL";
  console.log("1.AnchorTag:  " +isValidUrl(url));    //false
  
  var url = "htt//jsowl";
  console.log("22.AnchorTag:  "+isValidUrl(url));    //false
  
  var url = "www.jsowl.com";  
  console.log("3.AnchorTag:  " +isValidUrl(url));    //false  
  
  var url = "https://www.jsowl.com";  
  console.log("4.AnchorTag:  " +isValidUrl(url));    //true 
  
  var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
  console.log("5.AnchorTag:  " +isValidUrl(url));    //true 
</code></pre><p>Questo tutorial è disponibile in <a href="https://jsfiddle.net/jsowl/mvzqh4of/266/">questo</a> JSFiddle.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo hai imparato come verificare se una stringa JavaScript è un URL usando diversi metodi e quando usare ogni metodo.</p><p>Se ti è piaciuto questo articolo, condividilo.</p><p>Puoi vedere i miei altri tutorial <a href="https://www.jsowl.com/">sul mio blog, JS Owl</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Buone Pratiche di React – Suggerimenti per Scrivere del Codice React Migliore nel 2022 ]]>
                </title>
                <description>
                    <![CDATA[ Due anni fa, ho iniziato a imparare e a usare React, e oggi continuo a usarlo per il mio lavoro di sviluppatore software e per progetti personali. In questo tempo ho incontrato un sacco ti problemi "tipici". Così ho cercato in giro e ho trovato alcune buone pratiche che ho ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/buone-pratiche-di-react-suggerimenti-per-scrivere-del-codice-react-migliore-nel-2022/</link>
                <guid isPermaLink="false">62fe028b03346c07472e9d49</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Wed, 22 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/08/React-Best-Practices-Thumbnail.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/best-practices-for-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Best Practices – Tips for Writing Better React Code</a>
      </p><p>Due anni fa, ho iniziato a imparare e a usare React, e oggi continuo a usarlo per il mio lavoro di sviluppatore software e per progetti personali.</p><p>In questo tempo ho incontrato un sacco ti problemi "tipici". Così ho cercato in giro e ho trovato alcune buone pratiche che ho integrato nel mio flusso di lavoro e che hanno reso più semplice la mia vita e quella dei miei colleghi.</p><p>Durante questo percorso ho anche affrontato sfide che all'inizio non ho risolto al meglio e a cui voglio approcciarmi in un modo migliore in futuro.</p><p>Questa è la ragione per cui ho scritto questa guida. A cui penso come a una raccolta di suggerimenti che avrei voluto dare a me stesso due anni fa, quando ho iniziato.</p><h2 id="indice-"><strong>Indice:</strong></h2><ul><li><a href="#le-tre-sfide-che-ogni-sviluppatore-react-affronta">Le tre sfide che ogni sviluppatore React affronta</a></li><li><a href="#imparare-gli-elementi-fondamentali-di-react">Imparare gli elementi fondamentali di React</a></li><li><a href="#come-realizzare-dei-componenti-react-puliti-prestanti-e-manutenibili">Come realizzare dei componenti React puliti, prestanti e manutenibili</a></li><li><a href="#suggerimenti-per-scrivere-del-codice-react-migliore-la-ciliegina-sulla-torta">Suggerimenti per scrivere del codice React migliore – La ciliegina sulla torta</a></li><li><a href="#conclusione">Conclusione</a></li></ul><p>Innanzitutto, conoscerai le <strong>tre sfide principali </strong>che ogni sviluppatore React deve affrontare. Questo è importante perché quando sei cosciente delle potenziali sfide, capirai le ragioni alla base di queste buone pratiche in modo più profondo. Avere questa mentalità dall'inizio può essere d'aiuto anche quando stai progettando dei componenti o organizzando un progetto.</p><p>Dopo questo primo importante passo, ti parlerò di <strong>tre buone pratiche</strong>. Sono un mix di suggerimenti teorici e pratici con esempi di codice. Proverò a minimizzare i problemi in stile <em>hello world</em> e arrivare a ciò che ho visto nel <em>mondo reale</em>.</p><h2 id="le-tre-sfide-che-ogni-sviluppatore-react-affronta"><strong>Le tre sfide che ogni sviluppatore React affronta</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/christian-erfurt-sxQz2VfoFBE-unsplash.jpg" class="kg-image" alt="christian-erfurt-sxQz2VfoFBE-unsplash" width="600" height="400" loading="lazy"></figure><p>Durante i miei due anni di uso quotidiano di React, ho individuato tre sfide principali che uno sviluppatore React deve affrontare per realizzare le proprie app. Ignorare queste difficoltà potrebbe portare a momenti difficili che nuocciono alla crescita dell'app.</p><p>Quindi, tieni a mente questi problemi quando orchestri la tua app, perché ti risparmieranno tempo ed energie.</p><h3 id="-manutenibilit-"><strong>⚙️ Manutenibilità</strong></h3><p>Questo va a braccetto con la <em>riusabilità</em>. All'inizio, quando l'applicazione e i componenti sono molto leggeri, è semplice fare manutenzione. Ma una volta che le esigenze iniziano a crescere, i componenti tendono a diventare molto complessi e perciò più difficili da gestire.</p><p>Spesso ho visto un componente con molti casi diversi, ognuno che rappresenta un risultato diverso. Il JSX è inondato da rendering condizionale (operatori ternari e semplici operatori <code>&amp;&amp;</code>), classname applicati in modo condizionale o componenti che usano un'istruzione <code>switch</code> enorme. Ci sono molti possibili valori di prop e stati, ognuno responsabile di un risultato diverso.</p><p>Secondo me, non c'è niente di sbagliato in queste tecniche in quanto tali. Ma credo che tutti dovrebbero pensare a cosa fare quando un componente inizia a diventare poco manutenibile e quando queste tecniche vengono usate eccessivamente. Impareremo come controllare questo aspetto più avanti in questo articolo.</p><p>Il problema (e ne sono colpevole anch'io) è che maggiori sono la complessità e i diversi risultati di un componente (polimorfismo), più questo risulta difficile da gestire.</p><p>A essere onesto, la causa principale è spesso la pigrizia, esperienza insufficiente o mancanza di tempo per fare il refactoring di un componente in modo adeguato, così da renderlo più gestibile e pulito.</p><p>Un altro fattore chiave che ho visto è l'insufficienza o la mancanza di test. Lo so, non è un tipo di lavoro che molti sviluppatori amano, ma può davvero essere d'aiuto sul lungo termine. </p><h3 id="-solida-conoscenza-di-react"><strong>🧠 Solida conoscenza di React</strong></h3><p>Un'altra causa principale dei problemi degli sviluppatori React è una scarsa comprensione del funzionamento di base di React. Ci sono passato anch'io.</p><p>Ho visto molte persone saltare troppo velocemente in concetti intermedi o avanzati senza avere basi solide. Ma questo non è specifico di React, bensì è un problema generale nella programmazione.</p><p>Non avere delle conoscenze solide di React può anche causare problemi a te come sviluppatore. Ricordo i mal di testa avuti quando volevo usare diversi cicli di vita di componenti senza sapere effettivamente come farlo. Quindi ho dovuto fare qualche passo indietro e poi approfondire l'argomento.</p><p>Dato che ritengo che sia uno degli aspetti più importanti, gli ho dedicato un intero capitolo all'interno di questo articolo.</p><h3 id="-scalabilit-"><strong>📈 Scalabilità</strong></h3><p>Questa sfida va a braccetto con la <em>manutenibilità</em>. Non è specifica per React, ma si applica in genere ai software.</p><p>Ho imparato che per realizzare dei software eccellenti non contano solo esperienza utente, schemi di codice puliti o un'architettura ingegnosa. Per me, la qualità di un software aumenta o diminuisce in base alla possibilità di essere scalato.</p><p>Molte cose entrano in gioco nell'aumentare la scalabilità di un software. In questo articolo troverai dei suggerimenti utili a questo riguardo.</p><p>Credo che tenendo a mente la <em>manutenibilità </em>e la <em>scalabilità </em>quando orchestri i tuoi componenti e organizzi la struttura del progetto, sia meno probabile che tu finisca per avere un codice sorgente incasinato che ha bisogno di un refactoring.</p><h1 id="come-imparare-react"><strong>Come imparare React</strong></h1><p>Bene, adesso affrontiamo approfonditamente delle buone pratiche per imparare a usare React.</p><h2 id="imparare-gli-elementi-fondamentali-di-react"><strong>Imparare gli elementi fondamentali di React</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/brett-jordan-Lzfxzip-pNI-unsplash.jpg" class="kg-image" alt="brett-jordan-Lzfxzip-pNI-unsplash" width="600" height="400" loading="lazy"></figure><p>Come abbiamo già discusso brevemente, conoscere gli elementi fondamentali non è importante soltanto per React, ma anche per qualsiasi altra tecnologia o linguaggio di programmazione. Non puoi costruire un grattacielo su delle fondazioni di sabbia e aspettarti che sia stabile.</p><p>Potrebbe sembrare ovvio per molti di voi, ma ho visto sviluppatori saltare direttamente a concetti di React intermedi o avanzati senza comprenderne davvero le basi.</p><p>Questo è vero anche per JavaScript in generale. Credo fortemente che imparare React non ha senso se non hai delle solide basi di JavaScript vanilla (JS senza framework o librerie aggiuntive).</p><p>Se ti sembra qualcosa di familiare e stai pensando di imparare a usare React ma non ti senti ancora a tuo agio con JavaScript, dedica prima del tempo a rafforzare le tue conoscenze di JavaScript. In futuro, ti risparmierà un sacco di mal di testa e di tempo.</p><p>Ecco una guida utile per <a href="https://www.freecodecamp.org/italian/news/i-principali-concetti-javascript-da-conoscere-prima-di-imparare-react/">i concetti di JavaScript più importanti che devi conoscere prima di passare a React</a>.</p><p>Ma, secondo me, conoscere soltanto le basi non è sufficiente. È in qualche modo obbligatorio conoscere il funzionamento di React dietro le quinte. Se vuoi diventare un bravo sviluppatore React (e immagino sia così, visto che stai leggendo questo articolo), devi conoscere gli strumenti che stai utilizzando. È un bene per te in quanto sviluppatore e per i tuoi clienti.</p><p>Da un lato può salvarti da un sacco di tempo dedicato al debugging della tua app. Inoltre ti rende più efficiente perché non devi fare dei passi indietro e imparare di nuovo le basi, ancora e ancora. In pratica, sai quello di cui stai parlando.</p><p>Naturalmente, non puoi sapere tutto e non dovresti stressarti per questo. Imparerai sempre di più quando ti troverai ad affrontare problemi pratici e costruire altri progetti, ma con delle conoscenze solide parti ben equipaggiato.</p><p>Direi che ha senso, ma potresti chiederti cosa hai bisogno di sapere esattamente per avere delle basi solide di React.</p><p>Lo stretto indispensabile è costituito da tutti gli argomenti presenti nei <a href="https://it.reactjs.org/docs/hello-world.html"><strong>Concetti Chiave</strong></a> della documentazione sul sito ufficiale di React.</p><p>Un altro argomento con cui dovresti avere familiarità è quello sugli <a href="https://it.reactjs.org/docs/hooks-intro.html">Hooks</a> perché sono diventati una convenzione e sono usati ovunque, specialmente in pacchetti React di terze parti.</p><p>Di certo potresti usare più di frequente <code>useState</code> e <code>useEffect</code>, ma è essenziale anche conoscerne altri come <code>useMemo</code>, <code>useCallback</code> o <code>useRef</code>.</p><p>C'è anche un altro capitolo chiamato <a href="https://it.reactjs.org/docs/accessibility.html">Guide Avanzate</a> che non considererei obbligatorio all'inizio, ma di cui raccomanderei vivamente di apprendere i concetti durante il tuo viaggio in React.</p><p>Come sempre, è spesso più semplice comprendere argomenti avanzati quando possiedi già un po' di esperienza pratica. Ma più cose apprendi da subito, meglio è.</p><p>Naturalmente non devi limitarti a seguire soltanto la documentazione di React. Anche seguire corsi online che trattano gli elementi essenziali, guardare tutorial o leggere blog fa parte della costruzione di solide basi. Prova quello che funziona meglio per te.</p><p>Se dovessi indicare quali sono i concetti più importanti da conoscere indispensabilmente, sceglierei questi:</p><ul><li>cos'è uno "stato"?</li><li>up e down di classe e componenti funzionali</li><li>cosa i ri-rendering dei componenti e come funzionano?</li><li>come attivare i ri-rendering</li><li>differenti cicli di vita dei componenti e come interagire con essi</li><li>DOM virtuale</li><li>Benefici di CSR (Client Side Rendering) e SSR (Server Side Rendering) in generale e in React</li><li>Componenti controllati vs non controllati</li><li>Spostamento di stato</li><li>almeno una tecnologia di gestione dello stato globale (Context API, Redux/Toolkit, Recoil)</li><li>Pattern di componenti (soprattutto come scegliere il giusto pattern)</li></ul><h2 id="come-realizzare-dei-componenti-react-puliti-prestanti-e-manutenibili"><strong>Come realizzare dei componenti React puliti, prestanti e manutenibili</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/wesley-tingey-mvLyHPRGLCs-unsplash.jpg" class="kg-image" alt="wesley-tingey-mvLyHPRGLCs-unsplash" width="600" height="400" loading="lazy"></figure><p>Lo so – questo è il sogno di ogni programmatore (o almeno spero sia così). E per me, questa abilità distingue un buon programmatore da un ottimo programmatore. La parte divertente è che non è mai tutto completo perché c'è sempre qualcosa di nuovo da imparare e migliorare.</p><p>Seguire le buone pratiche non renderà le cose più semplici solo a te, ma anche ai tuoi colleghi. Ho visto team di sviluppo che hanno creato una <em>guida di stile</em> in cui hanno definito dei capisaldi su come scrivere il codice. Un'idea che apprezzo molto.</p><p>Alcuni di essi sono:</p><ul><li>usare componenti funzionali (come le funzioni freccia)</li><li>non usare stili inline</li><li>mantenere una struttura di importazione appropriata (prima import di terze parti --&gt; poi import interni)</li><li>formattare il codice prima di un commit</li></ul><p>E via dicendo.</p><p>Naturalmente è possibile essere molti dettagliati a questo riguardo. Questo dipende dal tuo team. Personalmente, non amo le guide estremamente dettagliate perché penso che uno sviluppatore esperto dovrebbe avere una certa libertà e non dovrebbe essere troppo vincolato.</p><p>In ogni caso, una guida di stile è un buon modo per definire e mantenere delle buone pratiche e assicurarsi che il team sia allineato per quanto riguarda le questioni importanti. Credo che questo favorisca incredibilmente il lavoro di squadra e i risultati.</p><p>Diamo un'occhiata alle buone pratiche che riguardano la creazione di componenti puliti, prestanti e manutenibili. Mettiti comodo, tieni a portata qualcosa per prendere appunti e buon divertimento!</p><h3 id="-creare-una-buona-struttura-di-cartelle"><strong>📁 Creare una buona struttura di cartelle</strong></h3><p>Organizzare i tuoi file e cartelle all'interno di un'app React è obbligatorio per la manutenibilità e la scalabilità.</p><p>Una buona struttura di cartella dipende dalla dimensione dell'applicazione e del team, quindi non esiste una soluzione generale per questo. Soprattutto perché si tratta di un argomento molto discusso e dipende anche dalle preferenze personali.</p><p>Col tempo, però, si sono sviluppate alcune buone pratiche per le varie dimensioni di un'applicazione.</p><p><a href="https://www.robinwieruch.de/react-folder-structure/">Questo ottimo post</a> (risorsa in inglese) passa in rassegna cinque diverse dimensioni di un'app e introduce buone idee su come organizzare file e cartelle. Avere queste cose in mente quando pianifichi o avvii la tua applicazione può fare una differenza enorme sul lungo termine.</p><p>Non sovra-ingegnerizzarla, ma fai del tuo meglio per mantenere una strutturata appropriata che si adatti alla dimensione dell'applicazione e del team.</p><h3 id="-mantenere-un-ordine-di-import-strutturato"><strong>👇 Mantenere un ordine di import strutturato</strong></h3><p>Se hai già un po' di esperienza con React, potresti aver visto file rigonfi di istruzioni import. Potrebbero anche essere mescolati a import esterni da pacchetti di terze parti e import interni come altri componenti, funzioni di utilità, stili e molto altro.</p><p>Un esempio reale (tagliato):</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">import React, { useState, useEffect, useCallback } from "react";
import Typography from "@material-ui/core/Typography";
import Divider from "@material-ui/core/Divider";
import Title from "../components/Title";
import Navigation from "../components/Navigation";
import DialogActions from "@material-ui/core/DialogActions"
import { getServiceURL } from '../../utils/getServiceURL";
import Grid from "@material-ui/core/Grid";
import Paragraph from "../components/Paragprah";
import { sectionTitleEnum } from "../../constants";
import { useSelector, useDispatch } from "react-redux";
import Box from "@material-ui/core/Box";
import axios from 'axios';
import { DatePicker } from "@material-ui/pickers";
import { Formik } from "formik";
import CustomButton from "../components/CustomButton";
...</code></pre><figcaption>In realtà gli import occupano 55 righe.</figcaption></figure><p>Probabilmente ti sei accorto del problema qui. È difficile distinguere quali sono gli import di terze parti e quelli locali (interni). Non sono raggruppati e sembrano essere ovunque.</p><p>Una versione migliore:</p><pre><code class="language-javascript">import React, { useState, useEffect, useCallback } from "react";
import { useSelector, useDispatch } from "react-redux";
import { Formik } from "formik";
import axios from 'axios';
import Typography from "@material-ui/core/Typography";
import Divider from "@material-ui/core/Divider";
import Box from "@material-ui/core/Box";
import DialogActions from "@material-ui/core/DialogActions";
import Grid from "@material-ui/core/Grid";
import { DatePicker } from "@material-ui/pickers";

import { getServiceURL } from '../../utils/getServiceURL";
import { sectionTitleEnum } from "../../constants";
import CustomButton from "../components/CustomButton";
import Title from "../components/Title";
import Navigation from "../components/Navigation";
import Paragraph from "../components/Paragraph";
...</code></pre><p>La struttura è più chiara ed è molto semplice distinguere dove si trovano gli import esterni e interni. Certamente è possibile ottimizzare questa disposizione se stai usando più import (nel caso sia possibile :) ). Questo ti permette di importare tutti i componenti derivanti da material-ui tutti in una sola riga.</p><p>Ho visto altri sviluppatori a cui piace dividere la struttura degli import in tre parti:</p><p>Integrati (come 'react') --&gt; Esterni (moduli di node di terze parti) --&gt; Interni.</p><p>Puoi gestire tutto da solo oppure lasciar fare il lavoro a un <strong>linter</strong>.</p><h3 id="-imparare-diversi-schemi-di-componenti"><strong>📔 Imparare diversi schemi di componenti</strong></h3><p>Per fare in modo di non finire con del codice ingestibile e non scalabile, è essenziale imparare diversi pattern di componenti man mano che acquisisci esperienza con React.</p><p>Ma non è tutto. Conoscere i diversi pattern è un buon punto di partenza, ma l'aspetto più importante è sapere <strong>quando </strong>usare ognuno di essi per uno specifico problema.</p><p>Ogni pattern ha il suo scopo. Ad esempio, il <strong><strong>compound component pattern</strong></strong> evita il <em>prop-drilling</em> non necessario di molti livelli di componenti. Quindi, la prossima volta che inizi a passare delle prop attraverso 5 livelli di componenti per raggiungere alla fine il componente interessato dalla prop, comincerai a dirigere i componenti diversamente.</p><p>Una breve nota sul prop-drilling, visto che ho avuto molte discussioni in passato. Ci sono molte opinioni sul fatto che sia una cosa positiva o no. A me piace provare a pensare a un modo/pattern diverso se inizio a passare prop attraverso più di due livelli di componenti.</p><p>Ciò ti rende più efficiente come sviluppatore e fa sì che i componenti che scrivi siano più manutenibili e scalabili. Avere questi pattern nel tuo arsenale ti distingue dagli altri sviluppatori React. Ti consiglio vivamente di fare le tue ricerche, ma <a href="https://www.udemy.com/course/the-complete-guide-to-advanced-react-patterns/">questo corso</a> su Udemy mi ha aiutato molto.</p><h3 id="-usa-un-linter-e-segui-le-sue-regole"><strong>🔒Usa un linter e segui le sue regole</strong></h3><p>Un linter non ti aiuta soltanto a mantenere un ordire di import delle dipendenze distinguibile, ti aiuta a scrivere un codice migliore in generale.</p><p>Quando utilizzi <em><em>create-react-app</em></em>, ESLint è già configurato, ma puoi anche impostarlo completamente da solo o estendere un set di regole preconfigurato.</p><p>In pratica, un linter osserva il codice JavaScript che stai scrivendo e ti fa notare gli errori di cui ti accorgeresti probabilmente eseguendo il codice. Ci ho messo un po' per apprezzare davvero l'utilità di un linter, ma oggi non posso immaginare di lavorare senza.</p><p>Avere un linter è una cosa, ma seguire le sue regole è un'altra. Naturalmente puoi disabilitarlo, sia per una specifica riga di codice che per un intero file. Potrebbero esserci casi in cui ha senso farlo, ma per esperienza sono piuttosto rari.</p><p>Un altro grande vantaggio è che puoi anche regolare il controllo dello stile. È particolarmente utile per il lavoro in gruppo. Una volta che si è d'accordo su certe convenzioni su come scrivere e formattare il codice, è facile combinare ESLint con qualcosa simile a JSPrettify.</p><h3 id="-testare-il-codice"><strong>🧪 Testare il codice</strong></h3><p>Lo so, i test non sono la tua attività da sviluppatore preferita. Per me era così. All'inizio sembra un compito non necessario e fastidioso, e sul breve termine può essere vero. Ma sul lungo periodo – e quando un'applicazione cresce – è vitale.</p><p>Per me, i test sono diventati una pratica che mi assicura che sto facendo il mio lavoro in modo più professionale, creando software di migliore qualità.</p><p>In pratica, non c'è nulla di sbagliato con i test manuali effettuati da una persona, che non dovrebbero essere evitati completamente. Ma immagina di star integrando una nuova funzionalità e di voler essere sicuro che tutto funzioni a dovere. È un'attività che richiede tempo e favorisce l'errore umano.</p><p>Mentre stai scrivendo i test ti trovi già nel processo mentale di organizzare il codice in modo che passi i test. Per me è molto utile perché mi aiuta a capire quali insidie possono sorgere e a tenere un occhio su di esse.</p><p>Non ti tuffi direttamente a scrivere il tuo codice (cosa che non raccomando mai), ma pensi prima all'obiettivo.</p><p>Ad esempio, "Cosa dovrebbe fare uno specifico componente? Quali sono i casi limite rilevanti che devo testare? Posso rendere il componente più semplice in modo che abbia un solo scopo? ..."</p><p>Avere una visione del codice che stai per scrivere ti aiuta anche a mantenere alta l'attenzione per soddisfarla.</p><p>I test possono anche fungere da documentazione, perché per un nuovo sviluppatore non avvezzo al codebase può essere molto d'aiuto a capire le diverse parti del software e come ci si aspetta che funzionino.</p><p>Quindi non evitare i test perché sembrano un <em>lavoro extra</em>. La verità è che puoi risparmiare del tempo in futuro se li imposti appropriatamente.</p><p>Dai un'occhiata al <a href="https://it.reactjs.org/docs/testing.html">capitolo sui test della documentazione di React</a>, segui qualche tutorial sui test in React e inizia a scrivere una piccola applicazione TDD (test-driven development) o implementa dei test in una app su cui stai lavorando al momento.</p><h3 id="-integrare-typescript-o-usare-almeno-le-prop-di-default-e-prop-type-"><strong>🧰 Integrare Typescript (o usare almeno le prop di default e prop type)</strong></h3><p>Ricordo il mio primo progetto in React come sviluppatore software in cui il nostro gruppo ricevette un progetto in pratica già scritto da un'altra azienda. Abbiamo dovuto creare il progetto del client su di esso e Typescript era già integrato.</p><p>Fino a quel momento, io e i miei colleghi non avevamo molta esperienza con Typescript, dato che avevamo tutti un background in JavaScript vanilla.</p><p>Dopo poche settimane passate a lavorare sul progetto, abbiamo sentito che TypeScript non era un beneficio, ma un ostacolo che bloccava il nostro lavoro. Non stavamo proprio sfruttando i suoi vantaggi, perché avevamo definito tutto con tipo <em>any </em>per bloccare gli avvertimenti di Typescript.</p><p>Questo ci portò a decidere di rimuovere Typescript dal progetto e lavorare sul nostro terreno con JavaScript. All'inizio andò bene, ma man mano che il progetto diventava più complesso, iniziarono a venir fuori errori di tipo. Ciò ci fece dubitare della nostra decisione di sbarazzarci completamente di Typescript. Ma queste cose possono accadere e danno una preziosa esperienza per il futuro.</p><p>Queste circostanze mi hanno portato a dare a Typescript un'altra opportunità, così l'ho imparato nel mio tempo libero. Dopo avervi costruito alcuni progetti secondari, non potevo immaginare più la vita senza Typescript.</p><p>Usare Typescript ha molti lati positivi, come il controllo statico dei tipi, un migliore completamento del codice nel tuo IDE (intellisense), un'esperienza di sviluppo migliorata e l'individuazione di errori di tipo mentre scrivi il codice – tanto per nominarne alcuni.</p><p>D'altra parte, ci sono anche delle sfide, perché se non vieni da un background con linguaggi fortemente tipizzati (come Java o C#) potrebbe essere più difficile da afferrare all'inizio.</p><p>Ma posso dire che vale davvero la pena di impararlo e integrarlo. Ecco <a href="https://blog.bitsrc.io/5-strong-reasons-to-use-typescript-with-react-bc987da5d907">un bell'articolo</a> (risorsa in inglese) che può aiutarti ad avere una panoramica dei pro e dei contro dell'uso di Typescript in una applicazione React. E qui c'è <a href="https://www.freecodecamp.org/news/how-to-code-your-react-app-with-typescript/">un tutorial</a> (risorsa in inglese) su come programmare le tue app React in Typescript.</p><p>Ci potrebbero essere ragioni per cui non vuoi usare Typescript nella tua app React, va bene. Ma consiglio almeno di usare i prop-type e le default-prop per i tuoi componenti per essere sicuro di non fare confusione con le prop.</p><h3 id="-usare-lazy-loading-code-splitting"><strong>💎 Usare lazy-loading / code splitting</strong></h3><p>Se hai passato un po' di tempo nell'universo JavaScript e React, sei probabilmente incappato nell'<em>"impacchettamento" </em>(bundling). Per quelli che stanno sentendo questo termine per la prima volta, vediamo cosa dice la documentazione ufficiale di React:</p><blockquote>Molte applicazioni React hanno i loro file “impacchettati” usando strumenti come Webpack, Rollup oppure Browserify. Il processo di “impacchettamento” avviene prendendo tutti i file importati e unendoli tutti in un unico file, chiamato “bundle”. Questo file può essere poi incluso all’interno della pagina web per caricare l’intera applicazione tutta in una volta.</blockquote><p>In pratica, si tratta di un'ottima tecnica, ma con la crescita di una app si presenta una sfida. Il bundle inizia a crescere a sua volta. Soprattutto quando stai usando delle grandi librerie di terze parti come three.js.</p><p>L'insidia è che questo bundle ha bisogno di essere sempre caricato completamente, anche quando l'utente ha bisogno solo di una frazione del codice. Questo porta a problemi di prestazione perché può volerci un tempo eccessivamente lungo per caricare l'app.</p><p>Per evitarlo, esiste una tecnica chiamata <strong>code splitting</strong> in cui dividi i bundle nelle porzioni di codice di cui ha bisogno l'utente. Questa tecnica è supportata dalla maggior parte degli strumenti comuni come Webpack, Rollup, e Browserify. Il grande beneficio è che puoi creare più bundle e caricarli dinamicamente.</p><p>Dividere i bundle ti aiuta a caricare tramite <strong>lazy loading</strong> solo le cose necessarie all'utente.</p><p>Immagina di andare in un negozio di alimentari e di voler comprare solo delle banane, delle mele e del pane. In questo caso, non stai comprando tutta la merce a disposizione nel negozio, sei interessato solo a una porzione della merce a disposizione. Quindi? Compreresti tutto? Ci vorrebbe molto più tempo e sarebbe parecchio più costoso.</p><p>Credo sia importante essere consapevoli delle potenziali sfide che possono sorgere man mano che una app cresce e ci sono alcune tecniche a disposizione per liberarsene. Per approfondire, dai un'occhiata alla <a href="https://it.reactjs.org/docs/code-splitting.html">documentazione di React</a>.</p><h3 id="-estrarre-logica-riutilizzabile-in-hook-personalizzati"><strong>🗄️ Estrarre logica riutilizzabile in hook personalizzati</strong></h3><p>Secondo la documentazione di React:</p><blockquote><em>Gli hook ci consentono di riutilizzare la logica stateful senza dover cambiare la gerarchia dei componenti<em>.</em></em></blockquote><p>In pratica, si tratta di una soluzione migliore alle tecniche che erano usate precedentemente in combinazione con i componenti di classe. Se ti interessi di programmazione da un po', potresti ricordarti l'utilizzo di <strong>componenti di ordine superiore</strong> o <strong>render prop</strong>.</p><p>Ogni volta che ti trovi in una situazione in cui devi riutilizzare la stessa logica stateful già utilizzata in un altro componente funzionale, è un ottimo momento per creare un hook personalizzato. Al suo interno puoi incapsulare la logica e poi ti basterà chiamare l'hook come una funzione all'interno dei componenti.</p><p>Diamo un'occhiata a un esempio veloce in cui dobbiamo aggiornare la nostra interfaccia utente in base alla dimensione dello schermo e vogliamo tenere traccia della dimensione attuale della finestra ridimensionando manualmente la finestra del browser.</p><figure class="kg-card kg-code-card"><pre><code class="language-jsx">const ScreenDimensions = () =&gt; {
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });
  
  useEffect(() =&gt; {
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    window.addEventListener('resize', handleResize);
    handleResize();
    return () =&gt; window.removeEventListener('resize', handleResize);
  }, []);
  
  return (
  	&lt;&gt;
    	&lt;p&gt;Current screen width: {windowSize.width}&lt;/p&gt;
        &lt;p&gt;Current screen height: {windowSize.height}&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><figcaption>Grazie a: https://usehooks.com/useWindowSize/</figcaption></figure><p>Come puoi vedere, la soluzione è piuttosto diretta e non c'è nulla di sbagliato a definirlo così.</p><p>Adesso arriva la parte complessa. Immagina di voler usare la stessa logica in un altro componente, in cui renderizzare un'interfaccia utente diversa (una per smartphone e una per desktop) in base alla dimensione dello schermo.</p><p>Naturalmente, potremmo copiare la logica, incollarla, e il gioco è fatto. Ma questa non è una buona pratica, come potresti sapere dal principio DRY (Don't Repeat Yourself, ovvero "non ripeterti").</p><p>Se volessimo regolare la logica, dovremmo farlo in entrambi i componenti. E quando incolliamo la logica in ancora più componenti, diventa meno manutenibile e più favorevole agli errori.</p><p>Quindi, che faresti normalmente in un progetto JavaScript? Probabilmente definiresti una funzione che incapsula la logica e che può essere usata in molti posti diversi. È esattamente ciò che otteniamo con gli hook. Non sono nulla di più che funzioni JavaScript con alcune specialità di React perché stanno usando gli hook di React.</p><p>Vediamo come sarà il nostro hook personalizzato:</p><pre><code class="language-jsx">const useWindowSize = () =&gt; {
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });
  
  useEffect(() =&gt; {
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    window.addEventListener('resize', handleResize);
    handleResize();
    return () =&gt; window.removeEventListener('resize', handleResize);
  }, []);
  
  return windowSize;
}</code></pre><p>Adesso chiamiamolo semplicemente all'interno del componente <strong><strong>ScreenDimensions</strong></strong>:</p><pre><code class="language-jsx">const ScreenDimensions = () =&gt; {
  const windowSize = useWindowSize()
  
  return (
  	&lt;&gt;
    	&lt;p&gt;Current screen width: {windowSize.width}&lt;/p&gt;
        &lt;p&gt;Current screen height: {windowSize.height}&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><p>Ciò ci consente di chiamare semplicemente l'hook personalizzato in qualsiasi altro componente e salvare il valore di ritorno (che è la dimensione attuale della finestra) in una variabile che possiamo usare all'interno del componente.</p><pre><code class="language-jsx">const ResponsiveView = () =&gt; {
  const windowSize = useWindowSize()
  
  return (
  	&lt;&gt;
    	{windowSize.width &lt;= 960 ? (
          &lt;SmartphoneView /&gt;
        ) : (
          &lt;DesktopView /&gt;	
        )}
    &lt;/&gt;
  )
}</code></pre><h3 id="-gestire-efficacemente-gli-errori"><strong>🖥️ Gestire efficacemente gli errori</strong></h3><p>La gestione efficace degli errori è spesso trascurata e sottovalutata da molti sviluppatori. Come altre buone pratiche, sembra essere un aspetto secondario all'inizio. Vuoi far funzionare il codice e non vuoi "sprecare" tempo pensando agli errori.</p><p>Ma una volta che sei diventato più esperto e sei stato in situazioni spiacevoli in cui una gestione migliore degli errori ti avrebbe risparmiato molte energie (e del tempo prezioso, naturalmente), realizzi che sul lungo termine è obbligatorio avere una valida strategia di gestione degli errori nella tua applicazione. Soprattutto quando l'applicazione è distribuita in produzione.</p><p>Ma cosa significa esattamente <em>gestione degli errori </em>nel mondo di React? Ci sono diverse parti che hanno un ruolo. Una per <strong>individuare</strong> gli errori, un'altra per <strong>gestire </strong>l'interfaccia utente di conseguenza e l'ultima per <strong>registrarli </strong>appropriatamente.</p><h4 id="react-error-boundary"><strong>React Error Boundary</strong></h4><p>Questo è un componente di classe personalizzato usato come wrapper per l'intera applicazione. Naturalmente, puoi avvolgere il componente ErrorBoundary anche attorno a componenti più in profondità nell'albero dei componenti per renderizzare UI più specifiche, ad esempio. Fondamentalmente, è una buona pratica usare ErrorBoundary per incapsulare un componente che favorisce l'insorgenza di errori.</p><p>Con il metodo di ciclo di vita <code>componentDidCatch()</code> sei in grado di individuare errori durante la fase di rendering o in qualsiasi altro ciclo di vita dei componenti figli. Quindi, quando un errore si verifica in questa fase, arriva in superficie e viene colto dal componente ErrorBoundary.</p><p>Se stai usando un servizio di registrazione (che consiglio vivamente), è un ottimo posto da collegare.</p><p>La funzione statica <code>getDerivedStateFromError()</code> viene chiamata durante la fase di rendering e viene usata per aggiornare lo stato del componente ErrorBoundary. A seconda dello stato, puoi renderizzare condizionalmente un errore nell'interfaccia.</p><pre><code class="language-jsx">class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    //registra l'errore con un ERS
    errorService.log({ error, errorInfo });
  }

  render() {
    if (this.state.hasError) {
      return &lt;h1&gt;Oops, something went wrong.&lt;/h1&gt;;
    }
    return this.props.children; 
  }
}</code></pre><p>Il grande svantaggio di questo approccio è che non gestisce gli errori in callback asincroni, nel rendering lato server e nei gestori di eventi perché sono al di fuori dei confini.</p><h4 id="usare-try-catch-per-gestire-gli-errori-oltre-i-confini"><strong>Usare try-catch per gestire gli errori oltre i confini</strong></h4><p>Questa tecnica è efficace per individuare errori che possono verificarsi all'interno di callback asincroni. Immagina di star recuperando i dati del profilo di un utente da una API a di volerli visualizzare all'interno di un componente Profile.</p><pre><code class="language-jsx">const UserProfile = ({ userId }) =&gt; {
	const [isLoading, setIsLoading] = useState(true)
	const [profileData, setProfileData] = useState({})
    
    useEffect(() =&gt; {
    	// Separate function to make of use of async
        const getUserDataAsync = async () =&gt; {
        	try {
            	// Recupera i dati dalla API
            	const userData = await axios.get(`/users/${userId}`)
                // Restituisci un errore se il dato dell'utente è falsy (sarà intercettato da catch)
                if (!userData) {
                	throw new Error("No user data found")
                }
                // Se il dato dell'utente è truthy aggiorna lo stato
                setProfileData(userData.profile)
            } catch(error) {
            	// Registra ogni errore nel servizio di logging
            	errorService.log({ error })
                // Aggiorna stato 
                setProfileData(null)
            } finally {
            	// Resetta il carimento dello stato in ogni caso
                setIsLoading(false)
            }
        }
        
        getUserDataAsync()
    }, [])
    
    if (isLoading) {
    	return &lt;div&gt;Loading ...&lt;/div&gt;
    }
    
    if (!profileData) {
    	return &lt;ErrorUI /&gt;
    }
    
    return (
    	&lt;div&gt;
        	...User Profile
        &lt;/div&gt;
    )
}</code></pre><p>Quando il componente viene montato, avvia una richiesta GET alla nostra API per ricevere i dati dell'utente per il corrispondente userId che otterremo dalle prop.</p><p>Usare try-catch ci aiuta a individuare qualsiasi errore che può capitare durante la chiamata dell'API. Ad esempio, potrebbe essere una risposta 404 o 500 dall'API.</p><p>Una volta che un errore viene individuato, siamo all'interno del blocco catch e riceviamo l'errore come parametro. Adesso siamo in grado di accedere al servizio di logging e aggiornare lo stato di conseguenza per mostrare un errore personalizzato nell'interfaccia utente.</p><h4 id="usare-la-libreria-react-error-boundary-library-raccomandazione-personale-"><strong>Usare la libreria react-error-boundary library (raccomandazione personale)</strong></h4><p>In pratica, questa libreria fonde le due tecniche precedenti. Semplifica la gestione degli errori in React e rimedia alle limitazioni del componente ErrorBoundary che abbiamo visto.</p><pre><code class="language-jsx">import { ErrorBoundary } from 'react-error-boundary'

const ErrorComponent = ({ error, resetErrorBoundary }) =&gt; {
  
  return (
    &lt;div role="alert"&gt;
      &lt;p&gt;Something went wrong:&lt;/p&gt;
      &lt;pre&gt;{error.message}&lt;/pre&gt;
    &lt;/div&gt;
  )
}

const App = () =&gt; {
  const logError = (error, errorInfo) =&gt; {
  	errorService.log({ error, errorInfo })
  }
  

  return (
    &lt;ErrorBoundary 
       FallbackComponent={ErrorComponent}
       onError={logError}
    &gt;
       &lt;MyErrorProneComponent /&gt;
    &lt;/ErrorBoundary&gt;
  );
}</code></pre><p>La libreria esporta un componente costituito dalle funzionalità ErrorBoundary che abbiamo già conosciuto e vi aggiunge alcune sfumature. Consente di passare un <code>FallbackComponent</code> come prop che dovrebbe essere renderizzato una volta individuato l'errore. </p><p>Espone anche una prop <code>onError</code> che fornisce una funzione callback quando si verifica un errore. È ottima da usare per registrare l'errore in un servizio di logging.</p><p>Ci sono alcune altre prop che sono piuttosto utili. Se vuoi saperne di più, dai pure un'occhiata alla <a href="https://www.npmjs.com/package/react-error-boundary?activeTab=readme">documentazione</a>.</p><p>Questa libreria fornisce un hook chiamato <code>useErrorHandler()</code> il cui scopo è individuare ogni errore oltre i confini come i gestori di eventi, nel codice asincrono e nel rendering lato server.</p><h4 id="registrare-gli-errori"><strong>Registrare gli errori</strong></h4><p>Individuare e gestire efficacemente gli errori è una parte, registrarli in modo appropriato è un'altra. Una volta che hai impostato la gestione degli errori nella tua applicazione, devi registrarli in modo persistente.</p><p>Il modo usato più di frequente è il caro vecchio <strong>console.log</strong>. Potrebbe andare bene durante lo sviluppo, quando vuoi un log rapido. Ma una volta che l'applicazione viene distribuita in produzione, diventa inutile. Questo perché l'errore è visibile soltanto all'interno del browser dell'utente, il che è assolutamente inefficace.</p><p>Per registrare gli errori in produzione, in quanto sviluppatore, vuoi vedere gli errori in un posto dedicato per poterli sistemare.</p><p>Per questa ragione abbiamo bisogno di un servizio di logging, creato da noi o da terze parti.</p><p>Quando usiamo servizi di logging di terze parti, il mio suggerimento personale è senza dubbio <strong>Sentry</strong>. Quindi ti consiglio vivamente di dargli un'occhiata.</p><h3 id="-mantenere-una-chiave-unica-in-tutta-la-tua-app"><strong>☝️ Mantenere una chiave unica in tutta la tua app</strong></h3><p>Mappando un array per renderizzare i suoi dati, devi sempre definire una proprietà chiave per ogni elemento. Una pratica comune che ho visto e usato in prima persona è utilizzare semplicemente l'indice di ogni elemento come chiave.</p><p>Usare la prop chiave è importante perché aiuta React a identificare l'esatto elemento che viene cambiato, aggiunto o rimosso. Immagina che lo stato del tuo componente cambi e che l'interfaccia utente debba essere ri-renderizzata con il nuovo stato. React ha bisogno di capire la differenza tra l'interfaccia precedente e quella nuova per poterla aggiornare.</p><p>"Quali elementi sono stati aggiunti/rimossi o sono cambiati?"</p><p>Per questo la chiave deve essere unica. Usare l'indice dell'elemento corrente assicura che sia unica solo in questa particolare funzione di mappatura.</p><p>Potrebbe avere questo aspetto, se avessimo deciso di mostrare i punteggi di una squadra di football di questa stagione:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={index}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Mentre è unica solamente all'interno di questa funzione di mappatura, ciò può portare a potenziali problemi. È molto comune avere più di una funzione di mappatura all'interno di un'applicazione React o anche in un componente.</p><p>Assumiamo di avere un'altra funzione di mappatura nel nostro componente per visualizzare l'elenco attuale:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData, currentRoster }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={index}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
            &lt;/br&gt;
			&lt;h3&gt;Our current roster:&lt;h3&gt;
        	{currentRoster.map((player, index) =&gt; (
            	&lt;div key={index}&gt;
                	&lt;p&gt;{player.name}&lt;/p&gt;
                    &lt;p&gt;{player.position}&lt;/p&gt;
                    &lt;p&gt;{player.jerseyNumber}&lt;/p&gt;
                    &lt;p&gt;{player.totalGoals}&lt;/p&gt;
                &lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Ci ritroviamo nella situazione in cui usiamo molte chiavi due volte all'interno del nostro componente. Consideriamo di avere 14 elementi all'interno di <code>seasonScoresData</code> e 30 in <code>currentRoaster</code>. Abbiamo usato i numeri da 0 a 13 due volte come chiave. Ora non ci stiamo più attenendo allo scopo di avere chiavi uniche.</p><p>Ciò può portare a potenziali problemi perché React potrebbe ri-renderizzare soltanto un elemento e omettere l'altro. Oppure può portare a inefficienza nell'aggiornamento dell'albero dell'interfaccia. Dai un'occhiata ai post consigliati alla fine di questa sezione per avere degli esempi più dettagliati.</p><p>Per evitare questo comportamento indesiderato, assicurati di <strong>usare sempre chiavi uniche in tutta l'applicazione</strong>. Idealmente ogni elemento nell'array dovrebbe avere il proprio id univoco da utilizzare. Ma questo non è sempre il caso, quindi puoi usare una libreria esterna come <strong>uuidv4</strong> per generare id univoci.</p><p>Con questo in mente e con l'assunzione che ogni elemento in entrambi gli array ha una proprietà id, il componente dovrebbe avere questo aspetto:</p><pre><code class="language-jsx">const SeasonScores = ({ seasonScoresData, currentRoster }) =&gt; {
	
    return (
    	&lt;&gt;
        	&lt;h3&gt;Our scores in this season:&lt;h3&gt;
        	{seasonScoresData.map((score, index) =&gt; (
    			&lt;div key={score.id}&gt;
        			&lt;p&gt;{score.oponennt}&lt;/p&gt;
        			&lt;p&gt;{score.value}&lt;/p&gt;
        		&lt;/div&gt;
    		))}
            &lt;/br&gt;
			&lt;h3&gt;Our current roster:&lt;h3&gt;
        	{currentRoster.map((player, index) =&gt; (
            	&lt;div key={player.id}&gt;
                	&lt;p&gt;{player.name}&lt;/p&gt;
                    &lt;p&gt;{player.position}&lt;/p&gt;
                    &lt;p&gt;{player.jerseyNumber}&lt;/p&gt;
                    &lt;p&gt;{player.totalGoals}&lt;/p&gt;
                &lt;/div&gt;
    		))}
        &lt;/&gt;
    )
}</code></pre><p>Se vuoi andare più a fondo, puoi leggere <a href="https://medium.com/swlh/understanding-the-importance-of-the-key-prop-in-react-f2b92ce65f45">questo post</a> (risorsa in inglese) sull'argomento.</p><h2 id="suggerimenti-per-scrivere-del-codice-react-migliore-la-ciliegina-sulla-torta"><strong>Suggerimenti per scrivere del codice React migliore – La ciliegina sulla torta</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/01/joanna-kosinska-_xN7UbcZ33I-unsplash.jpg" class="kg-image" alt="joanna-kosinska-_xN7UbcZ33I-unsplash" width="600" height="400" loading="lazy"></figure><p>Vorrei paragonare questa guida al processo di costruzione di una casa. La prima parte, <em>Imparare gli elementi fondamentali di React</em>, corrisponde alle solide fondamenta su cui costruisci la tua applicazione. La seconda, <em>Come realizzare dei componenti React puliti, prestanti e manutenibili</em>, è per costruire i muri.</p><p>Questa sezioni è sostanzialmente il tetto che va a completare la casa. Ecco perché l'ho chiamata <em>La ciliegina sulla torta</em>. Contiene suggerimenti più dettagliati.</p><p>La maggior parte di queste pratiche sono più opzionali delle precedenti, ma possono fare la differenza se le utilizzi nel modo appropriato.</p><h3 id="-implementare-prima-l-hook-usereducer"><strong>🪄 Implementare prima l'hook useReducer</strong></h3><p>Probabilmente uno degli hook usati più di frequente in React è <strong>useState</strong>. Nel tempo, ho creato e visto componenti con un sacco di stati differenti. Quindi è naturale che siano inondati da hook useState.</p><pre><code class="language-jsx">const CustomersMap = () =&gt; {
  const [isDataLoading, setIsDataLoading] = useState(false)
  const [customersData, setCustomersData] = useState([])
  const [hasError, setHasError] = useState(false)
  const [isHovered, setIsHovered] = useState(false)
  const [hasMapLoaded, setHasMapLoaded] = useState(false)
  const [mapData, setMapData] = useState({})
  const [formData, setFormData] = useState({})
  const [isBtnDisabled, setIsBtnDisabled] = useState(false)
  
  ...
  
  return ( ... )
}</code></pre><p>Avere molti hook useState diversi è sempre un segno importante che la dimensione e quindi la complessità di un componente sta crescendo.</p><p>Se puoi creare dei sotto-componenti più piccoli in cui trasferire alcuni stati e del JSX, si tratta di un'ottima idea, così da ripulire gli hook useState e il JSX in un colpo.</p><p>Nell'esempio qui sopra, potremmo mettere gli ultimi due stati in un componente separato che gestisce tutti gli stati e il JSX che riguardano un modulo.</p><p>Ma ci sono situazioni in cui ciò non ha senso e devi mantenere tutti questi stati differenti in un solo componente. Per migliorare la leggibilità del componente, esiste l'hook <strong>useReducer</strong>.</p><p>La documentazione ufficiale di React riporta:</p><blockquote><em><em><code>useReducer</code> </em>è solitamente da preferire a<em> <code>useState</code> </em>quando si ha una logica di stato complessa che coinvolge sotto-valori multipli o quando lo stato successivo dipende dal precedente<em>. useReducer </em>consente anche di ottimizzare le prestazioni per i componenti che attivano aggiornamenti profondi perché è possibile passare dei messaggi invece di callback<em>.</em></em></blockquote><p>Avendo questo in mente, il componente potrebbe avere questo aspetto usando <code>useReducer</code>:</p><pre><code class="language-jsx">// STATO INIZIALE
const initialState = {
  isDataLoading: false,
  customerData: [],
  hasError: false,
  isHovered: false,
  hasMapLoaded: false,
  mapData: {},
  formdata: {},
  isBtnDisabled: false
}

// REDUCER
const reducer = (state, action) =&gt; {
  switch (action.type) {
    case 'POPULATE_CUSTOMER_DATA':
      return {
        ...state,
        customerData: action.payload
      }
    case 'LOAD_MAP':
      return {
        ...state,
        hasMapLoaded: true
      }
    ...
    ...
    ...
    default: {
      return state
    }	
  }
}

// COMPONENTE
const CustomersMap = () =&gt; {
  const [state, dispatch] = useReducer(reducer, initialState)
  
  ...
  
  return ( ... )
}</code></pre><p>Il componente stesso ha un aspetto più pulito e possiede anche alcuni vantaggi come puoi vedere nella documentazione. Se sei abituato a Redux, il concetto di reducer e di come viene costruito non ti è nuovo.</p><p>La mia regola personale è di implementare l'hook useReducer se un componente supera i quattro hook useState oppure se lo stato stesso è più complesso di un semplice booleano, ad esempio. Potrebbe trattarsi di un oggetto per un modulo con dei livelli più profondi all'interno.</p><h3 id="-usare-scorciatoie-per-prop-booleane"><strong>🔌 Usare scorciatoie per prop booleane</strong></h3><p>Ci sono spesso situazioni in cui si passa una prop booleana a un componente. Ho visto molti sviluppatori fare così:</p><pre><code class="language-jsx">&lt;RegistrationForm hasPadding={true} withError={true} /&gt;</code></pre><p>Ma non è necessario farlo necessariamente così perché la ricorrenza di una prop stessa è truthy (se la prop viene passata) o falsy (se è mancante).</p><p>Ecco un approccio più chiaro:</p><pre><code class="language-jsx">&lt;RegistrationForm hasPadding withError /&gt;</code></pre><h3 id="-evitare-le-parentesi-graffe-per-le-prop-stringhe"><strong>👎 Evitare le parentesi graffe per le prop stringhe</strong></h3><p>Un caso di utilizzo simile a quello visto nel suggerimento precedente è l'utilizzo di prop stringhe:</p><pre><code class="language-jsx">&lt;Paragraph variant={"h5"} heading={"A new book"} /&gt;</code></pre><p>Non occorre usare le parentesi graffe in questo caso perché puoi usare direttamente delle stringhe all'interno delle prop. Quando vuoi attribuire un className a un elemento JSX è più probabile che tu lo faccia direttamente come una stringa.</p><p>Quando vuoi usare un'espressione JavaScript diversa da una stringa, ti servono le parentesi graffe. Ad esempio, se vuoi usare un numero o un oggetto. Questo è vero anche per le stringhe template (non restarci invischiato come ho fatto molte volte, haha).</p><p>Con delle normali stringhe, come nell'esempio, diventerebbe così:</p><pre><code class="language-jsx">&lt;Paragraph variant="h5" heading="A new book" /&gt;</code></pre><h3 id="-cancellare-attributi-non-html-distribuendo-le-prop"><strong>🧹 Cancellare attributi non-html distribuendo le prop</strong></h3><p>Vediamo un esempio rapido:</p><pre><code class="language-jsx">const MainTitle = ({ isBold, children, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ fontWeight: isBold ? 600 : 400 }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}</code></pre><p>Abbiamo appena creato un componente che renderizza un tag h1, estratto delle prop e distribuito tutte le altre potenziali prop nel tag h1. Per ora tutto ok.</p><p>Adesso siamo in grado di usarlo in altri componenti e possiamo attivare manualmente se l'h1 dovrebbe essere in grassetto o no:</p><pre><code class="language-jsx">// CON TITOLO IN GRASSETTO
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><pre><code class="language-jsx">// SENZA TITOLO IN GRASSETTO
const AboutPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle&gt;
      	Some quick lines about us!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><p>Finora, tutto funziona perfettamente senza errori o avvisi. La parte interessante inizia adesso, quando usiamo altre prop che sono direttamente distribuite al tag h1.</p><p>Quando usiamo degli attributi HTML validi come id o class, tutto funziona senza errori (ricorda --&gt; "className" diventa "class"):</p><pre><code class="language-jsx">const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold id="index-main-title" className="align-left"&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}</code></pre><p>Quindi tutte le prop qui sopra saranno aggiunte come attributo per l'h1 perché stiamo usando <strong><strong>{...restProps}</strong></strong>. Le prop che aggiungiamo e NON estraiamo saranno aggiunte al tag h1.</p><p>Questo è ottimo per molti casi ma può essere un problema allo stesso tempo:</p><pre><code class="language-jsx">// Page Component
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold hasPadding&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}

// MainTitle Component
const MainTitle = ({ isBold, children, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ 
        fontWeight: isBold ? 600 : 400,
        padding: restProps.hasPadding ? 16 : 0
      }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}
</code></pre><p>Nel codice qui sopra abbiamo aggiunto una nuova prop chiamata <code>hasPadding</code> al componente <code>MainTitle</code>, che è opzionale. All'interno del componente non la estraiamo dalle prop e la chiamiamo tramite <code>restProps.hasPadding</code>.</p><p>Il codice funziona, ma aprendo il tuo browser riceverai un avviso che <code>hasPadding</code> non è un attributo HTML che stai tentando di applicare al tag h1. Questo per via di <code>{...restProps}</code> sul tag h1 e perché non stiamo estraendo <code>hasPadding</code> come <code>isBold</code>, ad esempio. </p><p>Per evitare tutto ciò, estrai sempre tutti gli attributi non-HTML dalle prop, così da assicurarti che ci siano solo attributi HTML validi in <code>restProps</code> che stai distribuendo a un elemento JSX.</p><p>Nel nostro esempio sarebbe così:</p><pre><code class="language-jsx">// Page Component
const IndexPage = () =&gt; {
	
  return (
    &lt;&gt;
      &lt;MainTitle isBold hasPadding&gt;
        Welcome to our new site!
      &lt;/MainTitle&gt;
      ...
    &lt;/&gt;
  )
}

// MainTitle Component
const MainTitle = ({ isBold, children, hasPadding, ...restProps }) =&gt; {
	
  return (
    &lt;h1 
      style={{ 
        fontWeight: isBold ? 600 : 400,
        padding: hasPadding ? 16 : 0
      }}
      {...restProps}
    &gt;
      {children}
    &lt;/h1&gt;
  )
}
</code></pre><p>Molti di questi avvisi possono intasare la console nel browser senza che siano necessari, il che può essere sgradevole. Specialmente se stai facendo debugging.</p><p>Per ottenere più informazioni su questo argomento e altri modi per risolvere il problema, consulta <a href="https://reactjs.org/warnings/unknown-prop.html">questa sezione della documentazione</a>.</p><h3 id="-usare-le-estensioni-snippet"><strong>🔥 Usare le estensioni snippet</strong></h3><p>In Visual Studio Code, ad esempio, sono disponibili alcune estensioni che migliorano la tua produttività. Tra queste ci sono le <strong>estensioni snippet</strong>.</p><p>Il loro grande vantaggio è che non devi scrivere tutto il codice boilerplate di nuovo. Immagina di star creando molti nuovi componenti a di dover digitare tutto ancora e ancora:</p><pre><code class="language-jsx">import React from 'react'

const GoogleMap = () =&gt; {

}

export default GoogleMap</code></pre><p>Con questi snippet devi soltanto digitare <strong><strong><code>rafce</code></strong></strong>, ad esempio, premere tab ed ecco che hai lo stesso codice boilerplate. È davvero un salva tempo e accelera lo sviluppo.</p><p><strong>Ma usali con attenzione!</strong> Non consiglio di usare snippet a tutti gli sviluppatori. Secondo me, i principianti non dovrebbero usare alcuno snippet e dovrebbero scrivere il boilerplate a mano. Quando lo fai, ottieni una memoria muscolare che esprime tutto ciò che hai imparato.</p><p>Se lo hai fatto così spesso da poterlo scrivere nel sonno e diventa noioso, allora è il momento giusto di usare gli snippet.</p><p>Ecco i miei consigli:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-14.55.02.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-14.55.02" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-15.05.01.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-15.05.01" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Bildschirmfoto-2022-02-01-um-15.06.59.png" class="kg-image" alt="Bildschirmfoto-2022-02-01-um-15.06.59" width="600" height="400" loading="lazy"></figure><h3 id="-scrivere-un-frammento-quando-non-necessario-un-div"><strong>❌ Scrivere un frammento quando non è necessario un div</strong></h3><p>Un componente React può renderizzare un solo tag HTML alla volta nella sua radice. Quindi volendo renderizzare due elementi adiacenti, otterrai il famoso errore <strong><strong>Adjacent JSX elements must be wrapped in an enclosing tag</strong> </strong>(gli elementi JSX adiacenti devono essere racchiusi in un tag).</p><pre><code class="language-jsx">const InfoText = () =&gt; {
	
  // Darà un errore
  return (
    &lt;h1&gt;Welcome!&lt;/h1&gt;
    &lt;p&gt;This our new page, we're glad you're are here!&lt;/p&gt;
  )
}</code></pre><p>Quindi, cosa puoi fare? Racchiudi semplicemente l'output in un frammento, che soddisfa React e non aggiunge nessun elemento extra nel browser.</p><pre><code class="language-jsx">const InfoText = () =&gt; {
	
  return (
  	&lt;&gt;
      &lt;h1&gt;Welcome!&lt;/h1&gt;
      &lt;p&gt;This our new page, we're glad you're are here!&lt;/p&gt;
    &lt;/&gt;
  )
}</code></pre><p>Naturalmente è possibile risolvere tutto ciò anche con un tag div. Ma usare un div dopo l'altro crea una cosa chiamata <strong>inferno dei div</strong> nel browser, in cui ci sono un sacco di tag div annidati senza senso.</p><p>Quindi ogni volta che devi usare un tag per racchiudere qualcosa in React ma non ti serve necessariamente un tag HTML, allora usa semplicemente un frammento.</p><h3 id="-integrare-i-tag-a-chiusura-automatica-quando-i-figli-non-sono-necessari"><strong>👈 Integrare i tag a chiusura automatica quando i figli non sono necessari</strong></h3><p>Dalla mia esperienza posso dire che questo suggerimento è spesso trascurato, ma rende del codice molto più pulito con uno sforzo minimo.</p><p>In React, hai la possibilità di passare elementi figli a un componente, che poi sono disponibili al componente tramite la sua proprietà figlia. Questi componenti sono spesso chiamati <strong>componenti compositi</strong>.</p><p>In questo caso, devi utilizzare un tag di apertura e un tag di chiusura, naturalmente:</p><pre><code class="language-jsx">&lt;NavigationBar&gt;
  &lt;p&gt;Home&lt;/p&gt;
  &lt;p&gt;About&lt;/p&gt;
  &lt;p&gt;Projects&lt;/p&gt;
  &lt;p&gt;Contact&lt;/p&gt;
&lt;/NavigationBar&gt;</code></pre><p>Ma quando non sono necessari dei figli, non ha senso usare un tag di apertura e un tag di chiusura, vero?</p><pre><code class="language-jsx">&lt;NavigationBar&gt;&lt;/NavigationBar&gt;</code></pre><p>Invece di fare così, consiglio di usare il componente come un elemento a chiusura automatica come il tag HTML input, che allo stesso modo non accetta figli.</p><pre><code class="language-jsx">&lt;NavigationBar /&gt;</code></pre><p>Ha un aspetto molto più pulito, vero?</p><h3 id="-seguire-le-convenzioni-di-nomenclatura-pi-comuni"><strong>✅ Seguire le convenzioni di nomenclatura più comuni</strong></h3><p>Il senso alla base delle convenzioni di nomenclatura è che è più semplice riconoscere il tipo di elemento con cui hai a che fare, oltre ad avere qualcosa nel tuo codice in comune con la comunità.</p><p>Da questo punto di vista, ci sono due principali convenzioni di nomenclatura che coinvolgono React e JavaScript che dovresti seguire:</p><h4 id="usare-pascalcase-in-componenti-interfacce-o-alias-di-tipo"><strong>Usare PascalCase in componenti, interfacce o alias di tipo</strong></h4><pre><code class="language-jsx">// Componente React
const LeftGridPanel = () =&gt; {
  ...
}

// Interfaccia Typescript
interface AdminUser {
  name: string;
  id: number;
  email: string;
}

// Alias di tipo Typescript
type TodoList = {
	todos: string[];
    id: number;
    name: string;
}

</code></pre><h4 id="usare-camelcase-per-tipi-di-dati-javascript-come-variabili-array-oggetti-funzioni-e-cos-via"><strong>Usare camelCase per tipi di dati JavaScript come variabili, array, oggetti, funzioni e così via</strong></h4><pre><code class="language-jsx">const getLastDigit = () =&gt; { ... }

const userTypes = [ ... ]

</code></pre><p>Dare nomi ai componenti React in PascalCase è molto importante, perché se hai un linter configurato per React, ma i nomi dei tuoi componenti sono in camelCase e stai usando degli hook al loro interno, otterrai un messaggio di avvertimento tutte le volte che gli hook sono consentiti solo nei componenti. Questo perché il linter riconosce un componente React se è scritto in PascalCase oppure no.</p><p>Può essere spiacevole, ma si sistema rapidamente adottando le convenzioni stabilite.</p><h3 id="-ripulire-il-codice-per-prevenire-attacchi-xss"><strong>🧨 Ripulire il codice per prevenire attacchi XSS</strong></h3><p>Magari ti sei trovato in una situazione in cui occorre usare la proprietà <code>dangerouslySetInnerHTML</code> su un elemento in React. Sostanzialmente è l'equivalente di React di <code>innerHTML</code> che potresti conoscere da JavaScript.</p><p>Quindi usandola puoi impostare direttamente l'HTML da React.</p><p>Consideriamo il seguente esempio, in cui vogliamo renderizzare una stringa HTML all'interno di un div. La stringa può venir fuori da un bell'editor di testo in cui c'è già dell'HTML formattato.</p><pre><code class="language-jsx">const Markup = () =&gt; {
  const htmlString = "&lt;p&gt;This is set via dangerouslySetInnerHTML&lt;/p&gt;"
  
  return (
    &lt;div dangerouslySetInnerHTML={{ __html: htmlString }} /&gt;
  )
}</code></pre><p>Il termine <strong><strong>dangerously</strong></strong> è scelto intenzionalmente. Usare questa proprietà può permettere attacchi di cross-site-scripting (XSS). Quindi è obbligatorio che il codice venga prima ripulito.</p><p>Un'ottima libreria che può aiutarti in questo è <strong><strong><a href="https://www.npmjs.com/package/dompurify">dompurify</a></strong></strong>.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Wow, è stato divertente, vero? Ho cercato di fare del mio meglio per far uscire tutto quello che avevo accatastato nella mia testa in passato. Quello che mi ha spinto a scrivere questa guida è condividere la mia esperienza con te in modo da farti evitare dei momenti difficili durante lo studio e lo sviluppo con React.</p><p>Naturalmente potrebbero esserci delle buone pratiche che consideri più importanti e che potrei aver tralasciato. Ottimo. Mi piacerebbe sentire da te quali sono per poterle aggiungere a questa guida.</p><p>Ricorda, si tratta sempre di adattarsi a ciò che utile. Quindi non dare tutto per scontato e pensa a cosa potrebbe esserti utile nella situazione in cui ti trovi. Poi puoi aggiungerlo al tuo elenco di buone pratiche.</p><p>Puoi seguire il mio percorso di sviluppo e ottenere molti altri utili consigli sulla vita da sviluppatore sul mio profilo <a href="https://www.instagram.com/jean_marc.dev/">Instagram</a>. Sono sempre disponibili ad aiutare e sono felice di ricevere feedback. Sentiti libero di contattarmi.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Confrontare Array in JavaScript – Come Confrontare 2 Array in JS ]]>
                </title>
                <description>
                    <![CDATA[ Quando gestisci della logica con JavaScript, potresti aver bisogno di confrontare due array per vedere se sono uguali oppure no. In pratica, non dovrebbe essere difficile e potresti pensare di utilizzare sia l'operatore di uguaglianza (doppio uguale, ==) che di uguaglianza stretta (triplo uguale, ===). Ma sfortunatamente non puoi farne ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/confrontare-array-in-javascript-come-confrontare-2-array-in-js/</link>
                <guid isPermaLink="false">6412dced1eb08b064998ff15</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Mon, 20 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/03/compare.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-compare-arrays-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Comparing Arrays in JavaScript – How to Compare 2 Arrays in JS</a>
      </p><p>Quando gestisci della logica con JavaScript, potresti aver bisogno di confrontare due array per vedere se sono uguali oppure no.</p><p>In pratica, non dovrebbe essere difficile e potresti pensare di utilizzare sia l'operatore di uguaglianza (doppio uguale, <code>==</code>) che di uguaglianza stretta (triplo uguale, <code>===</code>). Ma sfortunatamente non puoi farne uso in questo caso.</p><pre><code class="language-js">let array1 = [11, 22, 33];
let array2 = [11, 22, 33];

console.log(array1 == array2); //false
console.log(array1 === array2); //false
</code></pre><p>Questo accade perché gli array JavaScript sono di tipo Object (oggetto):</p><pre><code class="language-js">let arrayType = typeof(array1);
console.log(arrayType); //"Object"
</code></pre><p>Gli oggetti non vengono confrontati in base ai loro valori ma secondo i riferimenti alle variabili:</p><pre><code class="language-js">console.log(array1[0] == array1[0]); //true
console.log(array1[1] === array1[1]); //true
</code></pre><p>Ma questo non è ciò che desideri. Invece, vuoi essere in grado di confrontare i due array direttamente e restituire un solo valore booleano senza dover verificare ogni elemento uno alla volta.</p><p>In questo articolo, imparerai i vari modi con cui puoi confrontare due array in JavaScript per vedere se sono uguali oppure no.</p><h2 id="come-confrontare-due-array-convertendoli-in-stringhe"><strong>Come confrontare due array convertendoli in stringhe</strong></h2><p>Un approccio comune e piuttosto diretto che puoi usare per confrontare due array è convertirli in forma di stringa.</p><p>Esistono due metodi diversi che puoi usare: puoi decidere di convertire gli array in testo JSON usando il metodo <code>JSON.stringify()</code>, oppure puoi usare il metodo <code>.toString()</code> per restituire gli array come una stringa.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> questi metodi sono diversi, come puoi vedere di seguito:</p><pre><code class="language-js">let array = [11, 22, 33];
console.log(JSON.stringify(array)); //"[11,22,33]"
console.log(array.toString()); //"11,22,33"
</code></pre><h3 id="metodo-1-come-usare-json-stringify-"><strong>Metodo 1: come usare <code>JSON.stringify()</code></strong></h3><p>Questo metodo consente di serializzare ogni array convertendolo in una stringa JSON. In seguito, puoi confrontare le due stringhe JSON.</p><pre><code class="language-js">let array1 = [11, 22, 33];
let array2 = [11, 22, 33];

console.log(JSON.stringify(array1) === JSON.stringify(array2)); //true
</code></pre><p>Possiamo anche decidere di creare una funzione riutilizzabile che ci aiuta a confrontare due array che le passiamo:</p><pre><code class="language-js">const compareArrays = (a, b) =&gt; {
  return JSON.stringify(a) === JSON.stringify(b);
};

let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];

console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
</code></pre><h3 id="metodo-2-come-usare-tostring-"><strong>Metodo 2: come usare <code>.toString()</code></strong></h3><p>Simile a <code>JSON.stringify()</code>, questo metodo converte ogni tipo di dato in una stringa e dunque anche gli oggetti in stringhe.</p><pre><code class="language-js">let array1 = [11, 22, 33];
let array2 = [11, 22, 33];

console.log(array1.toString() === array2.toString()); //true
</code></pre><p>Possiamo anche decidere di creare una funzione riutilizzabile che ci aiuta a confrontare due array che le passiamo:</p><pre><code class="language-js">const compareArrays = (a, b) =&gt; {
  return a.toString() === b.toString();
};

let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];

console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> dovresti utilizzare il metodo <code>JSON.stringify()</code>, dato che serializza soltanto l'array JavaScript. L'array mantiene ancora la forma di un array, ma viene elaborato in modo da diventare la versione stringa di un array.</p><h2 id="come-confrontare-due-array-iterando-sui-loro-valori"><strong>Come confrontare due array iterando sui loro valori</strong></h2><p>I metodi appena visti falliscono in alcuni casi. Ad esempio, quando un array ha un valore <code>null</code> e un altro ha un valore <code>undefined</code>, e utilizziamo l'uguaglianza stretta, otteniamo <code>false</code> di default – che è corretto:</p><pre><code class="language-js">console.log(null === undefined); //false
</code></pre><p>Ma quando usiamo i metodi <code>JSON.Strigify()</code> o <code>.toString()</code> otteniamo <code>true</code>, anche se non dovremmo:</p><pre><code class="language-js">let array1 = [11, null, 33];
let array2 = [11, undefined, 33];

console.log(JSON.stringify(array1) === JSON.stringify(array2)); //true
console.log(array1.toString() === array2.toString()); //true
</code></pre><p>Un approccio migliore potrebbe essere confrontare la lunghezza degli array e poi iterare sui valori e confrontare ogni elemento.</p><h3 id="metodo-1-usare-every-"><strong>Metodo 1: usare <code>every()</code></strong></h3><p>Il metodo <code>every()</code> consente di eseguire una funzione su ogni elemento di un array. Questa funzione viene detta funzione callback. Ha accesso ad alcuni parametri di base come elemento, indice e altro ancora, che possono essere usati al suo interno:</p><pre><code class="language-js">// Sintassi
array.every((valoreCorrente, indice, array)=&gt; { ... })
</code></pre><p>In questo metodo, testeremo prima se la lunghezza dei due array è comparabile. Poi itereremo su uno degli array usando gli indici per confrontare i suoi elementi con quelli del secondo array:</p><pre><code class="language-js">const compareArrays = (a, b) =&gt;
  a.length === b.length &amp;&amp;
  a.every((element, index) =&gt; element === b[index]);

let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];

console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
</code></pre><p>E quando abbiamo null e undefined come elementi degli array, sarà possibile individuare che non sono lo stesso valore:</p><pre><code class="language-js">const compareArrays = (a, b) =&gt;
  a.length === b.length &amp;&amp; a.every((element, index) =&gt; element === b[index]);

let array1 = [11, null, 33];
let array2 = [21, 22, 23];
let array3 = [11, undefined, 33];

console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //false
</code></pre><h3 id="metodo-2-usare-un-loop-for"><strong>Metodo 2: usare un loop for</strong></h3><p>Il metodo every() ha una sintassi migliore. Tuttavia, un altro modo in cui possiamo implementare questo approccio è usare un altro metodo di iterazione come un loop <code>for</code>, <code>forEach()</code> o <code>map()</code> insieme a delle istruzioni <code>if</code>. Potrebbero risultato più facili da afferrare per un principiante.</p><pre><code class="language-js">const compareArrays = (a, b) =&gt; {
  if (a.length !== b.length) return false;
  else {
    // Confrontiamo ogni elemento dell'array
    for (var i = 0; i &lt; a.length; i++) {
      if (a[i] !== b[i]) {
        return false;
      }
    }
    return true;
  }
};

let array1 = [21, null, 33];
let array2 = [21, 22, 23];
let array3 = [21, undefined, 33];
let array4 = [21, 22, 23];

console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //false
console.log(compareArrays(array2, array4)); //true
</code></pre><p>In entrambi i metodi precedenti, occorre prima confrontare le lunghezze, visto che se non sono uguali, vuol dire automaticamente che gli array non sono uguali e possiamo restituire <code>false</code>.</p><p>Se le lunghezze sono uguali, allora iniziamo a verificare ogni elemento. Viene restituito <code>false</code> non appena due elementi allo stesso indice nei due array sono diversi.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo hai imparato a confrontare due array in JavaScript usando due approccio diversi.</p><p>Si tratta di convertire gli array in forma di stringa prima di confrontarli oppure di iterare sugli elementi per confrontarne i valori per avere un confronto più dettagliato.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> il doppio uguale verifica se i valori sono uguali, mentre il triplo uguale verifica se i valori e il loro tipo di dato sono uguali. <a href="https://www.freecodecamp.org/italian/news/triplo-segno-di-uguale-vs-doppio-segno-di-uguale-in-javascript/">Qui</a> puoi leggere altro sui due tipi di uguaglianza.</p><p>Divertiti a programmare!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Triplo Segno di Uguale VS Doppio Segno di Uguale in JavaScript – Operatori di Confronto Spiegati con Esempi ]]>
                </title>
                <description>
                    <![CDATA[ Probabilmente, in JavaScript hai visto dei segni di uguale doppi e tripli. Ma che cosa significano? In breve: == effettua implicitamente una conversione di tipo e === non converte il tipo. Il doppio uguale (==) verifica soltanto l'uguaglianza dei valori. Effettua implicitamente una conversione di tipo (type coercion). Questo vuol ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/triplo-segno-di-uguale-vs-doppio-segno-di-uguale-in-javascript/</link>
                <guid isPermaLink="false">6412eef01eb08b064999009b</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Fri, 17 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/03/sroo.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-triple-equals-sign-vs-double-equals-sign-comparison-operators-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Triple Equals Sign VS Double Equals Sign – Comparison Operators Explained with Examples</a>
      </p><p>Probabilmente, in JavaScript hai visto dei segni di uguale doppi e tripli. Ma che cosa significano?</p><p>In breve: <code>==</code> effettua implicitamente una conversione di tipo e <code>===</code> non converte il tipo.</p><p>Il doppio uguale (<code>==</code>) verifica soltanto l'uguaglianza dei valori. Effettua implicitamente una conversione di tipo (type coercion). Questo vuol dire che prima di confrontare i valori, converte i tipi delle variabili in modo che corrispondano.</p><p>Al contrario, il triplo uguale (<code>===</code>) non effettua conversioni di tipo. Verifica se le variabili confrontate hanno lo stesso valore <strong>e </strong>sono dello stesso tipo.</p><p>Ok – proviamo a comprendere meglio la differenza con alcuni esempi. Cerca di capire quale sarà l'output di ognuno.</p><h3 id="esempio-1-"><strong>Esempio <strong>1:</strong></strong></h3><pre><code class="language-js">const foo = "test" 
const bar = "test"  

console.log(foo == bar) //true
console.log(foo === bar) //true                            </code></pre><p>Il valore e il tipo di <code>foo</code> e <code>bar</code> sono uguali. Di conseguenza il risultato è <code>true</code> per entrambi.</p><h3 id="esempio-2-"><strong><strong>E</strong>sempio<strong> 2:‌</strong></strong></h3><pre><code class="language-js">const number = 1234 
const stringNumber = '1234'  

console.log(number == stringNumber) //true
console.log(number === stringNumber)  //false                                   
</code></pre><p>Il valore di <code>number</code> e di <code>stringNumber</code> sembra lo stesso. Tuttavia, il tipo di <code>number</code> è <code>number</code> e il tipo di <code>stringNumber</code> è <code>string</code>. Anche se i valori sono gli stessi, non lo è il tipo. Dunque il confronto tramite <code>==</code> restituisce <code>true</code>, ma quando il confronto avviene per il valore <strong>e</strong> il tipo, il risultato è <code>false</code>.</p><h3 id="esempio-3-"><strong>Esempio <strong>3:</strong></strong></h3><pre><code class="language-js">console.log(0 == false) //true
console.log(0 === false) //false                  </code></pre><p>Spiegazione: stesso valore, tipo diverso. Conversione di tipo.</p><p>Questo è un caso interessante. Il valore <code>0</code> se confrontato con <code>false</code> risulta uguale. Ciò avviene perché <code>0</code> e <code>false</code> hanno lo stesso valore per JavaScript, ma se confrontati per valore e tipo, il risultato è falso perché <code>0</code> è di tipo <code>number</code> e <code>false</code> è di tipo <code>boolean</code>.</p><h3 id="esempio-4-"><strong>Esempio <strong>4:</strong></strong></h3><pre><code>const str = ""

console.log(str == false) //true
console.log(str === false) //false</code></pre><p>Il valore di una stringa vuota e <code>false</code> sono uguali in JavaScript. Quindi, <code>==</code> restituisce <code>true</code>. Tuttavia il loro tipo è diverso e quindi <code>===</code> restituisce <code>false</code>.</p><h2 id="quando-dovresti-usare-e-quando-"><strong>Quando dovresti usare<strong> <code>==</code> </strong>e quando<strong> <code>===</code>?</strong></strong></h2><p>Se hai dubbi, utilizza <code>===</code>. Ti eviterà un sacco di potenziali bug.</p><p>Se ti trovi in un caso di utilizzo in cui puoi essere tollerante riguardo al tipo di dato in entrata, allora usa <code>==</code>. Ad esempio, se una API accetta sia <code>"true"</code> che <code>true</code> dal client, usa <code>==</code>. In breve, non usare <code>==</code> a meno che non ci sia una ragione per farlo.</p><p>Ecco un'utile tabella della verità come riferimento, in cui puoi vedere quanto è complicata l'uguaglianza in JavaScript:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/03/image-6.png" class="kg-image" alt="image-6" width="600" height="400" loading="lazy"><figcaption>Source: <a href="https://dorey.github.io/JavaScript-Equality-Table/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://dorey.github.io/JavaScript-Equality-Table/</a></figcaption></figure><p>Se ti è piaciuto questo articolo, seguimi su twitter per altri contenuti.</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/Tweet.html?creatorScreenName=shrutikapoor08&amp;dnt=false&amp;embedId=twitter-widget-0&amp;features=eyJ0ZndfdGltZWxpbmVfbGlzdCI6eyJidWNrZXQiOltdLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2ZvbGxvd2VyX2NvdW50X3N1bnNldCI6eyJidWNrZXQiOnRydWUsInZlcnNpb24iOm51bGx9LCJ0ZndfdHdlZXRfZWRpdF9iYWNrZW5kIjp7ImJ1Y2tldCI6Im9uIiwidmVyc2lvbiI6bnVsbH0sInRmd19yZWZzcmNfc2Vzc2lvbiI6eyJidWNrZXQiOiJvbiIsInZlcnNpb24iOm51bGx9LCJ0ZndfbWl4ZWRfbWVkaWFfMTU4OTciOnsiYnVja2V0IjoidHJlYXRtZW50IiwidmVyc2lvbiI6bnVsbH0sInRmd19leHBlcmltZW50c19jb29raWVfZXhwaXJhdGlvbiI6eyJidWNrZXQiOjEyMDk2MDAsInZlcnNpb24iOm51bGx9LCJ0ZndfZHVwbGljYXRlX3NjcmliZXNfdG9fc2V0dGluZ3MiOnsiYnVja2V0Ijoib24iLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3ZpZGVvX2hsc19keW5hbWljX21hbmlmZXN0c18xNTA4MiI6eyJidWNrZXQiOiJ0cnVlX2JpdHJhdGUiLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X2xlZ2FjeV90aW1lbGluZV9zdW5zZXQiOnsiYnVja2V0Ijp0cnVlLCJ2ZXJzaW9uIjpudWxsfSwidGZ3X3R3ZWV0X2VkaXRfZnJvbnRlbmQiOnsiYnVja2V0Ijoib24iLCJ2ZXJzaW9uIjpudWxsfX0%3D&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1180173695643348992&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fjavascript-triple-equals-sign-vs-double-equals-sign-comparison-operators-explained-with-examples%2F&amp;sessionId=a5ab1c435d097b0bc41143a1f65562becced2bde&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=aaf4084522e3a%3A1674595607486&amp;width=550px" data-tweet-id="1180173695643348992" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 417px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Usare i Metodi flat() e flatMap() sugli Array in JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ In questo articolo spiegherò come usare i nuovi metodi per array – flat() e  flatMap() – introdotti con ES2019 (EcmaScript 2019). Puoi usare questi metodi per "appiattire" degli array. Si tratta di metodi molto utili e semplici da usare. Sarà davvero molto bello utilizzare questi metodi nel tuo prossimo ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-usare-i-metodi-flat-e-flatmap-sugli-array-in-javascript/</link>
                <guid isPermaLink="false">640203ea51d6f8065ddb042e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Thu, 16 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/03/flat.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/flat-and-flatmap-javascript-array-methods/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use the flat() and flatMap() Methods to Flatten Arrays in JavaScript</a>
      </p><p>In questo articolo spiegherò come usare i nuovi metodi per array – <code>flat()</code> e <code>flatMap()</code> – introdotti con ES2019 (EcmaScript 2019). Puoi usare questi metodi per "appiattire" degli array.</p><p>Si tratta di metodi molto utili e semplici da usare. Sarà davvero molto bello utilizzare questi metodi nel tuo prossimo progetto. Prendi una tazza di tè e partiamo.</p><h2 id="prerequisiti"><strong>Prerequisiti</strong></h2><p>Per seguire questo tutorial dovresti avere familiarità con il concetto di array in JavaScript.</p><h2 id="cos-un-array"><strong>Cos'è un array?</strong></h2><p>Un oggetto array è una struttura di dati usata in diversi linguaggi di programmazione per contenere insiemi di dati.</p><h3 id="esempio-di-un-array-in-javascript"><strong>Esempio di un array in JavaScript</strong></h3><pre><code class="language-javascript">const array = [1, 2, 3, true, null, undefined];

console.log(array);

// output atteso
1, 2, 3, true, null, undefined
</code></pre><p>Nel codice soprastante, abbiamo assegnato una variabile chiamata <code>arr</code>, memorizzando al suo interno diversi elementi/dati di vario tipo.</p><p>Il primo elemento, che è <code>1</code>, si trova all'indice 0. L'ultimo elemento, <code>undefined</code>, si trova all'indice 5.</p><p>Non dimenticare che l'indicizzazione degli array parte da zero, quindi l'indice del primo elemento è zero.</p><h2 id="caratteristiche-degli-array-in-javascript"><strong>Caratteristiche degli array in JavaScript</strong></h2><ul><li><strong>Gli array sono indicizzati in base zero<strong>:</strong></strong> questo vuol dire semplicemente che il primo elemento di un array si trova all'indice zero. L'indice corrisponde alla posizione. In JavaScript e in altri linguaggi di programmazione simili, il termine corretto da usare è indice e non posizione.</li><li><strong>Gli array in <strong>JavaScript </strong>possono contenere diversi tipi di dati<strong>:</strong></strong> gli array JavaScript possono contenere un miscuglio di valori come numeri, stringhe, booleani, null e via dicendo.</li><li><strong><strong>JavaScript crea</strong> copie superficiali<strong>:</strong></strong> ciò significa che l'array e la sua copia puntano agli stessi valori – e modificando la copia puoi alterare anche l'array originale.</li></ul><h2 id="nuovi-metodi-per-array-in-javascript"><strong>Nuovi metodi per array in JavaScript</strong></h2><p>Gli array sono una delle strutture di dati più comuni in JavaScript.</p><p>Esistono diversi metodi per array che puoi usare per facilitare delle operazioni e renderti la vita più semplice. Alcuni metodi sono <code>reduce()</code>, <code>filter()</code>, <code>map()</code>, <code>flat()</code>, <code>flatMap()</code>, ma ce ne sono molti altri.</p><p>In questo articolo non parleremo di tutti i metodi per array usati in JavaScript. Invece, esamineremo i nuovi metodi <code>flat()</code> e <code>flatMap()</code> che puoi usare per convertire un array in un nuovo array.</p><h2 id="come-usare-il-metodo-flat-in-javascript"><strong>Come usare il metodo <code>flat</code> in JavaScript</strong></h2><p>Puoi usare il metodo <code>flat</code> per convertire un array in un nuovo array. Questo avviene prendendo i sotto-array contenuti e concatenandoli in un singolo array.</p><p>Un aspetto importante di questo metodo è che puoi trasformare l'array originale in un altro array in base alla sua profondità. Questo metodo è davvero utile perché rende il calcolo di questa operazione molto più semplice.</p><h2 id="esempi-del-metodo-flat-"><strong>Esempi del metodo <code>flat()</code></strong></h2><h3 id="come-impostare-il-parametro-di-profondit-">Come impostare il parametro di profondità</h3><pre><code class="language-js">array.flat(profondità);
</code></pre><p>Il valore del parametro profondità è 1 di default e puoi non esplicitarlo. Il parametro prende un numero come tipo di dato.</p><h4 id="esempio-1-del-metodo-flat-"><strong>Esempio 1 del metodo <code>flat()</code></strong></h4><p><code>array.flat(1)</code> è uguale a <code>array.flat()</code>.</p><p><code>array.flat(2);</code></p><p>Qui sopra, la profondità è <strong><strong>2</strong></strong>.</p><pre><code class="language-javascript">const arr = ["mon", "tues", ["wed", "thurs", ["fri", "sat"]], "sun"] ;

console.log(arr.flat());

// output atteso 
["mon", "tues", "wed", "thurs", Array ["fri", "sat"], "sun"];
</code></pre><p>Cosa sta succedendo in questo codice?</p><p>L'array contiene due sotto-array, che sono <code>["wed", "thurs", ["fri", "sat"]]</code>.</p><p>Utilizziamo il metodo <strong><strong>flat()</strong></strong> sull'array chiamato <strong><strong><code>arr</code></strong></strong> per concatenare il primo sotto-array, dato che non abbiamo specificato alcun valore di profondità all'interno del metodo. Ricorda che il valore predefinito di profondità è <strong><strong>1</strong></strong>.</p><p>Riesci a indovinare quale sarebbe l'array se il valore della profondità fosse 2?</p><h4 id="esempio-2-del-metodo-flat-"><strong>Esempio 2 del metodo <code>flat()</code></strong></h4><pre><code class="language-javascript">const arr = [1, 2, [3, 4, 5], 6, 7];

console.log(arr.flat());

// output atteso 
[1, 2, 3, 4, 5, 6, 7]
</code></pre><p>Nel codice qui sopra, l'array contiene il sotto-array <code>[3, 4, 5]</code>.</p><p>Utilizziamo il metodo <strong><strong>flat()</strong></strong> sull'array chiamato <strong><strong><code>arr</code></strong></strong> per concatenare i due array insieme in un singolo array.</p><h4 id="esempio-3-del-metodo-flat-"><strong>Esempio 3 del metodo <code>flat()</code></strong></h4><pre><code class="language-javascript">//esempio con profondità 2 
const arr2 = [[[1, 2], 3, 4, 5]] ;

console.log(arr2.flat(2));

// output atteso
[1, 2, 3, 4, 5]
</code></pre><p>Nel codice qui sopra, l'array chiamato <strong><strong><code>arr2</code></strong></strong> contiene due sotto-array.</p><p>Possiamo usare il metodo <strong><strong>flat()</strong></strong> su <code>arr2</code> per concatenare i due array in un singolo array perché utilizziamo il valore di profondità 2 all'interno del metodo flat(2). Dai un'occhiata qui sopra e vedi cosa fa il valore della profondità.‌</p><p>Questo è un ottimo metodo per concatenare gli elementi di array ricorsivamente.</p><h2 id="come-usare-il-metodo-flatmap-in-javascript"><strong>Come usare il metodo <code>flatMap</code> in JavaScript</strong></h2><p>Il metodo <code>flatMap()</code> usa una combinazione dei metodi <code>map()</code> e <code>flat()</code> per svolgere le sue operazioni.</p><p><code>flatMap()</code> itera sugli elementi di un array e li concatena in un solo livello. <code>flatMap()</code> accetta una funzione callback che prende come parametro l'elemento corrente dell'array originale.</p><h3 id="esempio-del-metodo-flatmap-"><strong>Esempio del metodo <code>flatMap()</code></strong></h3><pre><code class="language-javascript">const arr3 = [1, 2, [4, 5], 6, 7, [8]] ;

console.log(arr3.flatMap((element) =&gt; element)); 

// output atteso
[1, 2, 4, 5, 6, 7, 8]
</code></pre><p>Nel codice qui sopra, l'array chiamato <strong><strong><code>arr3</code></strong></strong> contiene due sotto-array distinti.</p><p>Abbiamo usato il metodo <strong><strong>flatMap()</strong></strong> sull'array passando una funzione callback, <strong><strong>(element) =&gt; element</strong></strong>, che itera sugli elementi dell'array e li concatena in un singolo array.</p><p>A volte ti troverai in una situazione in cui l'array ha una profondità maggiore e vuoi cambiare l'array in un solo livello di base. In questo caso, dovrai usare il metodo <code>flat()</code> subito dopo il metodo <code>flatMap()</code>.</p><h3 id="ecco-un-esempio-"><strong>Ecco un esempio:</strong></h3><pre><code class="language-javascript">const arr4 = [1, 2, [3, [4, 5, [6, 7]]]] ;

console.log(arr4.flatMap((element) =&gt; element).flat(2)) ;

// output atteso 
[1, 2, 3, 4, 5, 6, 7]

</code></pre><p>Nel codice qui sopra, l'array chiamato <strong><strong><code>arr4</code></strong></strong> contiene tre sotto-array.</p><p>Abbiamo usato il metodo <strong><strong>flatMap()</strong></strong> sull'array passando una funzione callback, <strong><strong>(element) =&gt; element</strong></strong>, che itera sugli elementi dell'array e li concatena.</p><p>Poi abbiamo usato il metodo <strong><strong>flat(2)</strong> </strong>per concatenare ulteriormente l'array in un singolo array passando una profondità di <strong><strong>2</strong></strong>.</p><p>Fai pratica con questo esempio senza usare il metodo flat(2) e vedi la differenza.</p><p>Questo è tutto quello che ti serve per iniziare a usare questo due nuovi metodi per array.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo ho parlato brevemente di cosa sono gli array e di come sono utili in JavaScript. Poi abbiamo imparato due nuovi importanti metodi per array, introdotti con ECMAScript 2019, che ti consentono di cambiare l'array originale in un nuovo array.</p><p>Si tratta dei metodi <code>flat()</code> e <code>flatMap()</code>.</p><p>Puoi usare il metodo <code>flat()</code> per concatenare ricorsivamente dei sotto-array in un singolo array. Il metodo <code>flat()</code> prende un valore di profondità come suo parametro, che è opzionale a seconda della profondità dell'array che vuoi "appiattire" (concatenare). Il valore di profondità predefinito del metodo <code>flat()</code> è 1.</p><p><code>flatMap()</code> invece funziona come una combinazione dei metodi <code>map()</code> e <code>flat()</code>. <code>flatMap()</code> itera sugli elementi di un array e li concatena.</p><p>Questi due nuovi metodi sono utili se vuoi cambiare un array in un nuovo array. Vale la pena di provarli in uno dei tuoi prossimi progetti, grandi o piccoli che siano.</p><h3 id="altre-risorse-utili-"><strong>Altre risorse utili:</strong></h3><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap">MDN – flatMap()</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat">MDN – flat</a>()</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Centrare un'Immagine con CSS – Come Centrare un'Immagine in un Div ]]>
                </title>
                <description>
                    <![CDATA[ Quando lavori sul front-end di una pagina web, a volte hai bisogno di centrare un'immagine all'interno di un div (contenitore). Delle volte può risultare complesso e, a seconda di certe condizioni, a un certo punto un particolare metodo potrebbe non funzionare, lasciandoti in cerca di alternative. In questo articolo, imparerai ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/centrare-unimmagine-con-css-come-centrare-unimmagine-in-un-div/</link>
                <guid isPermaLink="false">640ae6c59896040622f6f442</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Mon, 13 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/03/cover-template.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-center-an-image-in-a-div-css/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">CSS Image Centering – How to Center an Image in a Div</a>
      </p><p>Quando lavori sul front-end di una pagina web, a volte hai bisogno di centrare un'immagine all'interno di un <code>div</code> (contenitore).</p><p>Delle volte può risultare complesso e, a seconda di certe condizioni, a un certo punto un particolare metodo potrebbe non funzionare, lasciandoti in cerca di alternative.</p><p>In questo articolo, imparerai come centrare un'immagine in un <code>div</code> con CSS.</p><h2 id="come-centrare-un-div-con-css"><strong>Come centrare un <code>div</code> con CSS</strong></h2><p>Puoi centrare un'immagine in un <code>div</code> in due modi: orizzontalmente e verticalmente. Quando combini questi due metodi, ottieni un'immagine completamente centrata:</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660599829888_Untitled.png" class="kg-image" alt="s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660599829888_Untitled" width="600" height="400" loading="lazy"></figure><p>Come impostazione predefinita, il contenuto web parte sempre dall'angolo dello schermo in alto a sinistra e procede da sinistra a destra – eccetto per alcune lingue come l'arabo che vanno da destra a sinistra.</p><p>Iniziamo vedendo come centrare orizzontalmente un'immagine all'interno di un <code>div</code>. Poi vedremo come centrarla verticalmente. Infine, vedremo come fare entrambe le cose insieme.</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702367688_image.png" class="kg-image" alt="s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702367688_image" width="600" height="400" loading="lazy"></figure><h3 id="come-centrare-orizzontalmente-un-immagine-in-un-div-con-text-align"><strong>Come centrare orizzontalmente un'immagine in un div con text-align</strong></h3><p>Supponi di avere un <code>div</code> in cui hai posizionato un'immagine in questo modo:</p><pre><code class="language-html">&lt;div class="container"&gt;
    &lt;img src="./fcc-logo.png" alt="FCC Logo" /&gt;
&lt;/div&gt;
</code></pre><p>E di applicare dei semplici stili CSS in modo che l'immagine sia visibile:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
}
.container img {
    width: 100px;
}
</code></pre><p>Il metodo <code>text-align</code> non funzionerà in tutti i casi, dato che è usato tipicamente per centrare il testo. Ma quando hai un'immagine all'interno di un contenitore al livello di blocco come un <code>div</code>, allora questo metodo funziona:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    text-align: center;
}

.container img {
    width: 100px;
}
</code></pre><p>A questo scopo, devi aggiungere la proprietà <code>text-align</code> assieme al suo valore <code>center</code> al contenitore e non all'immagine stessa.</p><h3 id="come-centrare-orizzontalmente-un-immagine-in-un-div-con-margin-auto"><strong>Come centrare orizzontalmente un'immagine in un div con margin: auto</strong></h3><p>Un altro metodo che puoi usare per centrare orizzontalmente un'immagine all'interno di un <code>div</code> (contenitore) è la proprietà <code>margin</code> con il valore <code>auto</code>.</p><p>L'elemento prenderà una larghezza (<code>width</code>) <strong>specificata</strong>, e lo spazio restante sarà diviso equamente tra i margini destro e sinistro.</p><p>Di solito questo metodo si applica all'immagine stessa e non al contenitore. Sfortunatamente, questa proprietà da sola non funziona. Per prima cosa, occorre specificare la larghezza che l'immagine dovrà assumere. In questo modo, la larghezza rimanente è nota e può essere divisa equamente.</p><p>In secondo luogo, <code>img</code> è un elemento inline e la proprietà <code>margin: auto</code> non influisce sugli elementi inline. Ciò significa che devi prima convertirlo in un elemento al livello di blocco con la proprietà <code>display</code> impostata su <code>block</code>.</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
}

.container img {
    width: 100px;
    margin: auto;
    display: block;
}
</code></pre><h3 id="come-centrare-orizzontalmente-un-immagine-in-un-div-con-le-propriet-position-e-transform"><strong>Come centrare orizzontalmente un'immagine in un div con le proprietà position e transform</strong></h3><p>Un altro metodo che puoi usare per posizionare un'immagine orizzontalmente è la proprietà <code>position</code> insieme alla proprietà <code>transform</code>.</p><p>Questo metodo può essere complicato, ma funziona. Devi prima impostare la proprietà <code>position</code> del contenitore su <code>relative</code> e poi quella dell'immagine su <code>absolute</code>.</p><p>Una volta fatto ciò, puoi muovere l'immagine in qualsiasi posizione desideri usando le proprietà <code>left</code>, <code>top</code>, <code>bottom</code> o <code>right</code> sull'immagine.</p><p>In questo caso, vuoi spostare l'immagine solo per centrarla orizzontalmente. Ciò vuol dire che devi spostare l'immagine con <code>left</code> al 50% o <code>right</code> a -50%:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    position: relative;
}

.container img {
    width: 100px;
    height: 100px;
    position: absolute;
    left: 50%;
}
</code></pre><p>Ma controllando l'immagine, noterai che non è ancora perfettamente posizionata al centro. Questo perché parte dal 50%, che è la posizione centrale.</p><p>In questo caso, devi usare la proprietà <code>transform-translateX</code> per regolarla e centrarla orizzontalmente alla perfezione:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    position: relative;
}

.container img {
    width: 100px;
    height: 100px;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}
</code></pre><h3 id="come-centrare-orizzontalmente-un-immagine-in-un-div-con-display-flex"><strong>Come centrare orizzontalmente un'immagine in un div con display: flex</strong></h3><p>Flexbox rende semplice la progettazione di layout strutturali flessibili e responsivi senza usare float o il posizionamento. Possiamo anche usarlo per posizionare un'immagine al centro di un contenitore orizzontalmente tramite la proprietà <code>display</code> impostata sul valore <code>flex</code>.</p><p>Ma solo questo non è sufficiente. Occorre anche definire la posizione in cui mettere l'immagine. Ad esempio <code>center,</code> <code>left</code> o magari <code>right</code>:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    display: flex;
    justify-content: center;
}

.container img {
    width: 100px;
    height: 100px;
}
</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> la proprietà <code>display: flex</code> non è supportata nelle vecchie versioni dei browser. Puoi leggere di più <a href="https://caniuse.com/#search=display%20flex">qui</a>. Noterai anche che l'altezza e la larghezza dell'immagine sono definite per assicurare che l'immagine non rimpicciolisca.</p><p>E adesso impariamo come centrare un'immagine verticalmente in un <code>div</code>. In seguito vedremo come centrare un'immagine in un <code>div</code> orizzontalmente e verticalmente allo stesso tempo, ottenendo una centratura perfetta.</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702330431_image.png" class="kg-image" alt="s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702330431_image" width="600" height="400" loading="lazy"></figure><h3 id="come-centrare-verticalmente-un-immagine-in-un-div-con-display-flex"><strong>Come centrare verticalmente un'immagine in un div con display: flex</strong></h3><p>Allo stesso modo in cui sei stato in grado di centrare orizzontalmente un'immagine con il metodo display: flex, puoi fare lo stesso verticalmente.</p><p>Ma questa volta, non dovrai usare la proprietà <code>justify-content</code>. Invece userai la proprietà <code>align-items</code>:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    display: flex;
    align-items: center;
}

.container img {
    width: 100px;
    height: 100px;
}
</code></pre><p>Affinché il metodo funzioni, il contenitore deve avere un'altezza (<code>height</code>) specificata, che verrà usata per calcolare esattamente dove si trova il centro.</p><h3 id="come-centrare-verticalmente-un-immagine-in-un-div-con-le-propriet-position-e-transform"><strong>Come centrare verticalmente un'immagine in un div con le proprietà position e transform</strong></h3><p>In modo simile a come hai usato le proprietà <code>position</code> e <code>transform</code> precedentemente per centrare l'immagine orizzontalmente, puoi fare lo stesso verticalmente.</p><p>Stavolta, non userai <code>left</code> o <code>right,</code>. Invece userai <code>top</code> o <code>bottom</code> insieme a <code>translateY</code> piuttosto che <code>translateX</code>:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    position: relative;
}

.container img {
    width: 100px;
    height: 100px;
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
</code></pre><p>Hai imparato come centrare un'immagine in un <code>div</code> orizzontalmente o verticalmente usando tutti i metodi possibili. Adesso impariamo come centrarla orizzontalmente e verticalmente allo stesso tempo.</p><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropbox.com/s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702293626_image.png" class="kg-image" alt="s_E4F69027FF573CB7A65859895F7B6CD8342925344584ACB8BE37F8B299430A72_1660702293626_image" width="600" height="400" loading="lazy"></figure><h3 id="come-centrare-orizzontalmente-e-verticalmente-un-immagine-in-un-div-con-display-flex"><strong>Come centrare orizzontalmente e verticalmente un'immagine in un div con display: flex</strong></h3><p>La proprietà <code>display: flex</code> in combinazione con altre due proprietà consente di centrare l'immagine verticalmente e orizzontalmente.</p><p>Per questo metodo dovrai usare le proprietà <code>justify-content</code> e <code>align-items</code> impostate su <code>center</code>:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    display: flex;
    justify-content: center;
    align-items: center;
}

.container img {
    width: 100px;
    height: 100px;
}
</code></pre><h3 id="come-centrare-orizzontalmente-e-verticalmente-un-immagine-in-un-div-con-le-propriet-position-e-transform"><strong>Come centrare orizzontalmente e verticalmente un'immagine in un div con le proprietà position e transform</strong></h3><p>Anche questo è molto simile, in quanto tutto ciò che devi fare è combinare la centratura verticale e orizzontale:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    position: relative;
}

.container img {
    width: 100px;
    height: 100px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translateX(-50%) translateY(-50%);
}
</code></pre><p>Puoi anche combinare <code>translateX</code> e <code>translateY</code> usando <code>translate(x,y)</code>:</p><pre><code class="language-css">.container {
    width: 200px;
    height: 200px;
    background-color: #0a0a23;
    position: relative;
}

.container img {
    width: 100px;
    height: 100px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
</code></pre><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, hai imparato come centrare un'immagine in un div verticalmente, orizzontalmente oppure verticalmente e orizzontalmente in contemporanea.</p><p>Userai spesso il metodo Flexbox per postare un'immagine al centro, dato che il metodo <code>position</code> può distorcere la pagina web e ha un funzionamento ingannevole.</p><p>Puoi imparare altro sui metodi di posizionamento CSS <a href="https://www.freecodecamp.org/news/css-position-property-explained/">qui</a> e sul metodo flexbox <a href="https://www.freecodecamp.org/news/css-flexbox-tutorial-with-cheatsheet/">qui</a>.</p><p>Buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Usare le Espressioni Regolari in JavaScript – Un Tutorial per Principianti ]]>
                </title>
                <description>
                    <![CDATA[ Le espressioni regolari (regex) sono un utile strumento di programmazione. Sono fondamentali per elaborare del testo in modo efficiente. A uno sviluppatore può tornare molto utile sapere come risolvere problemi usando le espressioni regolari, inoltre migliora la produttività. In questo articolo, imparerai i fondamenti delle espressioni regolari, la loro notazione, ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-usare-le-espressioni-regolari-in-javascript-un-tutorial-per-principianti/</link>
                <guid isPermaLink="false">63f7543351d6f8065ddae5a8</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 07 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/regex-image-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/regular-expressions-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use Regular Expressions in JavaScript – Tutorial for Beginners</a>
      </p><p>Le espressioni regolari (regex) sono un utile strumento di programmazione. Sono fondamentali per elaborare del testo in modo efficiente. A uno sviluppatore può tornare molto utile sapere come risolvere problemi usando le espressioni regolari, inoltre migliora la produttività.</p><p>In questo articolo, imparerai i fondamenti delle espressioni regolari, la loro notazione, come interpretare un semplice pattern regex e come scrivere dei pattern regex tu stesso. Iniziamo!</p><h2 id="cosa-sono-le-espressioni-regolari"><strong>Cosa sono le espressioni regolari?</strong></h2><p>Le espressioni regolari sono dei pattern (dei motivi o modelli che corrispondono a specifiche sequenze di testo) che consentono di descrivere, trovare delle corrispondenze o analizzare un testo. Con le espressioni regolari puoi fare cose come trovare e sostituire del testo, verificare che un input di dati corrisponda al formato richiesto e altre cose simili.</p><p>Ecco un possibile utilizzo: vuoi verificare che il numero di telefono inserito in un modulo da un utente corrisponda a un formato, diciamo ###-###-#### (dove # rappresenta un numero). Un modo per risolvere questa situazione potrebbe essere:</p><pre><code class="language-js">function isPattern(userInput) {
  if (typeof userInput !== 'string' || userInput.length !== 12) {
    return false;
  }
  for (let i = 0; i &lt; userInput.length; i++) {
    let c = userInput[i];
    switch (i) {
      case 0:
      case 1:
      case 2:
      case 4:
      case 5:
      case 6:
      case 8:
      case 9:
      case 10:
      case 11:
        if (c &lt; 0 || c &gt; 9) return false;
        break;
      case 3:
      case 7:
        if (c !== '-') return false;
        break;
    }
  }
  return true;
}
</code></pre><p>Alternativamente, possiamo usare un'espressione regolare come questa:</p><pre><code class="language-js">function isPattern(userInput) {
  return /^\d{3}-\d{3}-\d{4}$/.test(userInput);
}
</code></pre><p>Abbiamo eseguito il refactoring del codice usando regex. Fantastico, vero? Tutto grazie al potere delle espressioni regolari.</p><h2 id="come-creare-un-espressione-regolare"><strong>Come creare un'espressione regolare</strong></h2><p>In JavaScript, puoi creare un'espressione regolare in due modi:</p><ul><li>Metodo #1: usando un'espressione regolare letterale, che consiste di un pattern racchiuso tra barre oblique. Puoi scriverla con o senza flag (vedremo a breve cosa vuol dire flag). La sintassi è la seguente:</li></ul><pre><code class="language-js">const regExpLiteral = /pattern/;          // Senza flag

const regExpLiteralWithFlags = /pattern/flag; // Con flag
</code></pre><p>Le barre oblique <code>/…/</code> indicano che stiamo creando il pattern di un'espressione regolare, allo stesso modo in cui usiamo le virgolette <code>“ ”</code> per creare una stringa.</p><ul><li>Metodo #2: usando la funzione constructor RegExp. La sintassi è la seguente:</li></ul><pre><code class="language-js">new RegExp(pattern [, flag])
</code></pre><p>In questo caso il pattern è racchiuso tra virgolette, così come il parametro flag, che è opzionale.</p><p>Dunque quando utilizziamo questi due metodi?</p><p>Dovresti utilizzare un'espressione regolare letterale quando conosci il pattern al momento della scrittura del codice</p><p>D'altro canto, dovresti utilizzare il costruttore Regex se il pattern deve essere creato dinamicamente. Il costruttore regex ti permette di scrivere un pattern usando un template literal, cosa che non è possibile con la sintassi regex letterale.</p><h3 id="cosa-sono-i-flag-nelle-espressioni-regolari"><strong>Cosa sono i flag nelle espressioni regolari?</strong></h3><p>I flag o modificatori sono caratteri che abilitano funzionalità di ricerca avanzata come la ricerca globale o case-insensitive (che non tiene conto di maiuscole e minuscole). Puoi usarli da soli o congiuntamente. Alcuni di quelli usati comunemente sono:</p><ul><li><code>g</code>: usato per la ricerca globale – la ricerca non si fermerà dopo la prima corrispondenza.</li><li><code>i</code>: usato per la ricerca case-insensitive – la corrispondenza può avvenire indipendentemente da maiuscole e minuscole.</li><li><code>m</code>: usato per la ricerca multi-riga.</li><li><code>u</code>: usato per la ricerca Unicode.</li></ul><p>Diamo un'occhiata ad alcuni pattern di espressioni regolari usando entrambe le sintassi.</p><h4 id="come-usare-le-espressioni-regolari-letterali-"><strong>Come usare le espressioni regolari letterali:</strong></h4><pre><code class="language-js">// Sintassi: /pattern/flag

const regExpStr = 'Hello world! hello there';

const regExpLiteral = /Hello/gi;

console.log(regExpStr.match(regExpLiteral));

// Output: ['Hello', 'hello']
</code></pre><p>Senza utilizzare il flag <code>i</code>, sarebbe stato restituito solo <code>Hello</code>.</p><p><code>/Hello/</code> è un esempio di pattern semplice, che consiste di caratteri che devono apparire letteramente nel testo bersaglio. Affinché ci sia corrispondenza, il testo bersaglio deve contenere la stessa sequenza del pattern.</p><p>Ad esempio, se riscrivi il testo dell'esempio precedente e provi a effettuare un riscontro:</p><pre><code class="language-js">const regExpLiteral = /Hello/gi;

const regExpStr = 'oHell world, ohell there!';

console.log(regExpStr.match(regExpLiteral));

// Output: null
</code></pre><p>Ottieni <em>null </em>perché i caratteri nella stringa non appaiono come specificato nel pattern. Quindi un pattern letterale come <code>/hello/</code> vuol dire esattamente <em><em>h</em>,</em> seguita da <em><em>e</em>,</em> seguita da <em><em>l</em>,</em> seguita da <em><em>l</em>,</em> seguita da <em><em>o</em></em>.</p><h4 id="come-usare-il-costruttore-regexp-"><strong>Come usare il costruttore RegExp:</strong></h4><pre><code class="language-js">// Sintassi: RegExp(pattern [, flag])

const regExpConstructor = new RegExp('xyz', 'g'); // Con flag -g

const str = 'xyz xyz';

console.log(str.match(regExpConstructor));

// Output: ['xyz', 'xyz']
</code></pre><p>Qui il pattern <code>xyz</code> viene passato come una stringa, così come il flag. La presenza di <code>xyz</code> viene riscontrata due volte per via del flag -g. Senza di esso avremmo ottenuto solo il primo riscontro.</p><p>Possiamo anche passare dei pattern creati dinamicamente come template literal, usando la funzione costruttore. Ad esempio:</p><pre><code class="language-js">const pattern = prompt('Inserisci un pattern');
// Ipotizziamo di aver inserito 'xyz'

const regExpConst = new RegExp(`${pattern}`, 'gi');

const str = 'xyz XYZ';

console.log(str.match(regExpConst)); // Output: ['xyz', 'XYZ']
</code></pre><h2 id="come-usare-i-caratteri-speciali-delle-espressioni-regolari"><strong>Come usare i caratteri speciali delle espressioni regolari</strong></h2><p>Un<strong> carattere speciale</strong> in un'espressione regolare è un carattere con un significato riservato. Usando i caratteri speciali, puoi fare ben altro che trovare semplicemente una corrispondenza diretta.</p><p>Ad esempio, se vuoi trovare un carattere che può o non può apparire una o più volte in una stringa, puoi farlo con dei caratteri speciali. Questi caratteri rientrano in diversi sottogruppi che svolgono funzioni simili.</p><p>Diamo un'occhiata a ogni sottogruppo e ai caratteri al loro interno.</p><h3 id="ancoraggi-e-confini-"><strong>Ancoraggi e confini:</strong></h3><p>Gli <strong>ancoraggi </strong>(anchor) sono metacaratteri che indicano l'inizio e la fine di una riga del testo in esame. Si utilizzano per imporre la posizione di un confine.</p><p>I due caratteri usati sono <code>^</code> e <code>$</code>.</p><ul><li><code>^</code> trova la corrispondenza all'inizio di una riga e ancora il pattern letterale al suo inizio. Ad esempio:</li></ul><pre><code class="language-js">const regexPattern1 = /^cat/;

console.log(regexPattern1.test('cat and mouse')); // Output: true

console.log(regexPattern1.test('The cat and mouse')); // Output: false
//perché la riga non inizia con cat

// Senza ^ nel pattern, l'output restituirà true
// perché non abbiamo imposto un confine.

const regexPattern2 = /cat/;

console.log(regexPattern2.test('The cat and mouse')); // Output: true
</code></pre><ul><li><code>$</code> trova la corrispondenza alla fine di una riga e ancora il pattern letterale alla sua fine. Ad esempio:</li></ul><pre><code class="language-js">const regexPattern = /cat$/;

console.log(regexPattern.test('The mouse and the cat')); // Output: true

console.log(regexPattern.test('The cat and mouse')); // Output: false
</code></pre><p>I caratteri di ancoraggio <code>^</code> e <code>$</code><strong><strong> </strong>trovano la corrispondenza in base alla posizione </strong>dei caratteri del pattern e non all'effettiva presenza dei caratteri stessi.</p><p>I <strong>confini di parole</strong> (word boundary)<strong> </strong>sono metacaratteri che trovano la corrispondenza all'inizio e alla fine di una parola – una sequenza di caratteri alfanumerici. Puoi immaginarli come una versione basata sulle parole di <code>^</code> e <code>$</code>. &nbsp;Puoi usare i metacaratteri <code>b</code> e <code>B</code> per imporre un confine di parola.</p><ul><li><code>\b</code> trova la corrispondenza all'inizio o alla fine di una parola, a seconda della posizione del metacarattere. Ecco un esempio:</li></ul><pre><code class="language-js">// Sintassi 1: /\b.../ dove ... rappresenta una parola.

// Indica una parola che inizia con il pattern ward
const regexPattern1 = /\bward/gi;

const text1 = 'backward Wardrobe Ward';

console.log(text1.match(regexPattern1)); // Output: ['Ward', 'Ward']

// Sintassi 2: /...\b/

// Indica una parola che finisce con il pattern ward
const regexPattern2 = /ward\b/gi;

const text2 = 'backward Wardrobe Ward';

console.log(text2.match(regexPattern2)); // Output: ['ward', 'Ward']

// Sintassi 3: /\b....\b/

// Indica una parola a sé stante costituita dal pattern ward
const regexPattern3 = /\bward\b/gi;

const text3 = 'backward Wardrobe Ward';

console.log(text3.match(regexPattern3)); // Output: ['Ward']
</code></pre><ul><li><code>\B</code> è l'opposto di <code>\b</code> . Trova corrispondenza in ogni posizione in cui <code>\b</code> non la trova.</li></ul><h3 id="codici-per-altri-metacaratteri-"><strong>Codici per altri metacaratteri:</strong></h3><p>In aggiunta ai metacaratteri che abbiamo visto, ecco alcuni di quelli usati più di frequente:</p><ul><li><code>\d</code> – corrisponde a ogni cifra decimale ed è una scorciatoia per [0-9].</li><li><code>\w</code> – corrisponde a ogni carattere alfanumerico che può essere una lettera, una cifra o un trattino basso. <code>\w</code> è una scorciatoia per [A-Za-z0-9_].</li><li><code>\s</code> – corrisponde allo spazio vuoto.</li><li><code>\D</code> – corrisponde a qualsiasi "non numero" ed è equivalente a [^0-9.]</li><li><code>\W</code> – corrisponde a qualsiasi carattere non alfanumerico è una una scorciatoia per [^A-Za-z0-9_].</li><li><code>\S</code> – corrisponde a ogni carattere che non è spazio vuoto.</li><li><code>.</code> – corrisponde a ogni carattere.</li></ul><h3 id="cos-la-classe-di-caratteri"><strong>Cos'è la classe di caratteri?</strong></h3><p>Una classe di caratteri viene usata per trovare corrispondenza con un insieme di caratteri in una particolare posizione. Per indicare una classe di caratteri si utilizzano le parentesi quadre <code>[]</code> contenenti la lista dei caratteri desiderati.</p><p>Guardiamo l'esempio:</p><pre><code class="language-js">// Indica una parola con due alternative di spelling

const regexPattern = /ambi[ea]nce/;

console.log(regexPattern.test('ambience')); // Output: true

console.log(regexPattern.test('ambiance')); // Output: true

// Il pattern regex si interpreta come:  indica a seguita da m, poi b,
// poi i, poi e o a, poi n, poi c e poi e.
</code></pre><h3 id="cos-una-classe-di-caratteri-negati"><strong>Cos'è una classe di caratteri negati?</strong></h3><p>Se aggiungi un accento circonflesso all'interno di una classe di caratteri, <code>[^...]</code>, la corrispondenza avverrà con ogni carattere che non è elencato nelle parentesi quadre. Ad esempio:</p><pre><code class="language-js">const regexPattern = /[^bc]at/;

console.log(regexPattern.test('bat')); // Output: false

console.log(regexPattern.test('cat')); // Output: false

console.log(regexPattern.test('mat')); // Output: true
</code></pre><h3 id="cos-un-intervallo"><strong>Cos'è un intervallo?</strong></h3><p>Un trattino <code>-</code> indica un intervallo, se usato all'interno di una classe di caratteri. Supponi di voler trovare una serie di numeri, diciamo <code>[0123456789]</code>, o un insieme di caratteri come <code>[abcdefg]</code>. Puoi scriverli in forma di intervallo, rispettivamente come <code>[0-9]</code> e <code>[a-g]</code>.</p><h3 id="cos-l-alternanza"><strong>Cos'è l'alternanza?</strong></h3><p>L'alternanza è un altro modo per specificare un insieme di opzioni. Occorre usare una barra verticale <code>|</code> per trovare corrispondenza con una qualsiasi sotto-espressione. Ciascuna delle sotto-espressioni è detta <strong>alternativa</strong>.</p><p>La barra verticale significa ‘o’, quindi trova corrispondenza tra una serie di opzioni. Consente di combinare sotto-espressioni come alternative.</p><p>Ad esempio, <code>(x|y|z)a</code> troverà <code>xa</code> o <code>ya</code>, oppure <code>za</code>. &nbsp;Per limitare la portata dell'alternanza puoi usare le parentesi e raggruppare insieme le alternative.</p><p>Senza parentesi, <code>x|y|za</code> vorrebbe dire <code>x</code> o <code>y</code> o <code>za</code>. Ad esempio:</p><pre><code class="language-js">const regexPattern = /(Bob|George)\sClan/;

console.log(regexPattern.test('Bob Clan')); // Output: true

console.log(regexPattern.test('George Clan')); // Output: true
</code></pre><h3 id="cosa-sono-i-quantificatori-e-l-avidit-"><strong>Cosa sono i quantificatori e l'avidità?</strong></h3><p>I quantificatori indicano quante volte un carattere, una classe di caratteri o un gruppo dovrebbe apparire nel testo bersaglio affinché ci sia una corrispondenza. Eccone alcuni particolari:</p><ul><li><code>+</code> trova ogni carattere a cui viene apposto se questo è presente almeno una volta. Ad esempio:</li></ul><pre><code class="language-js">const regexPattern = /hel+o/;

console.log(regexPattern.test('helo'));          // Output: true

console.log(regexPattern.test('hellllllllllo')); // Output: true

console.log(regexPattern.test('heo'));           // Output: false
</code></pre><ul><li><code>*</code> è simile al precedente ma con una leggera differenza. Trova ogni carattere a cui viene apposto se questo è presente zero o più volte. Ad esempio:</li></ul><pre><code class="language-js">const regexPattern = /hel*o/;

console.log(regexPattern.test('helo'));    // Output: true

console.log(regexPattern.test('hellllo')); // Output: true

console.log(regexPattern.test('heo'));     // Output: true

// * trova 0 o qualsiasi numero di 'l'
</code></pre><ul><li><code>?</code> significa "opzionale". Quando apposto a un carattere, vuol dire che questo può o non può essere presente. Ad esempio:</li></ul><pre><code class="language-js">const regexPattern = /colou?r/;

console.log(regexPattern.test('color'));  // Output: true

console.log(regexPattern.test('colour')); // Output: true

// Il ? dopo il carattere u lo rende opzionale
</code></pre><ul><li><code>{N}</code>, quando apposto a un carattere o a una classe di caratteri, specifica il numero di caratteri desiderato. Ad esempio <code>/\d{3}/</code> corrisponde a tre cifre consecutive.</li><li><code>{N,M}</code> è detto quantificatore di intervallo ed è usato per specificare un intervallo tra possibile corrispondenza minima e massima. Ad esempio <code>/\d{3, 6}/</code> trova un minimo di 3 e un massimo di 6 cifre consecutive.</li><li><code>{N, }</code> indica un intervallo aperto. Ad esempio <code>/\d{3, }/</code> trova tre o più cifre consecutive.</li></ul><h3 id="cos-l-avidit-in-regex"><strong>Cos'è l'avidità in regex?</strong></h3><p>Tutti i quantificatori sono <strong><strong>greedy</strong> </strong>(avidi) di default. Ciò vuol dire che provano a trovare una corrispondenza di tutti i caratteri possibili.</p><p>Per rimuovere questo stato predefinito e renderli non-greedy, aggiungi un <code>?</code> agli operatori, come <code>+?</code>, <code>*?</code>, <code>{N}?</code>, <code>{N,M}?</code> e così via.</p><h3 id="cosa-sono-raggruppamenti-e-backreference"><strong>Cosa sono raggruppamenti e backreference?</strong></h3><p>Precedentemente abbiamo visto come limitare la portata dell'alternanza usando le parentesi.</p><p>E se volessi usato un quantificatore come <code>+</code> o <code>*</code> su più di un carattere alla volta – diciamo una classe di caratteri o un gruppo? Puoi raggrupparli insieme usando le parentesi prima di aggiungere il quantificatore, proprio come in questo esempio:</p><pre><code class="language-js">const regExp = /abc+(xyz+)+/i;

console.log(regExp.test('abcxyzzzzXYZ')); // Output: true
</code></pre><p>Ecco cosa vuol dire il pattern: il primo + si riferisce alla c in abc, il secondo + alla z in xyz, e il terzo + alla sotto-espressione xyz (ci sarà corrispondenza anche nel caso la sequenza si ripeta).</p><p>Il <strong>backreference</strong> consente di trovare un nuovo pattern uguale a uno trovato precedentemente in un'espressione regolare. Anche in questo caso si usano le parentesi, per racchiudere una sotto-espressione trovata precedentemente (ovvero un gruppo di acquisizione).</p><p>Tuttavia, è possibile avere più di un gruppo di acquisizione in un'espressione regolare. Quindi per fare riferimento a un gruppo di acquisizione si utilizza un numero che identifica le parentesi.</p><p>Supponi di avere 3 gruppi di acquisizione in un'espressione regolare e di volervi fare riferimento. Puoi usare <code>\1</code>, <code>\2</code> o <code>\3</code>, per riferirti alla prima, seconda o terza parentesi. Per numerare le parentesi si inizia a contare le parentesi aperte da sinistra.</p><p>Vediamo alcuni esempi:</p><p><strong><strong><code>(x)</code></strong></strong> trova x e memorizza la corrispondenza.</p><pre><code class="language-js">const regExp = /(abc)bar\1/i;

// abc sfrutta il backreference ed è ancorata alla posizione \1
console.log(regExp.test('abcbarAbc')); // Output: true

console.log(regExp.test('abcbar')); // Output: false
</code></pre><p><strong><strong><code>(?:x)</code></strong></strong> trova x ma non memorizza la corrispondenza. In questo caso, \n (dove n è un numero) non fa riferimento a un gruppo di acquisizione precedente e la corrispondenza avverrà se letterale. Usando un esempio:</p><pre><code class="language-js">const regExp = /(?:abc)bar\1/i;

console.log(regExp.test('abcbarabc')); // Output: false

console.log(regExp.test('abcbar\1')); // Output: true
</code></pre><h3 id="la-regola-di-escape"><strong>La regola di escape</strong></h3><p>Per apparire letteralmente in un'espressione regolare, un metacarattere necessita di escape tramite barra rovesciata. In questo modo, il metacarattere perde il suo significato speciale all'interno della regex.</p><h2 id="metodi-di-espressioni-regolari"><strong>Metodi di espressioni regolari</strong></h2><h3 id="il-metodo-test-"><strong>Il metodo <code>test()</code></strong></h3><p>Abbiamo usato questo metodo parecchie volte in questo articolo. Il metodo <code>test()</code> confronta il testo bersaglio con l'espressione regolare e restituisce un valore booleano. Se c'è corrispondenza restituisce <code>true</code> (vero), altrimenti <code>false</code> (falso).</p><pre><code class="language-js">const regExp = /abc/i;

console.log(regExp.test('abcdef')); // Output: true

console.log(regExp.test('bcadef')); // Output: false
</code></pre><h3 id="il-metodo-exec-"><strong>Il metodo <code>exec()</code></strong></h3><p>Il metodo <code>exec()</code> confronta il testo bersaglio con il pattern regex. Se c'è corrispondenza, restituisce un array con gli elementi trovati – altrimenti restituisce <code>null</code>. Ad esempio:</p><pre><code class="language-js">const regExp = /abc/i;

console.log(regExp.exec('abcdef'));
// Output: ['abc', index: 0, input: 'abcdef', groups: undefined]

console.log(regExp.exec('bcadef'));
// Output: null
</code></pre><p>Esistono anche metodi di stringhe che accettano espressioni regolari come parametro, come <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match">match()</a></code>, <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace">replace()</a></code>, <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll">replaceAll()</a></code>, <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll">matchAll()</a></code>, <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search">search()</a></code> e <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split">split()</a></code>.</p><h2 id="esempi-di-regex"><strong>Esempi di regex</strong></h2><p>Ecco alcuni esempi per consolidare i concetti che hai imparato in questo articolo.</p><p>Primo esempio: come usare un pattern regex per trovare un indirizzo email:</p><pre><code class="language-js">const regexPattern = /^[(\w\d\W)+]+@[\w+]+\.[\w+]+$/i;

console.log(regexPattern.test('abcdef123@gmailcom'));
// Output: false
//Punto mancante

console.log(regexPattern.test('abcdef123gmail.'));
// Output: false
//'com' mancante

console.log(regexPattern.test('abcdef123@gmail.com'));
// Output: true
//L'input corrisponde al pattern
</code></pre><p>Interpretiamo il pattern. Ecco cosa sta accadendo:</p><ul><li><strong><strong><code>/</code></strong> </strong>rappresenta l'inizio del pattern dell'espressione regolare.</li><li><strong><strong><code>^</code></strong></strong> identifica l'inizio della riga con i caratteri nella classe di caratteri.</li><li><code><strong><strong>[(\w\d\W)+ ]+</strong></strong></code> corrisponde a qualsiasi parola, cifra o carattere non alfanumerico nella classe di caratteri presente almeno una volta. Nota come le parentesi sono state usate per raggruppare i caratteri prima di aggiungere il quantificatore. È equivalente a <code>[\w+\d+\W+]+</code> .</li><li><code><strong><strong>@</strong></strong></code> identifica la @ (letterale) all'interno dell'email.</li><li><code><strong><strong>[\w+]+</strong></strong></code> corrisponde a qualsiasi lettera nella classe di caratteri presente almeno una volta.</li><li><code><strong><strong>\.</strong></strong></code> corrisponde al punto, di cui è stato eseguito l'escape per farlo apparire come carattere letterale.</li><li><code><strong><strong>[\w+]+$</strong></strong></code> corrisponde a qualsiasi lettera nella classe. Inoltre, la classe di caratteri è ancorata alla fine della riga.</li><li><code><strong><strong>/</strong></strong></code> - fine del pattern</li></ul><p>Prossimo esempio: come trovare un URL con formato http://example.com o https://www.example.com:</p><pre><code class="language-js">const pattern = /^[https?]+:\/\/((w{3}\.)?[\w+]+)\.[\w+]+$/i;

console.log(pattern.test('https://www.example.com'));
// Output: true

console.log(pattern.test('http://example.com'));
// Output: true

console.log(pattern.test('https://example'));
// Output: false
</code></pre><p>Interpretiamo il pattern. Ecco cosa sta accadendo:</p><ul><li><code>/...../</code> rappresenta l'inizio e la fine dell'espressione regolare</li><li><code>^</code> identifica l'inizio della riga</li><li><code>[https?]+</code> corrisponde ai caratteri elencati almeno uno volta, tuttavia <code>?</code> rende la 's' opzionale.</li><li><code>:</code> corrisponde ai due punti.</li><li><code>\/\/</code> esegue l'escape delle due barre oblique.</li><li><code>(w{3}\.)?</code> corrisponde al carattere 'w' 3 volte e al punto che segue immediatamente. Il gruppo è opzionale.</li><li><code>[\w+]+</code> corrisponde ai caratteri nella classe, almeno una volta.</li><li><code>\.</code> esegue l'escape del punto</li><li><code>[\w+]+$</code><strong><strong> </strong></strong>corrisponde a qualsiasi carattere nella classe. La classe di caratteri è ancorata alla fine della riga.</li></ul><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, abbiamo esaminato i fondamenti delle espressioni regolari. Abbiamo anche spiegato alcuni pattern di espressioni regolari e fatto pratica con degli esempi.</p><p>C'è molto altro sulle espressioni regolari oltre questo articolo. Per aiutarti a imparare, ecco alcune risorse (in inglese) che puoi consultare:</p><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions">Regular Expression</a></li><li><a href="https://www.freecodecamp.org/news/regular-expressions-crash-course/">Learn Regex crash course</a></li><li><a href="https://www.regular-expressions.info/tutorial.html">Regular Expression Tutorial</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Cheatsheet">Regular Expression Cheatsheet</a></li></ul><p>È tutto per questo tutorial. Buona programmazione :)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial Oggetti JavaScript – Come Usare una Coppia Chiave-Valore in JS ]]>
                </title>
                <description>
                    <![CDATA[ In JavaScript, è possibile raggruppare insieme dei dati in una singola struttura di dati usando un oggetto, in questo modo: const desk = {    height: "4 feet",    weight: "30 pounds",    color: "brown",    material: "wood",  }; Un oggetto ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-usare-una-coppia-chiave-valore-in-js/</link>
                <guid isPermaLink="false">63fe0d9051d6f8065ddaf463</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Wed, 01 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/objects.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-object-keys-tutorial-how-to-use-a-js-key-value-pair/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Object Keys Tutorial – How to Use a JS Key-Value Pair</a>
      </p><p>In JavaScript, è possibile raggruppare insieme dei dati in una singola struttura di dati usando un oggetto, in questo modo:</p><pre><code class="language-javascript">const desk = {
   height: "4 feet",
   weight: "30 pounds",
   color: "brown",
   material: "wood",
 };
</code></pre><p>Un oggetto contiene proprietà, o coppie chiave-valore. L'oggetto <code>desk</code> qui sopra ha quattro proprietà. Ognuna di esse ha un nome, anche detto chiave, e un valore corrispondente.</p><p>Ad esempio, la chiave <code>height</code><strong><strong> </strong></strong>ha il valore <code>"4 feet"</code>. Insieme, la chiave e il valore costituiscono una singola proprietà.</p><pre><code class="language-javascript">height: "4 feet",
</code></pre><p>L'oggetto <code>desk</code> contiene dei dati riguardo a una scrivania. Questa è una ragione per utilizzare un oggetto JavaScript: conservare dati. È anche semplice recuperare i dati archiviati in un oggetto. Questo aspetto rende gli oggetti molto utili.</p><p>In questo articolo sugli oggetti JavaScript imparerai:</p><ul><li>come creare un oggetto</li><li>come salvare dei dati in un oggetto</li><li>e come recuperare i dati inseriti.</li></ul><p>Iniziamo creando un oggetto!</p><h1 id="come-creare-un-oggetto-in-javascript"><strong>Come creare un oggetto in JavaScript</strong></h1><p>Di seguito, ho creato un oggetto chiamato <code>pizza</code>, a cui ho aggiunto delle coppie chiave-valore.</p><pre><code class="language-javascript">const pizza = {
   topping: "cheese",
   sauce: "marinara",
   size: "small"
};
</code></pre><p>Le chiavi sono a sinistra dei due punti <strong><strong><code>:</code></strong></strong> e i valori sono sulla destra. Ogni coppia chiave-valore è una <strong>proprietà</strong>. In questo esempio ci sono tre proprietà:</p><ul><li>La chiave <strong><strong>topping</strong></strong> ha il valore <strong><strong>“cheese”</strong></strong>.</li><li>La chiave <strong><strong>sauce </strong></strong>ha il valore<strong><strong> “marinara”</strong></strong>.</li><li>La chiave <strong><strong>size </strong></strong>ha il valore<strong><strong> “small”</strong></strong>.</li></ul><p>Ogni proprietà è separata da una virgola. Nel complesso, tutte le proprietà sono racchiuse tra parentesi graffe.</p><p>Questa è la sintassi di base degli oggetti. Ma ci sono alcune regole da tenere a mente quando si creano degli oggetti in JavaScript.</p><h3 id="chiavi-degli-oggetti-javascript"><strong>Chiavi degli oggetti JavaScript</strong></h3><p>Ogni chiave di un oggetto JavaScript deve essere una stringa, un simbolo o un numero.</p><p>Guarda con attenzione il seguente esempio. I nomi delle chiavi <strong><strong><code>1</code></strong></strong> e <strong><strong><code>2</code> </strong></strong>in realtà vengono "convertiti" (tramite coercizione) in stringhe.</p><pre><code class="language-javascript">const shoppingCart = {
   1: "apple",
   2: "oranges"
};
</code></pre><p>La differenza risulta chiara stampando l'oggetto sulla console.</p><pre><code class="language-javascript">console.log(shoppingCart);
//Risultato: { '1': 'apple', '2': 'oranges' }
</code></pre><p>Esiste un'altra regola da tenere a mente riguardo ai nomi delle chiavi: se il nome contiene degli spazi occorre racchiuderlo tra virgolette.</p><p>Dai un'occhiata all'oggetto <code>programmer</code> qui sotto. Nota il nome dell'ultima chiave, <code>"current project name"</code>. Contiene degli spazi, quindi va racchiuso tra virgolette.</p><pre><code class="language-javascript">const programmer = {
   firstname: "Phil",
   age: 21,
   backendDeveloper: true,
   languages: ["Python", "JavaScript", "Java", "C++"],
   "current project name": "The Amazing App"
};
</code></pre><h3 id="valori-degli-oggetti-javascript"><strong>Valori degli oggetti JavaScript</strong></h3><p>Un valore, d'altro canto, può essere un qualsiasi tipo di dato, compresi array, numeri o booleani. L'esempio qui sopra contiene valori di tipo stringa, intero, booleano e array.</p><p>Puoi anche usare una funzione come valore. In tal caso viene detta metodo. Un esempio è <code>sounds()</code>, nel seguente oggetto.</p><pre><code class="language-javascript">const animal = {
   type: "cat",
   name: "kitty",
   sounds() { console.log("meow meow") }
};
</code></pre><p>Ora diciamo che vuoi aggiungere o eliminare una coppia chiave-valore, o semplicemente recuperare il valore di un oggetto.</p><p>Puoi farlo usando la notazione con punto (dot notation) o con parentesi (bracket notation), di cui ci occuperemo adesso.</p><h1 id="come-funzionano-le-notazioni-con-punto-e-parentesi-in-javascript"><strong>Come funzionano le notazioni con punto e parentesi in JavaScript</strong></h1><p>La notazione con punto e quella con parentesi sono due modi per accedere e utilizzare le proprietà di un oggetto. Probabilmente ti troverai a usare più spesso la notazione con punto, quindi partiamo da questa.</p><h3 id="come-aggiungere-una-coppia-chiave-valore-con-la-notazione-con-punto-in-javascript"><strong>Come aggiungere una coppia chiave-valore con la notazione con punto in JavaScript</strong></h3><p>Qui sotto ho creato un oggetto <code>book</code><strong><strong> </strong></strong>vuoto.</p><pre><code class="language-javascript">const book = {};
</code></pre><p>Per aggiungere una coppia chiave-valore usando la notazione con punto, usa la sintassi:</p><p><code>nomeOggetto.nomeChiave = valore</code></p><p>Questo è il codice per aggiungere la chiave (author) e il valore ("Jane Smith") all'oggetto <code>book</code>:</p><pre><code class="language-javascript">book.author = "Jane Smith";
</code></pre><p>Ecco un'analisi del codice qui sopra:</p><ul><li><code>book</code> è il nome dell'oggetto</li><li><code>.</code> (punto)</li><li><code>author</code> è il nome della chiave</li><li><code>=</code> (uguale)</li><li><code>"Jane Smith"</code> è il valore</li></ul><p>Quando stampiamo l'oggetto vedremo la coppia chiave-valore appena aggiunta.</p><pre><code class="language-javascript">console.log(book);
//Risultato: { author: 'Jane Smith' }
</code></pre><p>Aggiungiamo un'altra coppia chiave-valore all'oggetto <code>book</code>.</p><pre><code class="language-javascript">book.publicationYear = 2006;
</code></pre><p>Ora l'oggetto <code>book</code> ha due proprietà.</p><pre><code class="language-javascript">console.log(book);
//Risultato: { author: 'Jane Smith', publicationYear: 2006 }
</code></pre><h3 id="come-accedere-ai-dati-di-un-oggetto-javascript-usando-la-notazione-con-punto"><strong>Come accedere ai dati di un oggetto JavaScript usando la notazione con punto</strong></h3><p>Puoi usare la notazione con punto su una chiave per accedere al relativo valore.</p><p>Considera l'oggetto <code>basketballPlayer</code>.</p><pre><code class="language-javascript">const basketballPlayer = {
   name: "James",
   averagePointsPerGame: 20,
   height: "6 feet, 2 inches",
   position: "shooting guard"
};
</code></pre><p>Diciamo che vuoi recuperare il valore <code>“shooting guard”</code>. Questa è la sintassi da usare:</p><p><code>nomeOggetto.nomeChiave</code></p><p>Usiamo questa sintassi per ottenere e stampare il valore "shooting guard".</p><pre><code class="language-javascript">console.log(basketballPlayer.position);
//Risultato: shooting guard
</code></pre><p>Ecco un'analisi del codice qui sopra:</p><ul><li><code>basketballPlayer</code> è il nome dell'oggetto</li><li><code>.</code> (punto)</li><li><code>position</code> è il nome della chiave</li></ul><p>Ecco un altro esempio.</p><pre><code class="language-javascript">console.log(basketballPlayer.name);
//Risultato: James
</code></pre><h3 id="come-eliminare-una-coppia-chiave-valore-in-javascript"><strong>Come eliminare una coppia chiave-valore in JavaScript</strong></h3><p>Per eliminare una coppia chiave-valore utilizza l'operatore <code>delete</code> con la seguente sintassi:</p><p><code>delete nomeOggetto.nomeChiave</code></p><p>Quindi per cancellare la chiave <code>height</code><strong><strong> </strong></strong>e il suo valore dall'oggetto <code>basketballPlayer</code> dovrai scrivere il seguente codice:</p><pre><code class="language-javascript">delete basketballPlayer.height;
</code></pre><p>Di conseguenza, l'oggetto <code>basketballPlayer</code> adesso ha tre coppie chiave-valore.</p><pre><code class="language-javascript">console.log(basketballPlayer);
//Risultato: { name: 'James', averagePointsPerGame: 20, position: 'shooting guard' }
</code></pre><p>Probabilmente ti troverai a usare frequentemente la notazione con punto, anche se ci sono alcuni requisiti a cui prestare attenzione.</p><p>Quando utilizzi la notazione con punto, i nomi delle chiavi non possono contenere spazi, trattini o iniziare con un numero.</p><p>Ad esempio, se proviamo ad aggiungere una chiave che contiene spazi con la notazione con punto, otteniamo un errore.</p><pre><code class="language-javascript">basketballPlayer.shooting percentage = "75%";
//Errore
</code></pre><p>Quindi questa notazione non funziona in ogni situazione. Ecco perché c'è un'altra opzione: la notazione con parentesi.</p><h3 id="come-aggiungere-una-coppia-chiave-valore-usando-la-notazione-con-parentesi-in-javascript"><strong>Come aggiungere una coppia chiave-valore usando la notazione con parentesi in JavaScript</strong></h3><p>Puoi usare anche la notazione con parentesi per aggiungere una coppia chiave-valore a un oggetto.</p><p>La notazione con parentesi offre più flessibilità, visto che i nomi delle chiavi possono includere spazi e trattini e possono iniziare con numeri.</p><p>Qui sotto ho creato un oggetto <code>employee</code>.</p><pre><code class="language-javascript">const employee = {};
</code></pre><p>Adesso aggiungo una coppia chiave-valore usando la notazione con parentesi. Ecco la sintassi:</p><p><code>nomeOggetto[“nomeChiave”] = valore</code></p><p>Ed ecco come aggiungere la chiave <code>occupation</code> e il valore <code>"sales"</code> all'oggetto <code>employee</code>:</p><pre><code class="language-javascript">employee["occupation"] = "sales";
</code></pre><p>Di seguito, un'analisi del codice qui sopra:</p><ul><li><code>employee</code> è il nome dell'oggetto</li><li><code>"occupation"</code> è il nome della chiave</li><li><code>=</code> (uguale)</li><li><code>"sales"</code> è il valore</li></ul><p>Qui sotto ci sono altri esempi della flessibilità della notazione con parentesi per aggiungere una serie di coppie chiave-valore.</p><pre><code class="language-javascript">//Aggiungere chiavi composte da più parole
employee["travels frequently"] = true;
 
//Aggiungere chiavi che iniziano con un numero e contengono trattini
employee["1st-territory"] = "Chicago";
 
//Aggiungere chiavi che iniziano con un numero
employee["25"] = "total customers";
</code></pre><p>Quando stampiamo l'oggetto <code>employee</code>, otteniamo:</p><pre><code class="language-javascript">{
  '25': 'total customers',
  occupation: 'sales',
  'travels frequently': true,
  '1st-territory': 'Chicago'
}
</code></pre><p>Sapendo questo possiamo aggiungere la chiave <code>“shooting percentage”</code> all'oggetto <code>basketballPlayer</code> precedente.</p><pre><code class="language-javascript">const basketballPlayer = {
   name: "James",
   averagePointsPerGame: 20,
   height: "6 feet, 2 inches",
   position: "shooting guard"
};
</code></pre><p>Se ricordi, la notazione con punto ci ha lasciati con un errore quando abbiamo provato ad aggiungere una chiave che include spazi.</p><pre><code class="language-javascript">basketballPlayer.shooting percentage = "75%";
//Errore
</code></pre><p>Ma la notazione con parentesi non ci dà alcun errore, come puoi vedere qui:</p><pre><code class="language-javascript">basketballPlayer["shooting percentage"] = "75%";
</code></pre><p>Questo è il risultato che otteniamo stampando l'oggetto:</p><pre><code class="language-javascript">{
  name: 'James',
  averagePointsPerGame: 20,
  height: '6 feet, 2 inches',
  position: 'shooting guard',
  'shooting percentage': '75%'
}
</code></pre><h3 id="come-accedere-ai-dati-di-un-oggetto-javascript-usando-la-notazione-con-parentesi"><strong>Come accedere ai dati di un oggetto JavaScript usando la notazione con parentesi</strong></h3><p>Puoi usare anche la notazione con parentesi su una chiave per accedere al valore relativo.</p><p>Recuperiamo l'oggetto <code>animal</code> dall'inizio dell'articolo.</p><pre><code class="language-javascript">const animal = {
   type: "cat",
   name: "kitty",
   sounds() { console.log("meow meow") }
};
</code></pre><p>Otteniamo il valore associato alla chiave <code>name</code>. Per farlo racchiudiamo il nome della chiave tra virgolette e lo inseriamo tra parentesi quadre. Ecco la sintassi:</p><p><code>nomeOggetto[“nomeChiave”]</code></p><p>Questo è il codice che dovresti scrivere in notazione con parentesi: <code>animal["name"];</code>.</p><p>Ecco un'analisi del codice qui sopra:</p><ul><li><code>animal</code> è il nome dell'oggetto</li><li><code>["name"]</code> è il nome della chiave tra parentesi quadre</li></ul><p>Vediamo un altro esempio.</p><pre><code class="language-javascript">console.log(animal["sounds"]());

//Risultato: 
meow meow
undefined
</code></pre><p><code>sounds()</code><strong><strong> </strong></strong>è un metodo, per questo alla fine ho aggiunto le parentesi per invocarlo.</p><p>Ed ecco come invocare il metodo usando la notazione con punto.</p><pre><code class="language-javascript">console.log(animal.sounds());

//Risultato: 
meow meow
undefined
</code></pre><h1 id="metodi-di-oggetti-javascript"><strong>Metodi di oggetti JavaScript</strong></h1><p>Ora sai come accedere a specifiche proprietà. Ma se volessi tutte le chiavi o tutti i valori di un oggetto?</p><p>Esistono due metodi che ti daranno le informazioni che ti servono.</p><pre><code class="language-javascript">const runner = {
   name: "Jessica",
   age: 20,
   milesPerWeek: 40,
   race: "marathon"
};
</code></pre><p>Puoi usare il metodo <code>Object.keys()</code> per recuperare i nomi di tutti le chiavi di un oggetto.</p><p>Ecco la sintassi:</p><p><code>Object.keys(nomeOggetto)</code></p><p>Possiamo usare questo metodo sull'oggetto <code>runner</code> usato in precedenza.</p><pre><code class="language-javascript">Object.keys(runner);
</code></pre><p>Stampando il risultato, otteniamo un array con le chiavi dell'oggetto.</p><pre><code class="language-javascript">console.log(Object.keys(runner));
//Risultato: [ 'name', 'age', 'milesPerWeek', 'race' ]
</code></pre><p>Allo stesso modo possiamo usare il metodo <code>Object.values()</code> per ottenere tutti i valori di un oggetto. Questa è la sintassi:</p><p><code>Object.values(nomeOggetto)</code></p><p>Ora otterremo tutti i valori dell'oggetto <code>runner</code>.</p><pre><code class="language-javascript">console.log(Object.values(runner));
//Risultato: [ 'Jessica', 20, 40, 'marathon' ]
</code></pre><p>Abbiamo fatto un sacco di strada. Ecco i concetti fondamentali che abbiamo affrontato:</p><p><strong>Oggetti<strong>:</strong></strong></p><ul><li>Puoi usare gli oggetti per archiviare dati come proprietà (coppie chiave-valore).</li><li>I nomi delle chiavi possono essere stringhe, simboli o numeri.</li><li>I valori possono essere di qualsiasi tipo.</li></ul><p><strong>Accedere alle proprietà di un oggetto<strong>:</strong></strong></p><ul><li>Notazione con punto: <code>nomeOggetto.nomeChiave</code></li><li>Notazione con parentesi: <code>nomeOggetto[“nomeChiave”]</code></li></ul><p><strong>Eliminare una proprietà<strong>:</strong></strong></p><ul><li><code>delete nomeOggetto.nomeChiave</code></li></ul><p>Ci sono un sacco di cose che puoi fare con gli oggetti. E adesso hai alcune delle basi per poter trarre vantaggio di questo utile tipo di dato JavaScript.<br></p><p><em><em><em><em><em><em><em><em>Scrivo riguardo allo studio della programmazione e dei modi migliori per affrontarlo su</em></em></em></em></em></em></em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em> <a href="http://amymhaddad.com/" rel="noopener nofollow">amymhaddad.com</a>. </em></em></em></em></em></em></em></em></em></em></em></em></em></em></em><em><em><em><em><em><em><em>Condivido anche tweet sulla programmazione, l'apprendimento e la produttività</em></em></em></em></em></em></em><em><em><em><em><em><em><em>:<em><em><em><em><em><em><em><em> <a href="https://twitter.com/amymhaddad" rel="noopener nofollow">@amymhaddad</a></em></em></em></em></em></em></em></em></em></em></em></em></em></em>.</em></em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Trovare l'Indice di un Elemento in una Lista in Python ]]>
                </title>
                <description>
                    <![CDATA[ In questo articolo imparerai come trovare l'indice di un elemento contenuto in una lista nel linguaggio di programmazione Python. Esistono diversi modi per poterlo fare e in questo articolo imparerai tre differenti tecniche usate per trovare l'indice di un elemento in una lista in Python. Le tre tecniche sono:  ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-trovare-lindice-di-un-elemento-in-una-lista-in-python/</link>
                <guid isPermaLink="false">63c90b250fb58706fd71559f</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 28 Feb 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/01/find.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/python-find-in-list-how-to-find-the-index-of-an-item-or-element-in-a-list/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Find in List – How to Find the Index of an Item or Element in a List</a>
      </p><p>In questo articolo imparerai come trovare l'indice di un elemento contenuto in una lista nel linguaggio di programmazione Python.</p><p>Esistono diversi modi per poterlo fare e in questo articolo imparerai tre differenti tecniche usate per trovare l'indice di un elemento in una lista in Python.</p><p>Le tre tecniche sono:</p><ul><li>trovare l'indice usando il metodo per lista <code>index()</code>,</li><li>usando un loop <code>for</code>,</li><li>e infine, usando una comprensione di lista e la funzione <code>enumerate()</code>.</li></ul><p>In modo specifico, ecco quello che tratteremo nel dettaglio:</p><!--kg-card-begin: markdown--><ol>
<li><a href="#cosa-sono-le-liste-in-python">Una panoramica sulle liste in Python</a><br>
1.1 <a href="#una-panoramica-sugli-indici-in-python">Come funzionano gli indici</a></li>
<li><a href="#trovare-l-indice-di-un-elemento-usando-il-metodo-per-liste-index-in-python">Usare il metodo <code>index()</code> pre trovare l'indice di un elemento</a><br>
2.1 <a href="#come-usare-i-parametri-opzionali-con-il-metodo-index-">Usare i parametri opzionali con il metodo <code>index()</code></a></li>
<li><a href="#come-ottenere-gli-indici-di-tutte-le-ripetizioni-di-un-elemento-in-una-lista">Ottenere gli indici di tutte le ripetizioni di un elemento in una lista</a><br>
3.1 <a href="#usare-un-loop-for-per-ottenere-tutte-le-ripetizioni-di-un-elemento-in-una-lista">Usare un loop <code>for</code>per ottenere tutti gli indici di un elemento ripetuto</a><br>
3.2 <a href="#usare-una-comprensione-di-lista-e-la-funzione-enumerate-per-ottenere-tutte-le-ripetizioni-di-un-elemento-in-una-lista">Usare una comprensione di lista e la funzione <code>enumerate()</code> per ottenere tutti gli indici di un elemento ripetuto</a></li>
</ol>
<!--kg-card-end: markdown--><h2 id="cosa-sono-le-liste-in-python"><strong>Cosa sono le liste in Python?</strong></h2><p>Le liste sono dei tipi di dato integrati in Python e delle strutture di dati tra le più versatili.</p><p>Agiscono come contenitori e contengono valori multipli, generalmente correlati; elementi sotto lo stesso nome di variabile.</p><p>Gli elementi sono racchiusi all'interno di parentesi quadre, <code>[]</code>. Ogni elemento all'interno delle parentesi quadre è separato da una virgola, <code>,</code>.</p><pre><code class="language-python"># una lista chiamata 'my_information' che contiene stringhe e numeri
my_information = ["John Doe", 34, "London", 1.76]
</code></pre><p>Dall'esempio qui sopra puoi vedere che le liste possono contenere elementi di qualsiasi tipo di dato, ovvero gli elementi di una lista possono essere eterogenei.</p><p>A differenza degli array che possono contenere solo elementi dello stesso tipo, le liste consentono più flessibilità.</p><p>Inoltre, le liste sono <em>mutabili</em>, che vuol dire che sono modificabili e dinamiche. Gli elementi di una lista possono essere aggiornati, nuovi elementi possono essere aggiunti e ogni elemento può essere rimosso in qualsiasi momento durante la vita del programma.</p><h3 id="una-panoramica-sugli-indici-in-python"><strong>Una panoramica sugli indici in Python</strong></h3><p>Come menzionato, le liste sono insiemi di elementi. In modo specifico, sono insiemi ordinati di elementi che generalmente mantengono l'ordine definito.</p><p>Ogni elemento all'interno di una lista ha una posizione univoca che lo identifica.</p><p>Questa posizione è chiamata <em>indice</em>.</p><p>In Python e nei linguaggi di programmazione in generale, gli indici partono da <code>0</code> e <strong>non </strong>da <code>1</code>.</p><p>Diamo un'occhiata alla lista usata nella sezione precedente:</p><pre><code class="language-python">my_information = ["John Doe", 34, "London", 1.76]
</code></pre><p>Come detto, gli elementi della lista partono dall'indice <code>0</code>.</p><p>Il primo elemento della lista, <code>"John Doe"</code>, ha l'indice <code>0</code>.<br>Il secondo elemento della lista, <code>34</code>, ha l'indice <code>1</code>.<br>Il terzo elemento della lista, <code>"London"</code>, ha l'indice <code>2</code>.<br>Il quarto elemento della lista, <code>1.76</code>, ha l'indice <code>3</code>.</p><p>Gli indici sono utili per accedere a specifici elementi di una lista la cui posizione (indice) è nota.</p><p>Dunque, puoi fare riferimento all'elemento che desideri in una lista usando il suo indice.</p><p>Per accedere a un elemento, occorre usare il nome della lista, includendo tra parentesi quadre l'intero che corrisponde all'indice dell'elemento in questione.</p><p>Ecco come accedere a ogni elemento usando l'indice corrispondente:</p><pre><code class="language-python">my_information = ["John Doe", 34, "London", 1.76]

print(my_information[0])
print(my_information[1])
print(my_information[2])
print(my_information[3])

#output

#John Doe
#34
#London
#1.76
</code></pre><p>E se invece volessimo trovare l'indice di un elemento in una lista in Python?</p><p>Nelle seguenti sezioni vedrai alcuni modi in cui puoi trovare l'indice degli elementi di una lista.</p><h2 id="trovare-l-indice-di-un-elemento-usando-il-metodo-per-liste-index-in-python"><strong>Trovare l'indice di un elemento usando il metodo per liste <code>index()</code> in Python</strong></h2><p>Finora abbiamo visto come accedere a un valore facendo riferimento al suo indice numerico.</p><p>Cosa accade quando non conosci l'indice numerico e stai lavorando con una lista molto estesa?</p><p>Puoi fornire un valore e trovare il suo indice, trovando in questo modo la posizione che occupa nella lista.</p><p>A questo scopo, puoi usare il metodo integrato di Python <code>index()</code> come strumento di ricerca.</p><p>La sintassi del metodo <code>index()</code> è la seguente:</p><pre><code class="language-python">lista.index(elemento, inizio, fine)
</code></pre><p>Analizziamola nel dettaglio:</p><ul><li><code>lista</code> è il nome della lista in cui cercare.</li><li><code>.index()</code> è il metodo di ricerca che accetta tre parametri. Un parametro è obbligatorio e gli altri due sono opzionali.</li><li><code>elemento</code> è il parametro obbligatorio. È l'elemento di cui trovare l'indice.</li><li><code>inizio</code> è il primo parametro opzionale. È l'indice da cui avviare la ricerca.</li><li><code>fine</code> è il secondo parametro opzionale. È l'indice in cui terminare la ricerca.</li></ul><p>Vediamo un esempio usando solo il parametro obbligatorio:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("Python"))

#output
#1
</code></pre><p>Nell'esempio qui sopra, il metodo <code>index()</code> prende solo un argomento, che è l'elemento di cui stiamo cercando l'indice.</p><p>Tieni a mente che l'argomento passato è <em><em>case-sensitive</em></em>. Ciò vuol dire che se scrivi "python" e non "Python", otterrai un errore, dato che "python" con la "p" minuscola non fa parte della lista.</p><p>Il valore restituito è un intero, corrispondente all'indice numerico dell'elemento di lista passato al metodo come argomento.</p><p>Ecco un altro esempio:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("React"))

#output
#line 3, in &lt;module&gt;
#    print(programming_languages.index("React"))
#ValueError: 'React' is not in list
</code></pre><p>Se provi a cercare un elemento per cui non c'è corrispondenza nella lista, Python darà un errore come valore di ritorno – in modo specifico, restituirà <code>ValueError</code>.</p><p>Questo vuol dire che l'elemento che stai cercando non è presente nella lista.</p><p>Un modo per evitare che questo accada è racchiudere la chiamata del metodo <code>index()</code> in un blocco <code>try/except</code>.</p><p>Se il valore non esiste, ci sarà un messaggio sulla console che dice che il valore non è memorizzato nella lista e quindi non esiste.</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

try:
    print(programming_languages.index("React"))
except ValueError:
    print("That item does not exist")
    
#output
#That item does not exist
</code></pre><p>Un altro modo è verificare prima se l'elemento è nella lista e poi cercare il suo indice. L'output sarà un valore booleano – True o False.</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print("React" in programming_languages)

#output
#False
</code></pre><h3 id="come-usare-i-parametri-opzionali-con-il-metodo-index-"><strong>Come usare i parametri opzionali con il metodo <code>index()</code></strong></h3><p>Diamo un'occhiata al seguente esempio:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python"))

#output
#1
</code></pre><p>Nella lista <code>programming_languages</code> ci sono tre istanze della stringa "Python", che sta venendo cercata.</p><p>Come prova, dato che la lista è piccola, in questo caso potresti lavorare a ritroso.</p><p>Potresti contare e trovare gli indici numerici e poi farvi riferimento come abbiamo visto nelle sezioni precedenti:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages[1])
print(programming_languages[3])
print(programming_languages[5])

#output
#Python
#Python
#Python
</code></pre><p>C'è n'è una in posizione <code>1</code>, un'altra in posizine <code>3</code> e l'ultima in posizione <code>5</code>.</p><p>Perché non vengono mostrate quando viene usato il metodo <code>index()</code>?</p><p>Questo avviene perché il valore restituito dal metodo <code>index()</code> corrisponde alla <strong>prima </strong>presenza di un elemento nella lista. I valori successivi non vengono considerati.</p><p>Il metodo <code>index()</code> restituisce soltanto l'indice corrispondente alla posizione in cui l'elemento appare la prima volta.</p><p>Puoi provare a passare i parametri opzionali <code>inizio</code> e <code>fine</code> al metodo <code>index()</code>.</p><p>Sai già che la stringa è presente la prima volta all'indice <code>1</code>, quindi questo potrebbe essere il valore del parametro <code>inizio</code>.</p><p>Per il parametro <code>fine</code> puoi iniziare con la lunghezza della lista.</p><p>Per trovare la lunghezza, usa la funzione <code>len()</code>:</p><pre><code class="language-python">print(len(programming_languages)) 

#output is 6
</code></pre><p>Il valore del parametro <code>fine</code> dovrà essere il valore della lunghezza della lista meno 1. L'indice dell'ultimo elemento di una lista è sempre minore di uno rispetto alla lunghezza della lista.</p><p>Mettendo tutto insieme, ecco come puoi provare a ottenere tutte e tre le istanze dell'elemento:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python",1,5))

#output
#1
</code></pre><p>L'output è ancora la prima istanza!</p><p>I parametri <code>inizio</code> e <code>fine</code> definiscono un intervallo di posizioni per la ricerca e il valore restituito dal metodo <code>index()</code> corrisponde alla prima volta che l'elemento è presente nella lista all'interno dell'intervallo indicato.</p><h2 id="come-ottenere-gli-indici-di-tutte-le-ripetizioni-di-un-elemento-in-una-lista"><strong>Come ottenere gli indici di tutte le ripetizioni di un elemento in una lista</strong></h2><h3 id="usare-un-loop-for-per-ottenere-tutte-le-ripetizioni-di-un-elemento-in-una-lista"><strong>Usare un loop <code>for</code> per ottenere tutte le ripetizioni di un elemento in una lista</strong></h3><p>Prendiamo lo stesso esempio che abbiamo usato finora, in cui la stringa "Python" è presente tre volte nella lista.</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]
</code></pre><p>Iniziamo creando una nuova lista vuota.</p><p>Questa sarà la lista in cui saranno conservati tutti gli indici di "Python".</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []
</code></pre><p>Poi usiamo un loop <code>for</code> per iterare sulla lista e ottenere ogni elemento della lista originale. In modo specifico, iteriamo sull'indice di ogni elemento.</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):
</code></pre><p>Occorre usare la &nbsp;parola chiave <code>for</code>.</p><p>E poi creare una variabile, in questo caso <code>programming_language</code>, che agirà come segnaposto per la posizione di ogni elemento della lista originale durante il processo di iterazione.</p><p>In seguito, bisogna specificare le iterazioni che il loop <code>for</code> dovrà eseguire.</p><p>In questo caso, il loop itererà su tutte la lunghezza della lista, dall'inizio alle fine. La sintassi <code>range(len(programming_languages))</code> è un modo per accedere a tutti gli elementi della lista <code>programming_languages</code>.</p><p>La funzione <code>range()</code> accetta una sequenza di numeri che specificano il numero dal quale iniziare e quello a cui finire il conteggio.</p><p>La funzione <code>len()</code> calcola la lunghezza della lista, quindi in questo caso il conteggio parte da <code>0</code> e termina a <code>6</code> (non incluso), che è la fine della lista.</p><p>Infine, occorre impostare una condizione logica.</p><p>Essenzialmente, quello che vogliamo fare è: "se durante l'iterazione il valore a una data posizione è uguale a 'Python', aggiungi la posizione nella nuova lista creata precedentemente".</p><p>Per aggiungere un elemento alla lista usiamo il metodo <code>append()</code>.</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):
    if programming_languages[programming_language] == "Python":
      python_indices.append(programming_language)

print(python_indices)

#output

#[1, 3, 5]
</code></pre><h3 id="usare-una-comprensione-di-lista-e-la-funzione-enumerate-per-ottenere-tutte-le-ripetizioni-di-un-elemento-in-una-lista"><strong>Usare una comprensione di lista e la funzione <code>enumerate()</code> per ottenere tutte le ripetizioni di un elemento in una lista</strong></h3><p>Un altro modo per trovare gli indici di tutte le ripetizioni di un particolare elemento è usare una comprensione di lista.</p><p>La comprensione di lista è un modo per creare una nuova lista in base a una esistente.</p><p>Ecco come puoi ottenere tutti gli indici della stringa "Python", usando una comprensione di lista:</p><pre><code class="language-python">programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices  = [indice for (indice, elemento) in enumerate(programming_languages) if elemento == "Python"]

print(python_indices)

#[1, 3, 5]
</code></pre><p>Con la funzione <code>enumerate()</code> puoi salvare gli indici degli elementi che soddisfano la condizione definita.</p><p>Occorre prima fornire una coppia (<code>indice</code>, <code>elemento</code>) per ogni elemento nella lista (<code>programming_languages</code>) come argomento della funzione.</p><p><code>indice</code> è l'indice numerico dell'elemento della lista e <code>elemento</code> è l'elemento stesso.</p><p>Agisce come contatore, partendo da <code>0</code> e incrementando ogni volta che la condizione stabilita viene soddisfatta, selezionando e spostando gli indici degli elementi che corrispondono al criterio.</p><p>Accoppiata alla comprensione di lista, consente di creare una nuova lista con tutti gli indici della stringa "Python".</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Ed ecco fatto! Adesso conosci alcuni modi per trovare l'indice di un elemento, anche nel caso sia presente più volte in una lista in Python.</p><p>Spero tu abbia trovato utile questo articolo.</p><p>Se vuoi saperne di più su Python, dai un'occhiata alla <a href="https://www.freecodecamp.org/learn/scientific-computing-with-python/">certificazione di freeCodeCamp Calcolo Scientifico con Python</a>.</p><p>Partirai dalle basi e imparerai in un modo interattivo e adatto ai principianti. Alla fine dovrai anche creare cinque progetti per mettere in pratica e consolidare quello che hai imparato.</p><p>Grazie per aver letto e buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cos'è l'Hoisting in JavaScript? ]]>
                </title>
                <description>
                    <![CDATA[ In JavaScript, l'hoisting consente di utilizzare funzioni e variabili prima che siano dichiarate. In questo articolo impareremo cos'è l'hoisting e come funziona. Cos'è l'hoisting? Dai un'occhiata al codice qui sotto e indovina cosa accade quando viene eseguito: console.log(foo); var foo = 'foo'; Potrebbe sorprenderti che l'output di questo codice è ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/cose-lhoisting-in-javascript/</link>
                <guid isPermaLink="false">63f534e287f2e0059ba2ebaa</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Thu, 23 Feb 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/hoisting.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/what-is-hoisting-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Hoisting in JavaScript?</a>
      </p><p>In JavaScript, l'hoisting consente di utilizzare funzioni e variabili prima che siano dichiarate. In questo articolo impareremo cos'è l'hoisting e come funziona.</p><h2 id="cos-l-hoisting"><strong>Cos'è l'hoisting?</strong></h2><p>Dai un'occhiata al codice qui sotto e indovina cosa accade quando viene eseguito:</p><pre><code class="language-js">console.log(foo);
var foo = 'foo';
</code></pre><p>Potrebbe sorprenderti che l'output di questo codice è <code>undefined</code> e che non genera un errore – anche se <code>foo</code> viene assegnata dopo il <code>console.log</code>!</p><p>Questo perché l'interprete JavaScript divide dichiarazione e assegnazione di funzioni e variabili: "innalza" le dichiarazioni in cima all'ambito in cui sono contenute prima dell'esecuzione.</p><p>Questo processo è chiamato hoisting (dall'inglese hoist: sollevare, issare) e, nell'esempio precedente, consente di utilizzare <code>foo</code> prima che sia dichiarata.</p><p>Diamo un'occhiata più approfondita all'hoisting di variabili e funzioni per capire cosa vuol dire e come funziona.</p><h2 id="hoisting-di-variabili-in-javascript"><strong>Hoisting di variabili in JavaScript</strong></h2><p>Tanto per rinfrescarci la memoria: <strong>dichiariamo </strong>una variabile con le parole chiave <code>var</code>, <code>let</code> e <code>const</code>. Ad esempio:</p><pre><code class="language-js">var foo;
let bar;
</code></pre><p>E <strong>assegniamo </strong>un valore a una variabile con l'operatore di assegnazione:</p><pre><code class="language-jsx">// Dichiarazione
var foo;
let bar;

// Assegnazione
foo = 'foo';
bar = 'bar';
</code></pre><p>In molti casi, possiamo combinare dichiarazione e assegnazione in un solo passaggio:</p><pre><code class="language-js">var foo = 'foo';
let bar = 'bar';
const baz = 'baz';
</code></pre><p>L'hoisting delle variabili funziona differentemente a seconda di come la variabile viene dichiarata. Partiamo con le variabili dichiarate con <code>var</code>.</p><h3 id="hoisting-di-variabili-con-var"><strong>Hoisting di variabili con <code>var</code></strong></h3><p>Quando l'interprete effettua l'hoisting di una variabile dichiarata con <code>var</code>, ne inizializza il valore come <code>undefined</code>. L'output della prima riga di codice qui sotto è <code>undefined</code>:</p><pre><code class="language-js">console.log(foo); // undefined

var foo = 'bar';

console.log(foo); // "bar"
</code></pre><p>Come abbiamo già detto, l'hoisting deriva dall'interprete che divide la dichiarazione e l'assegnazione di una variabile. Possiamo ottenere lo stesso comportamento dividendo manualmente la dichiarazione e l'assegnazione in due passaggi:</p><pre><code class="language-js">var foo;

console.log(foo); // undefined

foo = 'foo';

console.log(foo); // "foo"
</code></pre><p>Ricorda che l'output del primo <code>console.log(foo)</code> è <code>undefined</code> perché <code>foo</code> è soggetto a hoisting e gli viene dato un valore predefinito (non perché la variabile non viene mai dichiarata). Usare una variabile non dichiarata genererebbe un errore <code>ReferenceError</code>:</p><pre><code class="language-js">console.log(foo); // Uncaught ReferenceError: foo is not defined
</code></pre><p>Anche usare una variabile non dichiarata prima prima della sua assegnazione causerebbe un errore <code>ReferenceError</code> poiché non è avvenuto l'hoisting di alcuna dichiarazione:</p><pre><code class="language-js">console.log(foo); // Uncaught ReferenceError: foo is not defined
foo = 'foo';      // Assegnare una variabile non dichiarata è valido
</code></pre><p>Ora potresti pensare "È piuttosto strano che JavaScript ci faccia accedere a variabili prima che siano dichiarate". Questo comportamento è una parte inusuale di JavaScript e può portare a errori. Usare una variabile prima della sua dichiarazione è solitamente non desiderabile.</p><p>Fortunatamente le variabili dichiarate con <code>let</code> e <code>const</code>, introdotte con ECMAScript 2015, si comportano in modo diverso.</p><h3 id="hoisting-di-variabili-con-let-e-const"><strong>Hoisting di variabili con <code>let</code> e <code>const</code></strong></h3><p>Le variabili dichiarate con <code>let</code> e <code>const</code> subiscono l'hoisting ma non vengono inizializzate con un valore predefinito. Accedere a una variabile dichiarata con <code>let</code> o <code>const</code> prima della dichiarazione comporta un <code>ReferenceError</code>:</p><pre><code class="language-js">console.log(foo); // Uncaught ReferenceError: Cannot access 'foo' before initialization

let foo = 'bar';  // Lo stesso vale per le variabili dichiarate con const
</code></pre><p>L'interprete effettua l'hoisting di <code>foo</code>: il messaggio di errore ci dice che la variabile è inizializzata da qualche parte.</p><h3 id="temporal-dead-zone"><strong>Temporal Dead Zone</strong></h3><p>La ragione per cui otteniamo un errore quando proviamo ad accedere a una variabile dichiarata con <code>let</code> o <code>const</code> prima della sua dichiarazione è la temporal dead zone (TDZ, letteralmente zona temporale morta).</p><p>La TDZ parte all'inizio dell'ambito che racchiude la variabile e termina quando viene dichiarata. Accedere alla variabile durante la TDZ causa un <code>ReferenceError</code>.</p><p>Ecco un esempio con un <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block">blocco</a> esplicito che mostra l'inizio e la fine del TDZ di <code>foo</code>:</p><pre><code class="language-js">{
 	// Inizio della TDZ di foo
  	let bar = 'bar';
	console.log(bar); // "bar"

	console.log(foo); // ReferenceError perché siamo nella TDZ

	let foo = 'foo';  // Fine della TDZ di foo
}
</code></pre><p>La TDZ è presente anche nei parametri di default delle funzioni, che vengono valutati da sinistra a destra. Nel seguente esempio, <code>bar</code> è nella TDZ finché non viene definito il suo valore di default:</p><pre><code class="language-js">function foobar(foo = bar, bar = 'bar') {
  console.log(foo);
}
foobar(); // Uncaught ReferenceError: Cannot access 'bar' before initialization
</code></pre><p>Ma il seguente codice funziona perché stiamo accedendo a <code>foo</code> fuori dalla sua TDZ:</p><pre><code class="language-jsx">function foobar(foo = 'foo', bar = foo) {
  console.log(bar);
}
foobar(); // "foo"
</code></pre><h3 id="typeof-nella-temporal-dead-zone"><strong><code>typeof</code> nella temporal dead zone</strong></h3><p>Usare delle variabili dichiarate con <code>let</code> o <code>const</code> come operandi di un operatore <code>typeof</code> nella TDZ causerà un errore:</p><pre><code class="language-js">console.log(typeof foo); // Uncaught ReferenceError: Cannot access 'foo' before initialization
let foo = 'foo';
</code></pre><p>Questo comportamento è coerente con gli altri casi con <code>let</code> e <code>const</code> nel TDZ che abbiamo visto. La ragione per cui otteniamo <code>ReferenceError</code> è che <code>foo</code> è dichiarata ma non inizializzata – dovremmo essere consapevoli che la stiamo usando prima dell'inizializzazione (<a href="https://2ality.com/2015/10/why-tdz.html">fonte: Axel Rauschmayer</a>).</p><p>Tuttavia, ciò non avviene con <code>var</code> prima della dichiarazione perché l'inizializzazione avviene con <code>undefined</code> durante l'hoisting:</p><pre><code class="language-jsx">console.log(typeof foo); // "undefined"
var foo = 'foo';
</code></pre><p>Oltretutto, ciò è sorprendente perché possiamo verificare il tipo di una variabile che non esiste senza ottenere un errore. <code>typeof</code> restituisce una stringa:</p><pre><code class="language-js">console.log(typeof foo); // "undefined"
</code></pre><p>Infatti, l'introduzione di <code>let</code> e <code>const</code> ha interrotto la garanzia che <code>typeof</code> restituisca come valore sempre una stringa per ogni operando.</p><h2 id="hoisting-di-funzioni-in-javascript"><strong>Hoisting di funzioni in JavaScript</strong></h2><p>Anche per le dichiarazioni di funzioni avviene l'hoisting. Ciò consente di chiamare una funzione prima che sia definita. Ad esempio, il seguente codice viene eseguito con successo e dà <code>"foo"</code> come output:</p><pre><code class="language-js">foo(); // "foo"

function foo() {
	console.log('foo');
}
</code></pre><p>Nota che l'hoisting avviene solo per le <em>dichiarazioni </em>di funzioni e non per le <em>funzioni espressioni </em>(function expression). Perfettamente sensato se pensiamo che abbiamo appena imparato che l'hoisting non avviene per l'assegnazione di variabili.</p><p>Se proviamo a chiamare una variabile assegnata a una funzione espressione, otterremo <code>TypeError</code> o <code>ReferenceError</code>, a seconda dell'ambito della variabile:</p><pre><code class="language-js">foo(); // Uncaught TypeError: foo is not a function
var foo = function () { }

bar(); // Uncaught ReferenceError: Cannot access 'bar' before initialization
let bar = function () { }

baz(); // Uncaught ReferenceError: Cannot access 'baz' before initialization
const baz = function () { }
</code></pre><p>Questo è diverso dal chiamare una funzione che è mai dichiarata, che genera un <code>ReferenceError</code> diverso:</p><pre><code class="language-js">foo(); // Uncaught ReferenceError: baz is not defined
</code></pre><h2 id="come-usare-l-hoisting-in-javascript"><strong>Come usare l'hoisting in JavaScript</strong></h2><h3 id="hoisting-di-variabili"><strong>Hoisting di variabili</strong></h3><p>Per via della confusione che può creare l'hoisting di variabili dichiarate con <code>var</code>, è meglio evitare di usare delle variabili prima che siano dichiarate. Se stai scrivendo il codice di un <a href="https://en.wikipedia.org/wiki/Greenfield_project">progetto greenfield</a>, dovresti usare <code>let</code> e <code>const</code>.</p><p>Se stai lavorando su un vecchio codebase o devi usare <code>var</code> per un'altra ragione, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting">MDN</a> raccomanda di scrivere le dichiarazioni con <code>var</code> più vicino possibile alla cima del loro ambito. In questo modo la visibilità delle variabili sarà più chiara.</p><p>Puoi anche considerare di usare la regola di <a href="https://eslint.org/docs/rules/no-use-before-define">ESLint</a> <code>no-use-before-define</code> (non usare prima di definire), che ti assicura di non usare una variabile prima della sua dichiarazione.</p><h3 id="hoisting-di-funzioni"><strong>Hoisting di funzioni</strong></h3><p>L'hoisting di funzioni è utile perché possiamo nascondere l'implementazione nella parte inferiore di un file e lasciare che chi legge si possa concentrare su quello che sta facendo il codice. In altre parole, possiamo aprire un file e vedere cosa fa il codice senza prima capire come è implementato.</p><p>Prendi questo esempio:</p><pre><code class="language-js">resetPunteggio();
disegnaTabellone();
popolaTabellone();
avviaGioco();

function resetPunteggio() {
	console.log("Sto resettando il punteggio");
}

function disegnaTabellone() {
	console.log("Sto disegnando il tabellone");
}

function popolaTabellone() {
	console.log("Sto popolando il tabellone");
}

function avviaGioco() {
	console.log("Sto avviando il gioco");
}
</code></pre><p>Abbiamo immediatamente un'idea di cosa fa il codice senza dover leggere tutte le dichiarazioni di funzione.</p><p>Comunque, usare le funzioni prima della dichiarazione è una questione di preferenza personale. Alcuni sviluppatori, come Wes Bos, preferiscono evitarlo e mettono le funzioni in moduli che possono essere importati al bisogno (<a href="https://wesbos.com/javascript/03-the-tricky-bits/hoisting">fonte: Wes Bos</a>).</p><p>La guida di stile di Airbnb va un passo oltre e incoraggia l'uso di function expression con nome rispetto alle dichiarazioni per evitare i riferimenti prima della dichiarazione:</p><blockquote>Le dichiarazioni di funzione sono soggette a hoisting, il che vuol dire che è facile – troppo facile – fare riferimento a una funzione prima che sia definita in un file. Ciò inficia la leggibilità e la manutenibilità.<br><br>Se trovi che una definizione di funzione è abbastanza lunga o complessa, tanto da interferire con la comprensione del resto del file, allora potrebbe essere il momento di inserirla in un suo modulo! (<a href="https://airbnb.io/javascript/#functions--declarations">fonte: Airbnb JavaScript Style Guide</a>)</blockquote><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Grazie per aver letto, spero che questo articolo ti abbia aiutato a imparare qualcosa sull'hoisting in JavaScript. Contattami pure su <a href="https://www.linkedin.com/in/zach-snoek-5b327b179/">LinkedIn</a> se vuoi connetterti o se hai delle domande!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Creare il tuo Primo Grafico con JavaScript e JSCharting ]]>
                </title>
                <description>
                    <![CDATA[ All'inizio del tuo viaggio come sviluppatore JavaScript, credo sia importante dedicarsi a progetti interessanti. In questo modo sarai sicuro di divertirti mentre impari, e magari troverai un'area di specializzazione che apprezzi. Come si dice, "Fai quello che ami e non lavorerai neanche un giorno in tutta la tua vita". Source: ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-creare-il-tuo-primo-grafico-con-javascript-e-jscharting/</link>
                <guid isPermaLink="false">63ece8bf87f2e0059ba2d700</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Fri, 17 Feb 2023 10:18:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/first-javascript-chart-using-csv-jscharting-fit.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-make-your-first-javascript-chart/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to make your first JavaScript chart with JSCharting</a>
      </p><p>All'inizio del tuo viaggio come sviluppatore JavaScript, credo sia importante dedicarsi a progetti interessanti. In questo modo sarai sicuro di divertirti mentre impari, e magari troverai un'area di specializzazione che apprezzi.</p><p>Come si dice, <em>"Fai quello che ami e non lavorerai neanche un giorno in tutta la tua vita"</em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/not-suited-for-work.gif" class="kg-image" alt="not-suited-for-work" width="600" height="400" loading="lazy"><figcaption>Source: giphy.com</figcaption></figure><p>In questo articolo ti inizierò alla visualizzazione dati front-end, che è la mia passione. Magari un giorno diventerà anche la tua!</p><p>Per me i momenti più gratificanti come sviluppatore sono quelli in cui posso vedere o provare i risultati di ciò che ho fatto. È molto soddisfacente creare un grafico che rivela informazioni interessanti sui suoi dati o fornisce un'esperienza interattiva che aiuta a esplorare i dettagli di un insieme di dati unico. Quanto più significativo è il risultato, tanto più l'esperienza è appagante.</p><p>Tuttavia, ho realizzato che la quantità di energie che spendi per un progetto non è necessariamente correlata con il senso di realizzazione – talvolta è fantastico anche quando è tutto relativamente semplice.</p><p>Col tempo troverai gli strumenti che ti aiutano ad essere più efficiente e, a volte, sposterai montagne con un dito. Nel campo della visualizzazione dati ci sono molte librerie e strumenti disponibili per realizzare grafici. Con gli strumenti giusti, sarai in grado di creare grafici con uno sforzo minimo, indipendentemente dal loro tipo. Personalmente credo la visualizzazione dati ricompensi ampiamente tutto il tempo e le energie investiti.</p><p>In questo tutorial utilizzerai vari strumenti per ottenere dati da internet, processarli e realizzare un bellissimo grafico visualizzabile in qualsiasi moderno browser. Puoi cliccare sui link qui sotto per scaricare il codice di esempio per ogni singolo passaggio, vedere tutto su <strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article">GitHub</a></strong></strong> o scaricare tutti i passaggi in un colpo qui: <strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/all-steps.zip">all-steps.zip</a>.</strong></strong></p><h2 id="il-risultato"><strong>Il risultato</strong></h2><p>Al termine di questo tutorial creerai questo grafico interattivo. Imparerai come ottenere i dati da internet, elaborarli e realizzare un grafico con quei dati. Sarai anche in grado di creare il tuo grafico da zero.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/javascript-line-chart.png" class="kg-image" alt="Interactive JavaScript line chart" width="600" height="400" loading="lazy"><figcaption>Grafico a linee interattivo</figcaption></figure><p>Dopo aver processato e graficato i dati, imparerai anche come fare degli aggiustamenti al grafico, come modificare la legenda predefinita, abilitare l'indicatore di posizione sull'asse x con descrizione e applicare annotazioni di testo per aggiungere contesto e altre informazioni al grafico.</p><h2 id="gli-strumenti"><strong>Gli strumenti</strong></h2><p>Per iniziare ti occorrerà un browser web probabilmente come quello che stai utilizzando per leggere questo articolo. Consiglio Chrome, dato che offre un'ottima esperienza e strumenti per sviluppatori integrati.</p><p>Poi avrai bisogno di un editor di testo. Andrà bene anche qualcosa di semplice come notepad, ma suggerisco un editor di codice più avanzato come VS Code, visto che si tratta di un ambiente in cui passerai un sacco di tempo. Offre un'esperienza di programmazione più piacevole e conveniente e facilita la scrittura di HTML5, CSS e JavaScript. E cosa più importante, se dimentichi una virgoletta o una virgola da qualche parte, un editor di codice può aiutarti a trovare l'errore.</p><p><a href="https://www.freecodecamp.org/italian/news/come-scegliere-il-miglior-editor-javascript-per-lo-sviluppo-web/">Quest'articolo</a> può aiutarti a scegliere il miglior editor di codice per lo sviluppo web con JavaScript.</p><p>Utilizzerai la libreria JSCharting per disegnare automaticamente il grafico e aggiungere delle funzionalità interattive. Non sarà necessaria nessuna altra libreria JavaScript come jQuery o piattaforma front-end come React e Angular (comunemente usati per i progetti di siti web).</p><h3 id="perch-jscharting"><strong>Perché JSCharting?</strong></h3><p><a href="https://jscharting.com/">JSCharting</a> è una libreria JavaScript per grafici che può creare molti tipi diversi di grafici usando SVG. È di facile approccio e utilizzo, quindi è adatta a questo tutorial. La API (Application Programming Interface, ovvero le opzioni e le impostazioni necessarie per creare i grafici) rende semplici cose complesse ed è una buona opzione per sperimentare con la visualizzazione dei dati.</p><p>Puoi utilizzare JSCharting gratuitamente per uso personale e commerciale con il brand incluso.</p><p>Con JSCharting puoi creare grafici responsivi in un paio di semplici passaggi:</p><ul><li>Definisci un tag <code>&lt;div&gt;</code> nel file HTML con un id univoco.</li><li>Fornisci l'id, i dati e qualsiasi altra opzione chiamando la funzione <code>JSC.Chart()</code> nel file JavaScript.</li></ul><p>Ecco tutto. JSC realizzerà un grafico dall'aspetto professionale popolando il tag div con elementi visivi SVG. Il grafico sarà responsivo e interattivo senza alcuno sforzo aggiuntivo.</p><h2 id="i-dati"><strong>I dati</strong></h2><p>Userai un file di dati forniti dal National Center for Health Statistics (NCHS) che comprende l'aspettativa di vita di uomini e donne negli Stati Uniti.</p><p>Puoi trovarlo qui: <a href="https://data.cdc.gov/resource/w9j2-ggv5.csv">https://data.cdc.gov/resource/w9j2-ggv5.csv</a>.</p><p>Questo file CSV contiene dati che dividono l'aspettativa di vita per anno, razza e sesso. Userai alcuni di questi dati per disegnare una semplice linea di tendenza per uomini/donne negli ultimi 100 anni.</p><p>Il formato CSV (Comma Separated Values) è ottimo per trasmettere dati sul web. È compatto, leggibile e puoi aprirlo direttamente in Excel, il che non è male.</p><p>Senza ulteriore indugio, iniziamo!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/readycat.gif" class="kg-image" alt="readycat" width="600" height="400" loading="lazy"><figcaption>Source: giphy.com</figcaption></figure><h2 id="step-1-aggiungi-un-grafico-vuoto"><strong>Step 1 - Aggiungi un grafico vuoto</strong></h2><p>Il primo file zip contiene il nostro punto di partenza, che potrai riempire man mano che proseguiamo. Se ti senti perso o confuso oppure vuoi andare avanti, il file zip alla fine o quello in ogni sezione ti rimetteranno al passo.</p><p>Se invece vuoi scaricare tutti i file in un colpo usa questo link: <strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/all-steps.zip">all-steps.zip</a></strong></strong><em><em>.</em></em></p><h3 id="step1-a-zip"><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step1-a.zip">step1-a.zip</a></strong></h3><p>Questo file zip contiene i seguenti file.</p><ul><li><code>index.html</code></li><li><code>js/index.js</code></li></ul><p>Il file <code>.html</code> è vuoto eccetto per del codice standard che lo rende un file valido e il file <code>.js</code> è completamente vuoto.</p><p>Il primo passaggio è aggiungere alcuni script al file della pagina HTML. Normalmente le persone suggeriscono di aggiungere i tag <code>&lt;script&gt;</code> all'interno dei tag <code>&lt;head&gt;</code>. Tuttavia, spesso è meglio aggiungere gli script che influiscono sul contenuto dell'HTML dopo il tag di chiusura <code>&lt;/body&gt;</code>.</p><p>Questa tecnica fa sì che tutto l'HTML sia caricato nel DOM prima di eseguire qualsiasi codice JavaScript. Prima di poter essere creato, il grafico necessita che l'HTML sia caricato. Il DOM (Document Object Model) è una rappresentazione del codice HTML nella memoria del browser. Una volta che l'HTML viene caricato nel DOM il browser può mostrarlo e JavaScript può interagirvi.</p><p>Inizia aggiungendo la libreria JSCharting al file HTML. Apri il file <code>index.html</code> nell'editor che preferisci. Poi aggiungi un tag script per includere JSCharting dopo il tag di chiusura <code>&lt;/body&gt;</code>. Il codice risultante alla fine del file dovrebbe essere il seguente:</p><pre><code class="language-html">&lt;/body&gt;
&lt;script src="https://code.jscharting.com/2.9.0/jscharting.js"&gt;&lt;/script&gt;
&lt;/html&gt;</code></pre><p>L'URL di questa libreria punta a un CDN (Content Delivery Network). Ospita il codice del grafico e rende conveniente e rapido aggiungere la libreria a qualsiasi pagina HTML per la prototipazione e sperimentare con i grafici. Puoi anche <a href="https://jscharting.com/download/">scaricare</a> e usare la libreria localmente o usare il pacchetto npm nel tuo progetto, ma il CDN non richiede nessun passaggio extra.</p><p>Poi, usando la stessa tecnica, aggiungi un altro tag script facendo riferimento al file JavaScript vuoto. Aggiungi questo script dopo lo script <code>jscharting.js</code>, in questo modo:</p><pre><code class="language-html">&lt;/body&gt;
&lt;script src="https://code.jscharting.com/2.9.0/jscharting.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/html&gt;</code></pre><p>Ottimo, siamo quasi pronti per creare il grafico vuoto. L'ultima cosa che occorre fare è aggiungere un <code>&lt;div&gt;</code> segnaposto all'interno del file HTML per definire il posto in cui vogliamo disegnare il grafico.</p><p>Aggiungi questo codice HTML tra i tag <code>&lt;body&gt;</code>.</p><pre><code class="language-html">&lt;body&gt;
    &lt;div id="chartDiv" style="width:50%; height:300px; margin:0 auto;"&gt;&lt;/div&gt;
&lt;/body&gt;</code></pre><p>Il div deve avere un id in modo da poter essere individuato specificamente. In questo caso l'id è <code>chartDiv</code>.</p><p>Potresti aver notato l'attributo style del tag <code>&lt;div&gt;</code>. Rende il div il 50% dell'ampiezza della finestra e alto 300 pixel. Lo stile dei margini <code>margin:0 auto;</code> centra il div nella pagina. Il grafico riempirà il div, qualsiasi sia la sua dimensione, quindi cambiare la dimensione del div è un buon modo per controllare la dimensione del grafico.</p><p>Con il file HTML è tutto posto. Apri il file <code>index.js</code> e aggiungi un grafico vuoto alla pagina scrivendo il seguente codice, che include il div con l'id <code>chartDiv</code>:</p><pre><code class="language-javascript">JSC.Chart('chartDiv', {});</code></pre><p>Apri il file <code>index.html</code> nel browser (seleziona e trascina il file in un browser come Chrome).</p><p>Non c'è molto da vedere, ma potresti notare un piccolo logo JSC sulla pagina. Indica che un grafico è stato collegato e creato.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/jscharting-brand.png" class="kg-image" alt="JSCharting logo shows the chart is working" width="600" height="400" loading="lazy"><figcaption>Il logo JSCharting mostra che il grafico sta funzionando</figcaption></figure><p><strong><strong><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step1-b.zip">step1-b.zip</a></strong></strong></strong></strong></p><h2 id="step-2-giocare-un-po-con-il-grafico"><strong>Step 2 - Giocare un po' con il grafico</strong></h2><p>Va bene, come test, aggiungiamo un paio di valori al grafico per poter vedere come funziona.</p><p>Tornando al file <code>index.js</code>, sostituisci il contenuto con il seguente codice che aggiunge più opzioni al grafico.</p><pre><code class="language-javascript">JSC.Chart('chartDiv', {
   type: 'horizontal column',
   series: [
      {
         points: [
            {x: 'Apples', y: 50},
            {x: 'Oranges', y: 42}
         ]
      }
   ]
});</code></pre><p>Adesso aggiorna (F5) la finestra del browser in cui hai caricato la pagina <code>index.html</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/horizontal-column-chart.png" class="kg-image" alt="Horizontal column chart with one series and two points" width="600" height="400" loading="lazy"><figcaption>Grafico a barre orizzontali con una serie e due punti</figcaption></figure><p>Bene! Hai appena creato il tuo primo grafico usando JavaScript.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/yeah-1.gif" class="kg-image" alt="yeah-1" width="600" height="400" loading="lazy"><figcaption>Source: giphy.com</figcaption></figure><p>Hai realizzato un grafico a barre definendo l'opzione <code>type</code> come <code>'horizontal column'</code>. Se preferisci delle colonne verticali, imposta il valore su <code>'column'</code>. Hai anche aggiunto una serie con due punti al grafico per <code>Apples</code> (mele) e <code>Oranges</code> (arance).</p><p>Tutti i dati del grafico sono fatti di una serie di punti. Una serie è semplicemente un gruppo di punti di dati. I grafici possono contenere una o più serie di dati. I punti consistono in valori che corrispondono agli assi x e y. I punti possono includere molte altre variabili e valori descrittivi.</p><p>L'esempio qui sopra contiene solo una serie di dati. Adesso diamo un'occhiata alle opzioni per un grafico con due serie. Sostituisci il contenuto del file JavaScript con questo codice.</p><pre><code class="language-javascript">JSC.Chart('chartDiv', {
   type: 'horizontal column',
   series: [
      {
         name:'Andy',
         points: [
            {x: 'Apples', y: 50},
            {x: 'Oranges', y: 32}
         ]
      },{
         name:'Anna',
         points: [
            {x: 'Apples', y: 30},
            {x: 'Oranges', y: 22}
         ]
      }
   ]
});</code></pre><p>Ricaricando la finestra del browser apparirà questo grafico.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/horizontal-column-cluster.png" class="kg-image" alt="Horizontal column chart with two series" width="600" height="400" loading="lazy"><figcaption>Grafico a barre orizzontali con due serie</figcaption></figure><p>Le opzioni del grafico sembrano familiari. È ancora un grafico a barre ma stavolta c'è un altro oggetto nell'array <code>series</code>. Abbiamo aggiunto anche delle proprietà <code>name</code> per ogni serie in modo da poter identificarle nella legenda.</p><p>Se sei interessato a creare grafici differenti, come grafici radar, areogrammi, grafici a torta, diagrammi di Gannt o anche mappe di calore, dai un'occhiata alla <a href="https://jscharting.com/examples/chart-types/">galleria di esempio di JSCharting</a> e al codice sorgente (opzioni dei grafici) usato per creare i grafici. Puoi imparare rapidamente come usare le altre funzionalità copiando gli esempi disponibili.</p><p><strong><strong><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step2.zip">step2.zip</a></strong></strong></strong></strong></p><h2 id="step-3-preparare-i-dati"><strong>Step 3 - Preparare i dati</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/data.gif" class="kg-image" alt="data" width="600" height="400" loading="lazy"><figcaption>Source: giphy.com</figcaption></figure><p>Il formato CSV è costituito da dati separati da virgole. Il file contiene righe, ognuna delle quali rappresenta un record o un'entrata. Normalmente la prima riga di valori contiene i nomi di ogni valore separato da virgola (colonna). Le righe successive contengono i valori veri e propri.</p><pre><code>name,age
chris,26
mike,34</code></pre><p>Il CSV è leggibile, ma ci sono variazioni di questo formato. A volte se i valori contengono virgole (come gli indirizzi di posta), il formato non funziona così com'è, quindi ogni valore va racchiuso tra virgolette. In questo modo le virgole all'interno delle virgolette vengono ignorate e il formato può ancora funzionare usando solo le virgole fuori dalle virgolette per separare i valori.</p><pre><code>"name","age","parents"
"Chris","26","Gregory, Mary"
"Mike","34","David, Sarah"</code></pre><p>I valori possono essere separati usando un carattere diverso come un carattere di tabulazione al posto delle virgole.</p><p>Ma non restiamo impantanati in questi cavilli. JSCharting fornisce vari strumenti che aiutano con questo processo e ne useremo uno per smettere di preoccuparci del formato CSV e convertirlo in JSON (JavaScript Object Notation). Il risultato sarà un array di oggetti. Ogni oggetto rappresenta una riga con proprietà che hanno un nome. La prima riga nel file CSV viene usata per definire i nomi di queste proprietà.</p><p>Questo è l'URL dei dati che ci interessano: <a href="https://data.cdc.gov/resource/w9j2-ggv5.csv">https://data.cdc.gov/resource/w9j2-ggv5.csv</a>.</p><p>Puoi cliccarci su per scaricarlo e aprirlo in Excel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-28.png" class="kg-image" alt="image-28" width="600" height="400" loading="lazy"><figcaption>Il file CSV aperto in Excel</figcaption></figure><p>In ogni caso, scaricherai e accederai a questi dati CSV in tempo reale usando del codice JavaScript. Il codice qui sotto potrebbe essere leggermente disorientante all'inizio, ma è breve e puoi riusarlo per ottenere programmaticamente qualsiasi file CSV, di testo o JSON da internet. È simile alla vecchia tecnologia AJAX ma più semplice da usare.</p><p>Di nuovo, sostituisci il contenuto del file <code>index.js</code> con il seguente codice:</p><pre><code class="language-javascript">fetch('https://data.cdc.gov/resource/w9j2-ggv5.csv')
   .then(function (response) {
      return response.text();
   })
   .then(function (text) {
	csvToSeries(text);
   })
   .catch(function (error) {
      //Qualcosa è andato storto
      console.log(error);
   });

function csvToSeries(text) {
   console.log(text);
}</code></pre><p>Perché è così complicato? Perché quando richiedi un file, non diventa immediatamente disponibile. C'è un ritardo e devi aspettare che il file arrivi. Quindi prima richiedi il file da un altro sito usando <code>fetch()</code>.</p><pre><code class="language-javascript">fetch('https://data.cdc.gov/resource/w9j2-ggv5.csv')</code></pre><p>Poi il codice all'interno della funzione argomento di <code>then(...)</code> viene chiamato con la risposta quando questa arriva. Questa funzione converte la risposta in testo e la restituisce, passando il risultato alla funzione argomento del <code>then()</code> successivo.</p><pre><code class="language-javascript">.then(function (response) {
	return response.text();
})</code></pre><p>La funzione argomento del <code>then(...)</code> successivo chiama la funzione <code>csvToSeries()</code> e le passa il testo come argomento.</p><pre><code class="language-javascript">.then(function (text) {
	csvToSeries(text);
})</code></pre><p>Nella funzione <code>catch()</code> puoi specificare cosa fare se qualcosa va storto. Ad esempio, la connessione si interrompe o l'URL non è corretto.</p><pre><code class="language-javascript">.catch(function (error) {
	//Qualcosa è andato storto
	console.log(error);
});</code></pre><p>In questo caso l'errore viene inviato alla console.</p><p>Nella funzione <code>csvToSeries()</code> passiamo il testo alla console come verifica.</p><pre><code class="language-javascript">function csvToSeries(text) {
   console.log(text);
}</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> la funzione nativa <code>fetch()</code> non è supportata da Internet Explorer 11. Se vuoi supportare questo browser puoi usare la funzione <code>JSC.fetch()</code> in dotazione con JSCharting. Fornisce la stessa funzionalità ma aggiungi supporto aggiuntivo per IE11.</p><p>Trascina il file <code>index.html</code> nella finestra del browser (o ricarica la pagina se è ancora aperta) e premi F12. In questo modo aprirai la finestra degli strumenti per sviluppatori del browser Chrome. Di default, la metà inferiore della finestra dei DevTools mostrerà l'output nella console. È qui che viene inviato il testo quando esegui del codice come:</p><pre><code class="language-javascript">console.log(text);</code></pre><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://lh4.googleusercontent.com/C9pr4DISX6SwVwUdrSUz8s54gIuNgseApHISaR-C0HXkU-8OKaup09xhIeWjn7MvzWraT4uIEYPJU63ZVopGAHSshqxE64a6m8mHQlPiTVZUV0mAh4_p_3vBvSxWnqM0B9Vt3kLP" class="kg-image" alt="C9pr4DISX6SwVwUdrSUz8s54gIuNgseApHISaR-C0HXkU-8OKaup09xhIeWjn7MvzWraT4uIEYPJU63ZVopGAHSshqxE64a6m8mHQlPiTVZUV0mAh4_p_3vBvSxWnqM0B9Vt3kLP" width="600" height="400" loading="lazy"><figcaption>Console</figcaption></figure><p>Puoi anche incollare o scrivere del codice nella finestra di questa console ed eseguirlo. Prova a incollare l'intero snippet di codice precedente nella finestra della console (dopo il carattere &gt;) e premi invio. Otterrai lo stesso risultato come output. Può essere molto utile per testare una riga di codice e sperimentare.</p><p><strong><strong><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step3-a.zip">step3-a.zip</a></strong></strong></strong></strong></p><p>A questo punto hai recuperato il testo del file CSV da internet e lo hai inviato alla console per verificare che funziona. Adesso possiamo iniziare a lavorarci su.</p><p>Diamo un'occhiata a questo file di dati per farci un'idea di cosa c'è dentro: <a href="https://data.cdc.gov/resource/w9j2-ggv5.csv">https://data.cdc.gov/resource/w9j2-ggv5.csv</a></p><p>Ho usato Excel per ordinare le righe in base alla colonna dell'anno, per poter analizzare le righe di dati per ogni anno.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-27.png" class="kg-image" alt="image-27" width="600" height="400" loading="lazy"><figcaption>I dati CSV ordinati per anno.</figcaption></figure><p>Ogni anno contiene 9 righe con dati basati su razza e sesso. Siamo interessati soltanto ai valori evidenziati per maschi (male) e femmine (female) di tutte le razze (All races) per ogni anno. Creerai due serie di dati basate sulle righe evidenziate. Una serie per i valori delle femmine e una per i valori dei maschi.</p><p>Ora che hai un'idea di cosa dobbiamo fare, procediamo.</p><p>Utilizziamo la funzione <code>JSC.csv2Json()</code> per convertire il testo in formato JSON e passarlo alla console per vedere cosa fa.</p><p>Aggiorna la funzione <code>csvToSeries()</code> con il seguente codice:</p><pre><code class="language-javascript">function csvToSeries(text) {
   let dataAsJson = JSC.csv2Json(text);
   console.log(dataAsJson)
}</code></pre><p>Ricarica il browser per vedere l'output aggiornato nella console.<br></p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-29.png" class="kg-image" alt="image-29" width="600" height="400" loading="lazy"><figcaption>Dati CSV convertiti in JSON usando la funzione di utilità JSC.csv2Json()</figcaption></figure><p>La console mostra un array di 1062 entrate. Ecco una di queste entrate:</p><pre><code class="language-json">{year: 1900, race: "All Races", sex: "Both Sexes", average_life_expectancy: 47.3, mortality: 2518}</code></pre><p><strong><strong>Not</strong>a<strong>:</strong></strong> la console può mostrare array e oggetti per un controllo, e puoi espandere o comprimere le sezioni nella console per esplorare i dettagli.</p><p>Il nome della proprietà <code>average_life_expectancy</code> è un po' lungo, ma ti servirà. Per evitare di scriverlo più di una volta, definiamo una variabile per conservarne il nome. Quando dobbiamo usare questa proprietà, possiamo scrivere semplicemente il nome della variabile <code>lifeExp</code>. Sarà <code>row[lifeExp]</code> invece di <code>row.average_life_expectancy</code>.</p><p>Aggiungi questa riga in cima alla funzione <code>csvToSeries()</code>.</p><pre><code class="language-javascript">function csvToSeries(text) {
	const lifeExp = 'average_life_expectancy';
	...</code></pre><p>Puoi elaborare i dati usando del semplice JavaScript. Il risultato finale che desideriamo è costituito da due serie di punti che includono un anno e un'aspettativa di vita per ogni punto.</p><p>Aggiorna la funzione <code>csvToSeries()</code> con il seguente codice:</p><pre><code class="language-javascript">function csvToSeries(text) {
	const lifeExp = 'average_life_expectancy';
	let dataAsJson = JSC.csv2Json(text);
	let male = [], female = [];
	dataAsJson.forEach(function (row) {
		 //add either to male, female, or discard.
		console.log(row);
	});
}</code></pre><p>Definisce degli array per i dati relativi a maschi (male) e femmine (female). Poi chiama la funzione <code>dataAsJson.forEach()</code> passando la funzione callback <code>function(row){...}</code> come argomento. La funzione <code>forEach()</code> eseguirà la funzione callback per ogni elemento nell'array <code>dataAsJson</code>. Per ora chiameremo <code>console.log(row)</code> su ogni riga che incontra la funzione callback.</p><p>Ricarica il browser e controlla l'output sulla console.</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-30.png" class="kg-image" alt="image-30" width="600" height="400" loading="lazy"><figcaption>Ogni oggetto row rilevato dalla funzione callback</figcaption></figure><p>Aggiungiamo un po' logica per filtrare i dati che vogliamo e mostrare il risultato nella console. Sostituisci la funzione <code>csvToSeries()</code> con questo codice.</p><pre><code class="language-javascript">function csvToSeries(text) {
	const lifeExp = 'average_life_expectancy';
	let dataAsJson = JSC.csv2Json(text);
	let male = [], female = [];
	dataAsJson.forEach(function (row) {
		 //add either to male, female, or discard.
		if (row.race === 'All Races') {
			if (row.sex === 'Male') {
				male.push({x: row.year, y: row[lifeExp]});
			} else if (row.sex === 'Female') {
				female.push({x: row.year, y: row[lifeExp]});
			}
		}
	});
    console.log([male, female]);
}</code></pre><p>All'interno della funzione callback decidiamo se la riga è di nostro interesse oppure se scartarla.</p><pre><code class="language-javascript">if (row.race === 'All Races') {
	if (row.sex === 'Male') {
		//add data to male array
		male.push({x: row.year, y: row[lifeExp]});
	} else if (row.sex === 'Female') {
		//add data to female array
		female.push({x: row.year, y: row[lifeExp]});
	}
}</code></pre><p>La logica verifica se il valore <code>row.race</code> sia uguale a 'All Races'. In tal caso, verifica se la proprietà <code>row.sex</code> sia uguale a 'Male' o 'Female'. Se la riga corrisponde a uno dei due, aggiunge i dati all'array <code>male</code> o <code>female</code> come un oggetto di punti <code>{x, y}</code>. Nota come l'uso della variabile <code>lifeExp</code> definita precedentemente aiuta ad accorciare il codice.</p><p>Alla fine, hai usato <code>console.log([male, female])</code> per passare le variabili <code>male</code> e <code>female</code> alla console per poter verificare che tutto è andato come previsto.</p><p>Dopo aver aggiornato il browser, la console mostra il risultato composto da due array, ognuno di 118 punti che vanno dal 1900 al 2017</p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://lh6.googleusercontent.com/V3yi_ZyqpoOMvn8jr1Tb31obS1WPHbgJ8p1LkPirFMLu8rjmzUs5-CgVCvtsLLnXscGO7HxR8_IM02_Q1twFPRNa1ll5JCCOoQbuK_S0hxqA7IZNoAqskksO62nXXRoSedjwUmzg" class="kg-image" alt="V3yi_ZyqpoOMvn8jr1Tb31obS1WPHbgJ8p1LkPirFMLu8rjmzUs5-CgVCvtsLLnXscGO7HxR8_IM02_Q1twFPRNa1ll5JCCOoQbuK_S0hxqA7IZNoAqskksO62nXXRoSedjwUmzg" width="600" height="400" loading="lazy"><figcaption>I punti degli array male e female</figcaption></figure><p>Infine, invece di passare il risultato alla console, racchiudi questi punti all'interno di un array di due serie che il grafico può usare direttamente e restituiscilo.</p><p>Aggiungi questo codice alla fine della funzione <code>csvToSeries()</code>:</p><pre><code class="language-javascript">return [
   {name: 'Male', points: male},
   {name: 'Female', points: female}
];</code></pre><p>Se i valori restituiti sono stati inviati alla console, dovrebbero produrre questo risultato.<br></p><figure class="kg-card kg-image-card kg-width-full kg-card-hascaption"><img src="https://lh6.googleusercontent.com/_xlnsylk8kbv1u9-Fw4K0dnmJ7J_UBzhbhrWT8j48S4xtr04gYezHIITd_cNWQ5ZvJvi4MPdqi_IIat-JSfmRiOZT7jDzco5JYSstOzec67OxAQ-LCB7zuyqm20gxV8FYEm1XL0d" class="kg-image" alt="_xlnsylk8kbv1u9-Fw4K0dnmJ7J_UBzhbhrWT8j48S4xtr04gYezHIITd_cNWQ5ZvJvi4MPdqi_IIat-JSfmRiOZT7jDzco5JYSstOzec67OxAQ-LCB7zuyqm20gxV8FYEm1XL0d" width="600" height="400" loading="lazy"><figcaption>Un array con due serie che il grafico può usare direttamente</figcaption></figure><p>Come puoi vedere, la logica per filtrare le righe è piuttosto semplice e puoi adattarla per ottenere altri dettagli dall'insieme di dati.</p><p>Per imparare di più sulla gestione dei file CSV usando le utilità di JSCharting, guarda questo <a href="https://jscharting.com/tutorials/js-chart-data/client-side/fetch-csv-and-json/">tutorial</a>. Quando sarai pronto per una gestione di dati più complessi, l'utilità <a href="https://jscharting.com/tutorials/js-chart-data/client-side/data-nesting/">JSC.nest()</a> può essere usata per creare serie e punti da dati JSON con pochissimo codice.</p><p><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step3-b.zip"><strong><strong>step3-b.zip</strong></strong></a></p><h2 id="step-4-mettere-tutto-insieme"><strong>Step 4 - Mettere tutto insieme</strong></h2><p>La sezione della gestione dei dati costituisce il passaggio più difficile, ma è necessaria per manipolare ed estrarre i dati di interesse da qualsiasi file CSV. È adesso che si mette insieme tutto e poi arriverà quel fantastico senso di realizzazione.</p><p>Inizia aggiungendo una funzione <code>renderChart()</code> alla fine del file <code>index.js</code>. Passeremo le serie di dati a questa funzione come argomento.</p><pre><code class="language-javascript">function renderChart(series){
   JSC.Chart('chartDiv', {
      series: series
   });
}</code></pre><p>Nella funzione argomento di <code>then()</code> che chiama <code>csvToSeries()</code>, passa il risultato <code>series</code> alla funzione <code>renderChart()</code> per vedere cosa accade nel browser.</p><pre><code class="language-javascript">.then(function (text) {
	let series = csvToSeries(text);
	renderChart(series);
})</code></pre><p><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step4-a.zip">step4-a.zip</a></strong></strong></p><p>Adesso ricarica il browser. Dovresti vedere questo grafico che utilizza i dati CSV elaborati nella sezione precedente. Bello, vero?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/csv-line-chart.png" class="kg-image" alt="Line chart showing filtered CSV data" width="600" height="400" loading="lazy"><figcaption>Grafico a linee che mostra i dati CSV filtrati</figcaption></figure><p>Wow, cos'è successo nel 1918? L'aspettativa di vita si è ridotta un sacco. Secondo Wikipedia c'è stata una <a href="https://it.wikipedia.org/wiki/Influenza_spagnola">pandemia influenzale</a> dovuta al virus H1N1 che ha sterminato una porzione della popolazione mondiale. Questo sfortunato evento ci mostra come visualizzare i dati possa dare informazioni che sarebbero meno evidenti guardando solo ai numeri.</p><p>Hai creato un grafico usando il tipo di serie lineare di default e sembra andare bene, ma puoi fare alcuni aggiustamenti e ritocchi per migliorarlo.</p><p>Per prima cosa, aggiungi un titolo in cima per spiegare il contenuto del grafico e un'annotazione in basso per citare la fonte dei dati. Aggiorna la funzione constructor <code>JSC.Chart()</code> in modo da passare le seguenti opzioni:</p><pre><code class="language-javascript">function renderChart(series){
	JSC.Chart('chartDiv', {
		title_label_text: 'Life Expectancy in the United States',
		annotations: [{
			label_text: 'Source: National Center for Health Statistics',
			position: 'bottom left'
		}],
		series: series
	});
}
</code></pre><p>Una volta ricaricata la pagina dovresti vedere il grafico aggiornato.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/line-chart-annotations.png" class="kg-image" alt="Line chart with title and annotation for attribution" width="600" height="400" loading="lazy"><figcaption>Grafico a linee con titolo e annotazioni per la fonte</figcaption></figure><p>Hai aggiunto un'annotazione con <code>label_text</code> (testo etichetta) e un'impostazione <code>position</code> (posizione). Possiamo usare un'altra annotazione anche per il titolo, ma in questo caso era più semplice usare <code>title_label_text</code>.</p><p>È facile controllare la posizione delle annotazioni usando valori come <code>'top right'</code> (in alto a destra) o <code>'inside bottom right'</code> (all'interno in basso a destra). Il valore <code>'inside'</code> vuol dire che l'annotazione viene posizionata all'interno dell'area del grafico in cui ci sono i dati. <a href="https://jscharting.com/examples/chart-features/annotation/box-positions/">Questo esempio</a> mostra le varie impostazioni di posizionamento.</p><p>La legenda mostra la somma dei valori dei punti per ogni serie, ma la somma non è importante per questo set di dati. Puoi ridurre le colonne della legenda in modo che mostrino l'icona della serie e il nome usando:</p><pre><code class="language-javascript">legend_template: '%icon,%name'</code></pre><p>Ma non è affatto necessario che utilizzi una legenda. Sarà più pulito etichettare le linee stesse. Con queste opzioni puoi disabilitare la legenda e fare in modo di mostrare il nome delle serie in corrispondenza dell'ultimo punto:</p><pre><code class="language-javascript">legend_visible: false,
defaultSeries_lastPoint_label_text: '&lt;b&gt;%seriesName&lt;/b&gt;',
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/csv-line-chart-labels.png" class="kg-image" alt="Line chart using point labels instead of a legend" width="600" height="400" loading="lazy"><figcaption>Grafico a linee con etichette al posto della legenda</figcaption></figure><p>Il token <code>'%seriesname'</code> è <a href="https://jscharting.com/tutorials/js-chart-labels/token-reference/#point-tokens">uno dei tanti</a> che possono essere usati in qualsiasi testo di etichetta per mostrare dettagli puntuali e calcoli.</p><p>Infine, abilitiamo l'indicatore sull'asse x con descrizione per mostrare l'aspettativa di vita maschile e femminile per ogni anno. Su dispositivi mobili puoi toccare lo schermo per vedere l'indicatore. Usando un PC, la descrizione viene visualizzata passando con il puntatore del mouse sul grafico.</p><pre><code class="language-javascript">xAxis_crosshair_enabled: true,</code></pre><p>Potresti chiederti il perché di tutti quei trattini bassi nel nome della proprietà. Questo non è il vero nome, ma un modo abbreviato per scrivere:</p><pre><code class="language-javascript">xAxis: {crosshair: {enabled: true}},</code></pre><p>Potresti trovare più conveniente specificare un'impostazione con i trattini bassi e JSCharting sarà in grado di capire ciò che intendi.</p><p>Il testo predefinito è chiaro, ma personalizziamolo un po'.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-60.png" class="kg-image" alt="image-60" width="600" height="400" loading="lazy"><figcaption>Indicatore con descrizione predefinita</figcaption></figure><p>Dato che vengono mostrate informazioni su ogni punto che l'indicatore incontra, il testo è definito all'interno delle opzioni del punto. La proprietà <code>defaultPoint</code> definisce le opzioni dei punti che verranno ereditate automaticamente da tutti i punti.</p><pre><code class="language-javascript">defaultPoint_tooltip: '%seriesName &lt;b&gt;%yValue&lt;/b&gt; years',</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/image-61.png" class="kg-image" alt="image-61" width="600" height="400" loading="lazy"><figcaption>Indicatore con testo descrittivo personalizzato</figcaption></figure><p>Per più informazioni su questa funzionalità dai un'occhiata a <a href="https://jscharting.com/tutorials/js-chart-interactivity/crosshair-combined-tooltip/">questo tutorial</a>.</p><p>Applicando tutte queste opzioni il tuo codice dovrebbe essere come il seguente. Sostituisci l'intera funzione <code>renderChart()</code> con questo codice.</p><pre><code class="language-javascript">function renderChart(series){
	JSC.Chart('chartDiv', {
		title_label_text: 'Life Expectancy in the United States',
		annotations: [{
			label_text: 'Source: National Center for Health Statistics',
			position: 'bottom left'
		}],
        legend_visible: false,
		defaultSeries_lastPoint_label_text: '&lt;b&gt;%seriesName&lt;/b&gt;',
		defaultPoint_tooltip: '%seriesName &lt;b&gt;%yValue&lt;/b&gt; years',
		xAxis_crosshair_enabled: true,
		series: series
	});
}
</code></pre><p>Ricarica ancora la finestra del browser.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/csv-line-chart-tooltips.png" class="kg-image" alt="Line chart with crosshairs and customized combined tooltips" width="600" height="400" loading="lazy"><figcaption>Grafico a linee con indicatore e descrizione personalizzata</figcaption></figure><p>Ce l'hai fatta!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/congratulations.gif" class="kg-image" alt="congratulations" width="600" height="400" loading="lazy"><figcaption>Source: giphy.com</figcaption></figure><p>Hai recuperato i dati in CSV usando JavaScript. Poi li hai convertiti in formato JSON e li hai filtrati in due serie. Con queste serie hai creato un fantastico grafico interattivo usando JSCharting e lo hai configurato per dargli un aspetto professionale.</p><p>Puoi personalizzare e modificare ulteriormente il grafico per soddisfare requisiti specifici. Visita la sezione <a href="https://jscharting.com/tutorials/">tutorial</a> di JSCharting per imparare di più su argomenti specifici o trovare grafici simili a quelli che vuoi realizzare nella <a href="https://jscharting.com/examples/chart-types/">galleria di esempio</a> e prendere ispirazione da essi per continuare il tuo viaggio nella visualizzazione dei dati.</p><p>Se ti imbatti in qualche problema con JSCharting, contatta il <a href="https://jscharting.com/support.htm">team di supporto</a>. Saranno felici di aiutarti a risolvere qualsiasi problema potresti incontrare.</p><p><strong><strong><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step4-b.zip">step4-b.zip</a></strong></strong></strong></strong></p><h2 id="sfida-bonus"><strong>Sfida bonus</strong></h2><p>Non abbiamo usato tutti i dati disponibili nel file CSV. Prova a sperimentare per fare pratica e divertirti.</p><p>Crea questo grafico usando ciò che hai imparato.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/bonus-trend-line-chart.png" class="kg-image" alt="Challenge: Replicate this chart on your own" width="600" height="400" loading="lazy"><figcaption>Sfida: replica questo grafico da solo</figcaption></figure><p>Questo file zip contiene la risposta:</p><p><strong><strong><a href="https://github.com/arthurPuszynski/first-chart-article/raw/master/zips/step5-bonus.zip">step5-bonus.zip</a></strong></strong></p><p>Riesci a immaginare che altri grafici potresti realizzare con questi dati? Continua a fare esperimenti e assapora ogni minuto!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Programmazione Orientata agli Oggetti in JavaScript – Spiegata con Esempi ]]>
                </title>
                <description>
                    <![CDATA[ JavaScript non è un linguaggio orientato agli oggetti o basato su classi. Nonostante ciò ci sono dei modi per utilizzare la programmazione orientata agli oggetti (object oriented programming, OOP). In questo tutorial, spiegherò la OOP e ti mostrerò come farne uso. Secondo Wikipedia [https://en.m.wikipedia.org/wiki/Class-based_programming], la programmazione basata su classi è ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/programmazione-orientata-agli-oggetti-in-javascript-spiegata-con-esempi/</link>
                <guid isPermaLink="false">63eb6bb787f2e0059ba2d071</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Tue, 14 Feb 2023 14:39:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/OOP-IN-JS-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-javascript-implements-oop/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Object Oriented Programming in JavaScript – Explained with Examples</a>
      </p><p>JavaScript non è un linguaggio orientato agli oggetti o basato su classi. Nonostante ciò ci sono dei modi per utilizzare la programmazione orientata agli oggetti (object oriented programming, OOP).</p><p>In questo tutorial, spiegherò la OOP e ti mostrerò come farne uso.</p><p>Secondo <a href="https://en.m.wikipedia.org/wiki/Class-based_programming">Wikipedia</a>, la programmazione basata su classi è</p><blockquote><em>uno stile di programmazione orientata agli oggetti (OOP) in cui l'ereditarietà avviene tramite la definizione di classi di oggetti, invece che tramite i soli oggetti.</em></blockquote><p>Il modello più popolare di OOP è quello basato su classi.</p><p>Ma come ho menzionato, JavaScript non è un linguaggio basato su classi – è un linguaggio basato sul prototype.</p><p>Secondo la documentazione di Mozilla:</p><blockquote>Un linguaggio basato sul prototype possiede il concetto di oggetto prototipico, un oggetto usato come stampo dal quale ottenere le proprietà iniziali per un nuovo oggetto.</blockquote><p>Dai un'occhiata a questo codice:</p><pre><code class="language-javascript">let names = {
    fname: "Dillion",
    lname: "Megida"
}
console.log(names.fname);
console.log(names.hasOwnProperty("mname"));
// Output atteso
// Dillion
// false
</code></pre><p>La variabile oggetto <code>names</code> ha solo due proprietà – <code>fname</code> e <code>lname</code>. Nessun metodo.</p><p>Quindi da dove salta fuori <code>hasOwnProperty</code>?</p><p>Viene fuori dal prototype di <code>Object</code>.</p><p>Prova a vedere sulla console il contenuto della variabile:</p><pre><code class="language-js">console.log(names);
</code></pre><p>Espandendo il risultato sulla console otterrai questo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/1-1.png" class="kg-image" alt="1-1" width="600" height="400" loading="lazy"><figcaption>console.log(names)</figcaption></figure><p>Nota l'ultima proprietà – <code>__proto__</code> – e prova ad espanderla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/2-1.png" class="kg-image" alt="2-1" width="600" height="400" loading="lazy"><figcaption>La proprietà __proto__ di names</figcaption></figure><p>Vedrai una serie di proprietà sotto il costruttore <code>Object</code>. Tutte queste proprietà derivano dal prototype globale di <code>Object</code>. Guardando con attenzione noterai anche la nostra proprietà nascosta <code>hasOwnProperty</code>.</p><p>In altre parole, tutti gli oggetti hanno accesso al prototype di <code>Object</code>. Non possiedono queste proprietà, ma è garantito loro l'accesso alle proprietà nel prototype.</p><h2 id="la-propriet-__proto__"><strong>La proprietà <code>__proto__</code></strong></h2><p>Questa proprietà punta all'oggetto usato come prototype.</p><p>Si tratta di una proprietà di ogni oggetto che gli dà accesso alla proprietà prototype di <code>Object</code>.</p><p>Ogni oggetto ha questa proprietà come impostazione predefinita, che fa riferimento al prototype di <code>Object</code>, tranne se configurata diversamente (ovvero se <code>__proto__</code> per quell'oggetto viene puntata su un altro prototype).</p><h3 id="modificare-la-propriet-__proto__"><strong>Modificare la proprietà <code>__proto__</code></strong></h3><p>Questa proprietà può essere modificata definendo esplicitamente che dovrebbe far riferimento a un altro prototype. I seguenti metodi vengono usati a questo scopo:</p><h3 id="object-create-"><strong><code>Object.create()</code></strong></h3><pre><code class="language-javascript">function DogObject(name, age) {
    let dog = Object.create(constructorObject);
    dog.name = name;
    dog.age = age;
    return dog;
}
let constructorObject = {
    speak: function(){
        return "I am a dog"
    }
}
let bingo = DogObject("Bingo", 54);
console.log(bingo);
</code></pre><p>Ecco come si presenta la console:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/3-1.png" class="kg-image" alt="3-1" width="600" height="400" loading="lazy"><figcaption>console.log(bingo)</figcaption></figure><p>Hai notato la proprietà <code>__proto__</code> e il metodo <code>speak</code>?</p><p><code>Object.create</code> fa sì che l'argomento passatole diventi il prototype.</p><h3 id="parola-chiave-new"><strong>Parola chiave <code>new</code></strong></h3><pre><code class="language-javascript">function DogObject(name, age) {
    this.name = name;
    this.age = age;
}
DogObject.prototype.speak = function() {
    return "I am a dog";
}
let john = new DogObject("John", 45);
</code></pre><p>La proprietà <code>__proto__</code> di <code>john</code> è diretta verso il prototype di <code>DogObject</code>. Ma ricorda che il prototype di <code>DogObject</code> è un oggetto (<strong>coppie chiave-valore</strong>), dunque possiede anch'esso una proprietà <code>__proto__</code> che fa riferimento al prototype globale di <code>Object</code>.</p><p>Questa tecnica viene chiamata <strong><strong>PROTOTYPE CHAINING</strong> </strong>(concatenamento di prototype).</p><p>Nota che l'approccio con la parola chiave <code>new</code> fa la stessa cosa di <code>Object.create()</code>, ma lo rende l'operazione più semplice dato che fa alcune cose automaticamente per te.</p><h3 id="quindi-"><strong>Quindi...</strong></h3><p>Ogni oggetto in JavaScript ha accesso al prototype di <code>Object</code> di default. Se configurato per fare uso di un altro prototype, diciamo <code>prototype2</code>, allora <code>prototype2</code> avrà comunque accesso al prototype di <code>Object</code> di default e così via.</p><h3 id="combinazione-oggetto-funzione"><strong>Combinazione oggetto + funzione</strong></h3><p>Probabilmente sei confuso dal fatto che <code>DogObject</code> sia una funzione (<code>function DogObject(){}</code>) e che abbia delle proprietà accessibili con la notazione a punto. Ciò viene chiamata <strong>combinazione funzione oggetto</strong>.</p><p>Quando le funzioni vengono dichiarate, vengono date loro molte proprietà di default. Ricorda che anche le funzioni sono degli oggetti in JavaScript.</p><h2 id="e-ora-le-classi"><strong>E ora, le classi</strong></h2><p>La parola chiave <code>class</code> è stata introdotta in JavaScript con ECMAScript 2015. Rende JavaScript simile a un linguaggio OOP. Ma si tratta solo dello zucchero sintattico sulla base della tecnica di prototyping esistente, la quale continua in background, mentre dall'esterno il tutto sembra avere l'aspetto di una OOP. Adesso cercheremo di capire come sia possibile.</p><p>Il seguente esempio è un generico utilizzo di <code>class</code> in JavaScript:</p><pre><code class="language-javascript">class Animals {
    constructor(name, specie) {
        this.name = name;
        this.specie = specie;
    }
    sing() {
        return `${this.name} can sing`;
    }
    dance() {
        return `${this.name} can dance`;
    }
}
let bingo = new Animals("Bingo", "Hairy");
console.log(bingo);
</code></pre><p>Questo è il risultato sulla console:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/5-1.png" class="kg-image" alt="5-1" width="600" height="400" loading="lazy"><figcaption>console.log(bingo)</figcaption></figure><p><code>__proto__</code> fa riferimento al prototype di <code>Animals</code> (che a sua volta fa riferimento al prototype di <code>Object</code>).</p><p>Da qui, possiamo vedere che il costruttore definisce le caratteristiche principali, mentre tutto ciò che è al di fuori del costruttore (<code>sing()</code> e <code>dance()</code>) costituisce delle funzionalità aggiuntive (<strong><strong>prototype</strong></strong>).</p><p>In background, usando l'approccio con la parola chiave <code>new</code>, quanto sopra si traduce in:</p><pre><code class="language-javascript">function Animals(name, specie) {
    this.name = name;
    this.specie = specie;
}
Animals.prototype.sing = function(){
    return `${this.name} can sing`;
}
Animals.prototype.dance = function() {
    return `${this.name} can dance`;
}
let Bingo = new Animals("Bingo", "Hairy");
</code></pre><h2 id="sottoclassi"><strong>Sottoclassi</strong></h2><p>Questa è una caratteristica della OOP, per cui una classe eredita caratteristiche dalla sua classe genitore ma possiede anche caratteristiche extra che il genitore non ha.</p><p>Ad esempio, diciamo di voler creare una classe <code>Cats</code>. Invece di creare la classe da zero – definendo proprietà come <code>name</code>, <code>age</code> e <code>specie</code> ex novo – possiamo far ereditare delle proprietà dalla classe genitore <code>Animals</code>.</p><p>La classe <code>Cats</code> può anche avere proprietà extra come <code>wiskerColor</code>, in questo caso.</p><p>Vediamo come ottenere una sottoclasse tramite <code>class</code>.</p><p>Abbiamo bisogno di un genitore da cui la sottoclasse erediterà delle caratteristiche. Esaminiamo il seguente codice:</p><pre><code class="language-js">class Animals {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    sing() {
        return `${this.name} can sing`;
    }
    dance() {
        return `${this.name} can dance`;
    }
} 
class Cats extends Animals {
    constructor(name, age, whiskerColor) {
        super(name, age);
        this.whiskerColor = whiskerColor;
    }
    whiskers() {
        return `I have ${this.whiskerColor} whiskers`;
    }
}
let clara = new Cats("Clara", 33, "indigo");
</code></pre><p>Con il codice qui sopra, otteniamo il seguente output:</p><pre><code class="language-js">console.log(clara.sing());
console.log(clara.whiskers());
// Output atteso
// "Clara can sing"
// "I have indigo whiskers"
</code></pre><p>Osservando il contenuto di <code>clara</code> nella console, vedremo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/6-1.png" class="kg-image" alt="6-1" width="600" height="400" loading="lazy"><figcaption>console.log(clara)</figcaption></figure><p>Puoi notare che <code>clara</code> ha una proprietà <code>__proto__</code> che fa riferimento al costruttore <code>Cats</code> e ha accesso al metodo <code>whiskers()</code>. La proprietà <code>__proto__</code> ha a sua volta una proprietà <code>__proto__</code> che fa riferimento al costruttore <code>Animals</code> avendo così accesso a <code>sing()</code> e <code>dance()</code>. <code>name</code> e <code>age</code> sono proprietà che esistono in ogni oggetto creato così.</p><p>Usando l'approccio del metodo <code>Object.create</code>, quanto sopra diventa:</p><pre><code class="language-js">function Animals(name, age) {
    let newAnimal = Object.create(animalConstructor);
    newAnimal.name = name;
    newAnimal.age = age;
    return newAnimal;
}
let animalConstructor = {
    sing: function() {
        return `${this.name} can sing`;
    },
    dance: function() {
        return `${this.name} can dance`;
    }
}
function Cats(name, age, whiskerColor) {
    let newCat = Animals(name, age);
    Object.setPrototypeOf(newCat, catConstructor);
    newCat.whiskerColor = whiskerColor;
    return newCat;
}
let catConstructor = {
    whiskers() {
        return `I have ${this.whiskerColor} whiskers`;
    }
}
Object.setPrototypeOf(catConstructor, animalConstructor);
const clara = Cats("Clara", 33, "purple");
clara.sing();
clara.whiskers();
// Output atteso
// "Clara can sing"
// "I have purple whiskers"
</code></pre><p><code>Object.setPrototypeOf</code> è un metodo che accetta due argomenti – l'oggetto (primo argomento) e il prototype desiderato (secondo argomento).</p><p>Nel codice qui sopra, la funzione <code>Animals</code> restituisce un oggetto con <code>animalConstructor</code> come prototype. La funzione <code>Cats</code> restituisce un oggetto con <code>catConstructor</code> come prototype. <code>catConstructor</code>, d'altro canto, ha il prototype di <code>animalConstructor</code>.</p><p>Dunque, animali comuni hanno accesso solo a <code>animalConstructor</code> ma i gatti (cat) hanno accesso a <code>catConstructor</code> e <code>animalConstructor</code>.</p><h2 id="in-conclusione"><strong>In conclusione</strong></h2><p>JavaScript sfrutta la sua natura basata sul prototype per accogliere gli sviluppatori OOP nel suo ecosistema. Fornisce anche dei modi semplici per creare prototype e organizzare dati correlati.</p><p>I veri linguaggi OOP non eseguono prototyping in background – ricordalo.</p><p>Un sentito ringraziamento a <a href="https://frontendmasters.com/teachers/will-sentance/">Will Sentance</a>. Tutto ciò che vedi in questo articolo (eccetto qualche cosuccia extra) l'ho imparato grazie al suo corso "<a href="https://frontendmasters.com/courses/object-oriented-js/">JavaScript: The Hard Parts of Object Oriented JavaScript</a>". Dovresti dargli un'occhiata.</p><p>Contattami su <a href="https://twitter.com/iamdillion">Twitter</a> per domande o contributi.</p><p>Grazie per aver letto : )</p><h3 id="risorse-utili-in-inglese-"><strong>Risorse utili (in inglese)</strong></h3><ul><li><a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS">Object-oriented JavaScript for beginners</a></li><li><a href="https://www.geeksforgeeks.org/introduction-object-oriented-programming-javascript/">Introduction to Object Oriented Programming in JavaScript</a></li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
