<?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[ Andrea Sisti - 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[ Andrea Sisti - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 19:16:15 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/author/andrea-sisti/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Git checkout – Come estrarre un file ed inserirlo in un altro branch ]]>
                </title>
                <description>
                    <![CDATA[ Mentre lavori su un repository in Git, potresti avere necessità di estrarre uno specifico file da un branch e spostarlo in un altro branch (in gergo, eseguire il checkout di un file in un altro branch). Fortunatamente, Git offre molti possibili modi per fare questa attività rapidamente. Una delle soluzioni ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/estrarre-un-file-da-un-altro-branch/</link>
                <guid isPermaLink="false">671fd7199ae93404d06944bd</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Thu, 06 Feb 2025 16:42:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2025/02/cover.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/git-checkout-file-from-another-branch/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Checkout – How to Checkout a File from Another Branch</a>
      </p><p>Mentre lavori su un repository in Git, potresti avere necessità di estrarre uno specifico file da un branch e spostarlo in un altro branch (in gergo, eseguire il <em>checkout</em> di un file in un altro branch).</p><p>Fortunatamente, Git offre molti possibili modi per fare questa attività rapidamente. Una delle soluzioni più semplici è usare il comando <code>git checkout</code> con un file specifico come argomento.</p><p>In questo articolo, analizzeremo differenti soluzioni a questo problema e approfondiremo le procedura che dovrai seguire per ciascuna.</p><p>Partiamo! 😎.</p><h2 id="casi-d-uso-di-git-checkout"><strong>Casi d'uso di git checkout</strong></h2><p>Stai lavorando su un branch, chiamato <code>feature/A</code>, contenente un file denominato <code>utils.js</code>.</p><p>Hai anche un altro branch, chiamato <code>feature/B</code> con un file aggiornato <code>utils.js</code>.</p><p>Vuoi effettuare il checkout di questo file e portarlo dal branch chiamato <code>feature/B</code> al branch chiamato <code>feature/A</code>.</p><p>Ci sono tre possibili soluzioni per questo compito.</p><h3 id="soluzione-1-usare-il-comando-git-checkout"><strong>Soluzione <strong>1: </strong>Usare il comando<strong> <code>git checkout</code></strong></strong></h3><p>Il comando <code>git checkout</code> offre un modo semplice per prendere un file o una cartella da un altro branch.</p><p>Qui viene riportato il codice per eseguire il checkout di un file da un altro branch:</p><pre><code class="language-bash">git checkout &lt;nome-altro-branch&gt; -- percorso/del/file/
</code></pre><p>Ecco la procedura da seguire:</p><ol><li>Esegui il checkout del branch dove vuoi copiare il file.</li></ol><pre><code class="language-bash">git checkout feature/A
</code></pre><p>2.	Una volta che sei nel branch corretto, copia il file.</p><pre><code class="language-bash">git checkout feature/B -- utils.js
</code></pre><p>3.	Usa il comando git status per assicurarti che il file sia stato copiato.</p><p>4. 	Esegui il commit e il push a un branch remoto.</p><p>Quando usi il comando checkout, puoi anche ottenere:</p><ul><li>Una cartella da un altro branch.</li><li>File multipli specificando ciascuno di questi.</li></ul><p>Inoltre, considera che puoi anche estrarre un file/cartella dallo stash.</p><h3 id="soluzione-2-usa-il-comando-git-restore"><strong><strong>Sol</strong>uzione <strong>2: </strong>Usa il comando <strong><code>git restore</code> </strong></strong></h3><p>Un'altra opzione è utilizzare il comando <code>git switch</code> insieme al comando <code>git restore</code>.</p><p>Se non hai mai sentito di questi due comandi, è tutto a posto. Sono relativamente nuovi. Git li ha introdotti nella versione 2.23 del 2019.</p><p>La funzione di questi due comandi è separare le responsabilità del comando <code>git checkout</code> per semplificarne l'utilizzo per gli utenti.</p><p>Il comando <code>git restore</code> ripristina l'albero di lavoro.</p><p>Il comando <code>git switch</code> passa da un branch all'altro.</p><p>Questa è la procedura da seguire per prendere un file da un altro branch:</p><p>1.	Passa al branch dove vuoi inserire il file.</p><pre><code class="language-bash">git switch feature/A
</code></pre><p>2.	Prendi il file dall'altro branch.</p><pre><code class="language-bash">git restore --source feature/B -- utils.js
</code></pre><p>3.	Esegui il commit e il push dei cambiamenti.</p><h3 id="soluzione-3-usa-il-comando-git-show"><strong>Soluzione<strong> 3: </strong>Usa il comando<strong> <code>git show</code></strong></strong></h3><p>Per ultimo, possiamo usare il comando <code>git show</code> .</p><p>Qui è riportata la procedura da seguire:</p><p>1.	Passa al branch di lavoro.</p><pre><code class="language-bash">git switch feature/A
</code></pre><p>2.	Prendi il file dall'altro branch</p><pre><code class="language-bash">git show feature/B:path/utils.js &gt; path/utils.js
</code></pre><p>3.	Esegui il commit e il push dei cambiamenti.</p><p><strong>Nota: </strong>questa volta devi specificare il percorso relativo dalla root della tua directory.</p><h2 id="considerazioni-finali"><strong>Considerazioni finali</strong></h2><p>Come puoi vedere, prendere un file da un altro branch non è così complicato.</p><p>Quando devo farlo nella mia vita di tutti i giorni, di solito uso il comando <code>git checkout</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/06/6ii6ur.jpg" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Visita il <a href="https://timmousk.com/">mio blog</a> se sei interessato a scoprire di più su Git o sulle tecnologie usate nello sviluppo Web, come TypeScript.</p><p>Grazie per aver letto questo articolo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come cambiare il nome di un branch locale  in Git ]]>
                </title>
                <description>
                    <![CDATA[ Mentre realizzi un progetto, a volte potresti avere necessità di rinominare un branch locale. Ma come puoi farlo in Git? In questo articolo, ti fornirò due metodi per rinominare i branch locali in Git. Come rinominare un branch in Git – Metodo n° 1 Step 1: assicurati di essere nella ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-cambiare-il-nome-di-un-branch-locale-in-git/</link>
                <guid isPermaLink="false">671fcb1b9ae93404d0694333</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Sat, 18 Jan 2025 18:32:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2025/01/mila-tovar-NTiW908Uc1A-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/git-rename-branch-how-to-change-a-local-branch-name/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Rename Branch – How to Change a Local Branch Name</a>
      </p><p>Mentre realizzi un progetto, a volte potresti avere necessità di rinominare un branch locale. Ma come puoi farlo in Git?</p><p>In questo articolo, ti fornirò due metodi per rinominare i branch locali in Git.</p><h2 id="come-rinominare-un-branch-in-git-metodo-n-1"><strong>Come rinominare un branch in Git <strong>– </strong>Metodo n° <strong>1</strong></strong></h2><h3 id="step-1-assicurati-di-essere-nella-cartella-root-del-tuo-progetto"><strong><strong>Step 1: </strong>assicurati di essere nella cartella root del tuo progetto</strong></h3><p>Per prima cosa dovrai aprire il tuo terminale e quindi cambiare directory &nbsp;(<code>cd</code>) nella cartella root del tuo progetto.</p><p>Per esempio, questo è come appare il comando se ti trovi nella tua home directory e vuoi spostarti nel progetto collocato nel Desktop.</p><pre><code>cd Desktop/nome-progetto
</code></pre><p>Questo è un esempio di come spostarsi nella cartella di un progetto denominato <code>Happy_Messages_Bot</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-10.30.01-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h3 id="step-2-vai-sul-branch-che-vuoi-rinominare"><strong><strong>Step 2:</strong> vai sul Branch che vuoi rinominare</strong></h3><p>Puoi usare il comando <code>git checkout</code> per passare a un altro branch.</p><pre><code>git checkout nome-branch
</code></pre><p>In questo esempio, voglio passare al branch denominato <code>test-branch</code> che ho creato.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-10.39.57-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h3 id="step-3-usa-il-flag-m-per-cambiare-il-nome-al-branch"><strong><strong>Step 3: </strong>usa il flag<strong> <code>-m</code> </strong>per cambiare il nome al branch</strong></h3><p>Questo è la sintassi del comando per cambiare nome al branch:</p><pre><code>git branch -m nuovo-nome-branch
</code></pre><p>In questo esempio, voglio cambiare il nome del mio branch da <code>test-branch</code> a <code>test-branch2</code>.</p><pre><code>git branch -m test-branch2
</code></pre><p>Puoi usare <code>git status</code> per vedere il nuovo nome del branch.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-10.52.02-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-rinominare-un-branch-in-git-metodo-n-2"><strong>Come rinominare un branch in Git <strong>– </strong>Metodo n° 2</strong></h2><p>Possiamo rinominare il branch locale con un solo comando senza dover usare <code>git checkout</code>.</p><h3 id="step-1-assicurati-di-trovarti-sul-branch-master-main"><strong><strong>Step 1: </strong>assicurati di trovarti sul branch <strong>master/main</strong></strong></h3><p>Per controllare se ti trovi sul branch master/main, lancia <code>git status</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-11.02.20-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se non ti trovi sul branch master/main , allora devi lanciare <code>git checkout master</code> oppure <code>git checkout main</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-11.05.28-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h3 id="step-2-usa-il-flag-m-per-cambiare-il-nome-al-branch"><strong><strong>Step 2: </strong>usa il flag<strong> <code>-m</code> </strong>per cambiare il nome al Branch</strong></h3><p>Puoi usare questa sintassi per rinominare il branch esistente:.</p><pre><code>git branch -m vecchio-nome nuovo-nome
</code></pre><p>Ecco come cambiare il nome di <code>test-branch</code> in <code>test-branch2</code>.</p><pre><code>git branch -m test-branch test-branch2
</code></pre><p>Per vedere il nuovo nome del branch, puoi lanciare <code>git branch</code>, che mostrerà la lista di tutti i tuoi branch.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/Screen-Shot-2021-11-02-at-11.15.52-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Questi appena esposti sono due metodi per rinominare dei branch locali in Git.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git switch – Come passare da un branch a un altro in Git ]]>
                </title>
                <description>
                    <![CDATA[ Cambiare branch è un'operazione di cui avrai bisogno spesso in Git. Per farlo, puoi usare il comando git checkout. Come creare un nuovo branch in Git Per creare un nuovo branch in Git, puoi usare il comando git checkout e passare il flag -b seguito da un nome. Questo creerà ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/git-switch-branch-come-cambiare-branch/</link>
                <guid isPermaLink="false">671fc1029ae93404d0694211</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Fri, 13 Dec 2024 09:59:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/12/60770740776bd507fe31f89c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/git-switch-branch/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Switch Branch – How to Change the Branch in Git</a>
      </p><p>Cambiare branch è un'operazione di cui avrai bisogno spesso in Git.</p><p>Per farlo, puoi usare il comando <code>git checkout</code>.</p><h2 id="come-creare-un-nuovo-branch-in-git"><strong>Come creare un nuovo branch in Git</strong></h2><p>Per creare un nuovo branch in Git, puoi usare il comando <code>git checkout</code> e passare il flag <code>-b</code> seguito da un nome.</p><p>Questo creerà un nuovo branch partendo da quello corrente. La cronologia del nuovo branch inizierà con la posizione corrente del branch da cui hai lanciato il comando.</p><p>Assumendo di trovarsi sul branch chiamato <code>master</code>:</p><pre><code>(master)$ git checkout -b my-feature
Switched to a new branch 'my-feature'
(my-feature)$
</code></pre><p>Qui puoi vedere un nuovo branch appena creato chiamato <code>my-feature</code>, che è stato generato come ramificazione a partire da <code>master</code>. </p><h2 id="come-passare-a-un-branch-esistente-in-git"><strong>Come passare a un branch esistente in Git</strong></h2><p>Per passare a un branch esistente, puoi usare il comando <code>git checkout</code> (senza il flag &nbsp;<code>-b</code>) e passare il nome del branch che vuoi raggiungere:</p><pre><code>(my-feature)$ git checkout master
Switched to branch 'master'
(master)$
</code></pre><p>Esiste anche una pratica scorciatoia per ritornare al branch su cui ti trovavi precedentemente, passando <code>-</code> al comando <code>git checkout</code> invece del nome del branch:</p><pre><code>(my-feature)$ git checkout -
Switched to branch 'master'
(master)$ git checkout -
Switched to branch 'my-feature'
(my-feature)$
</code></pre><h2 id="come-eseguire-il-checkout-di-uno-specifico-commit"><strong>Come eseguire il checkout di uno specifico commit</strong></h2><p>Per eseguire il checkout o passare ad un commit specifico, puoi anche usare &nbsp;<code>git checkout</code> e passare come parametro lo <a href="https://it.wikipedia.org/wiki/Secure_Hash_Algorithm">SHA</a> del commit invece del nome del branch.</p><p>Dopotutto, i branch sono effettivamente solo puntatori e rilevatori di specifici commit nella cronologia di Git.</p><h3 id="come-trovare-lo-sha-di-un-commit"><strong>Come trovare lo SHA di un commit</strong></h3><p>Un modo per trovare lo SHA di un commit è guardare nel log di Git.</p><p>Puoi visualizzare il log utilizzando il comando <code>git log</code>:</p><pre><code>(my-feature)$ git log
commit 94ab1fe28727b7f8b683a0084e00a9ec808d6d39 (HEAD -&gt; my-feature, master)
Author: John Mosesman &lt;johnmosesman@gmail.com&gt;
Date:   Mon Apr 12 10:31:11 2021 -0500

    This is the second commmit message.

commit 035a128d2e66eb9fe3032036b3415e60c728f692 (blah)
Author: John Mosesman &lt;johnmosesman@gmail.com&gt;
Date:   Mon Apr 12 10:31:05 2021 -0500

    This is the first commmit message.
</code></pre><p>Sulla prima riga di ciascun commit, dopo la parola <code>commit</code> si trova una lunga stringa di caratteri e di numeri: <code>94ab1fe28727...</code></p><p>Si tratta dello SHA, un identificatore unico che viene generato per ogni commit.</p><p>Per eseguire il checkout di un commit specifico, devi solo passare lo SHA del commit come parametro al comando <code>git checkout</code>:</p><pre><code>(my-feature)$ git checkout 035a128d2e66eb9fe3032036b3415e60c728f692
Note: switching to '035a128d2e66eb9fe3032036b3415e60c728f692'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c &lt;new-branch-name&gt;

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 035a128 a
((HEAD detached at 035a128))$
</code></pre><blockquote><em><em><strong><strong>Not</strong></strong></em><strong>a</strong><em>: </em>generalmente avrai bisogno di usare solo i primi caratteri dello SHA, poichè i primi quattro o cinque caratteri della stringa sono molto probabilmente unici in tutto il progetto.</em></blockquote><h2 id="cosa-vuol-dire-detached-head-state"><strong>Cosa vuol dire detached HEAD state?</strong></h2><p>Effettuare il checkout di uno specifico commit ti pone in un cosiddetto "<strong>detached HEAD state</strong>" (stato HEAD separato).</p><p><a href="http://git-scm.com/docs/git-checkout#_detached_head">Dalla documentazione:</a></p><blockquote><em><em>[</em>detached HEAD state<em>] </em>significa semplicemente che <em><code>HEAD</code> </em>si riferisce a uno specifico commit, invece che riferirsi a un branch con un nome.</em></blockquote><p>Fondamentalmente, l'<code>HEAD</code> (uno dei puntatoti interni di Git che rileva dove ci si trova nella cronologia di Git) risulta separato dai branch conosciuti, così le modifiche, da questo punto, formeranno un nuovo percorso nella cronologia di Git.</p><p>Git vuole assicurarsi che questo stato HEAD separato sia quello che realmente vuoi ottenere, pertanto ti fornisce uno "spazio libero" per ogni sorta di modifica sperimentale - come descritto nell'output:</p><pre><code>You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
</code></pre><p>Traduzione: "<em>Sei in uno 'stato HEAD separato'. Puoi dare un'occhiata in giro, fare cambiamenti sperimentali e salvarli in commit, e puoi cancellare qualsiasi commit che hai fatto in questo stato, senza alcun impatto sui branch, tornando indietro su un branch esistente</em>"</p><p>Da questo posizione hai due opzioni:</p><ul><li>Sperimentare e poi buttare via le tue modifiche tornato al branch precedente</li><li>Lavorare da qui ed iniziare un nuovo branch da questo punto</li></ul><p>Puoi usare il comando &nbsp;<code>git switch -</code> per annullare qualsiasi modifica che hai apportato e tornare al tuo branch precedente.</p><p>Se invece vuoi mantenere i tuoi cambiamenti e continuare da qui, puoi usare il comando <code>git switch -c &lt;nome-nuovo-branch&gt;</code> per <em>creare un nuovo branch</em> da questo punto.</p><h2 id="conclusioni"><strong>Conclusioni</strong></h2><p>Il comando <code>git checkout</code> è utile e ha molteplici usi.</p><p>Puoi usarlo per creare nuovi branch, spostarti su un branch, eseguire il checkout di uno specifico commit, e molto altro.</p><p>Se ti è piaciuto questo tutorial, parlo di argomenti come questi <a href="https://twitter.com/johnmosesman">su Twitter</a> e ne scrivo <a href="https://johnmosesman.com/">sul mio sito.</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Immagini di background in CSS - con esempi di codice HTML ]]>
                </title>
                <description>
                    <![CDATA[ Quello che un utente vede in un sito web ha un impatto sulla qualità della sua esperienza. Questo influenza anche la facilità con cui gli utenti possono interagire con l'intero sito in generale. Aggiungere immagini allo sfondo di certe parti di un sito è spesso più attraente e interessante dal ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/immagini-di-background-in-css-con-esempi-di-codice-html/</link>
                <guid isPermaLink="false">671a223ea104b204722483d6</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Thu, 12 Dec 2024 14:27:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/12/kobu-agency-ipARHaxETRk-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/css-background-image-with-html-example-code/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">CSS Background Image – With HTML Example Code</a>
      </p><p>Quello che un utente vede in un sito web ha un impatto sulla qualità della sua esperienza. Questo influenza anche la facilità con cui gli utenti possono interagire con l'intero sito in generale.</p><p>Aggiungere immagini allo sfondo di certe parti di un sito è spesso più attraente e interessante dal punto di vista visivo che cambiare meramente il colore di sfondo.</p><p>I browser moderni supportano una varietà di file di immagine come <code>.jpg</code>, <code>.png</code>, <code>.gif</code> e<code>.svg</code>.</p><p>Questo articolo spiega come aggiungere immagini al tuo codice HTML e come raffinarle per migliorarne l'aspetto.</p><h2 id="sintassi-delle-immagini-di-background"><strong>Sintassi delle immagini di background</strong></h2><p>Il primo passo è assicurarsi di creare una cartella per contenere le immagini che vuoi usare nel tuo progetto.</p><p>Per esempio possiamo creare una cartella <code>images</code> nel progetto su cui stiamo lavorando ed aggiungere un'immagine chiamata <code>sunset.png</code> che vogliamo usare.</p><p>La proprietà CSS <code>background-image</code> ti permette di posizionare l'immagine dietro all'elemento HTML che desideri.</p><p>Potrebbe essere l'intera pagina (utilizzando il selettore CSS <code>body</code> che seleziona l'elemento <code>&lt;body&gt;</code> del nostro HTML), oppure solo una specifica parte della pagina come un elemento <code>section</code>, come nell'esempio sotto.</p><p>Per aggiungere un'immagine di sfondo a un elemento section nel tuo file <code>.css</code>, scrivi il seguente codice:</p><pre><code class="language-css">section {
  background-image: url("images/sunset.png");
}
</code></pre><p>Vediamo cosa succede nel dettaglio:</p><ul><li><code>section</code> specifica l'elemento a cui vuoi applicare l'immagine.</li><li><code>url()</code> è utilizzato per dire al CSS dove si trova l'immagine che vuoi utilizzare.</li><li>All'interno delle parentesi, <code>"images/sunset.png"</code> è il percorso all'immagine. Questo fa sapere al browser quale URL considerare.</li><li>Il percorso in questo esempio è definito un percorso relativo: l'immagine a cui si riferisce è un file locale, relativo al nostro progetto ed alla nostra cartella di lavoro corrente, non è un indirizzo web. Per aggiungere un'immagine possiamo usare anche un percorso assoluto, che è un indirizzo web completo e inizia con un dominio URL (<code>http://www.</code>).</li><li>Usare le virgolette è una buona abitudine, ma possiamo ometterle, per cui <code>background-image: url(images/sunset.png)</code> funziona ugualmente.</li><li>Non dimenticare il punto e virgola!</li></ul><h2 id="come-evitare-la-ripetizione-del-background"><strong>Come evitare la ripetizione del background</strong></h2><p>Quando applichi un'immagine di sfondo a un elemento, questa viene ripetuta di default.</p><p>Se l'immagine è più piccola dell'elemento di cui è lo sfondo, essa si ripeterà in modo da riempirlo.</p><p>Come possiamo evitare che ciò accada?</p><p>La proprietà <code>background-repeat</code> necessita di 4 valori e consente di cambiare la direzione in cui l'immagine si ripete oppure bloccare la ripetizione dell'immagine completamente.</p><pre><code class="language-css">section {
  background-repeat: repeat;
}
</code></pre><p>Questo è il valore di default se non forniamo alla proprietà <code>background-repeat</code> un valore. In questo caso, l'immagine viene ripetuta <strong>sia orizzontalmente che verticalmente</strong>, ovvero <strong>sia nella direzione x che nella direzione y</strong>, fino a riempire completamente lo spazio.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-20-at-9.10.06-PM.png" class="kg-image" alt="Screenshot-2021-07-20-at-9.10.06-PM" width="600" height="400" loading="lazy"></figure><pre><code class="language-css">section {
  background-repeat: no-repeat;
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-20-at-9.11.39-PM.png" class="kg-image" alt="Screenshot-2021-07-20-at-9.11.39-PM" width="600" height="400" loading="lazy"></figure><p>Il valore <code>no-repeat</code> blocca la ripetizione dell'immagine in tutte le direzioni, facendo sì che venga mostrata solo una volta.</p><pre><code class="language-css">section {
  background-repeat: repeat-x;
}
</code></pre><p>Questo valore ripete l'immagine <em>solo </em>orizzontalmente nella pagina. L'immagine viene ripetuta nella pagina nella direzione x. La direzione x in matematica è la direzione da sinistra a destra.</p><pre><code class="language-css">section {
  background-repeat: repeat-y;
}
</code></pre><p>Questo valore ripete l'immagine <em>solo </em>verticalmente nella pagina. L'immagine viene ripetuta nella pagina nella direzione y. La direzione y in matematica è la direzione dall'alto al basso.</p><h2 id="come-impostare-la-posizione-del-background"><strong>Come impostare la posizione del background</strong></h2><p>Dopo aver aggiunto l'immagine di background e averne impedito la ripetizione, possiamo controllare ulteriormente come viene visualizzata nello sfondo dell'elemento migliorandone la posizione.</p><p>A questo scopo, utilizzeremo la proprietà <code>background-position</code>.</p><p>La proprietà necessita di due valori. Il si riferisce alla posizione orizzontale, o direzione x (distanza nel senso della larghezza del tag). Il secondo si riferisce alla posizione verticale, o direzione y (distanza nel senso dell'altezza del tag).</p><p>I valori possono essere unità come il pixel:</p><pre><code class="language-css">section {
  background-position: 20px 30px;
}
</code></pre><p>Questo sposterà l'immagine di 20px nel senso della larghezza e di 30px nel senso dell'altezza dell'elemento contenitore. </p><p>Invece dei pixel, possiamo usare un insieme di parole chiave come <strong><strong>right, left, top, down, </strong></strong>o<strong><strong> center</strong> </strong>per posizionare l'immagine alla destra, sinistra, in alto, in basso o al centro dell'elemento.</p><pre><code class="language-css">section {
  background-position: right center;
}
</code></pre><p>Questo posiziona l'immagine sul lato destro del centro del tag.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-21-at-9.02.55-AM.png" class="kg-image" alt="Screenshot-2021-07-21-at-9.02.55-AM" width="600" height="400" loading="lazy"></figure><p>Se vogliamo centrare l'immagine sia orizzontalmente che verticalmente, possiamo fare come nell'esempio seguente:</p><pre><code class="language-css">section {
  background-position: center center;
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-21-at-9.07.41-AM.png" class="kg-image" alt="Screenshot-2021-07-21-at-9.07.41-AM" width="600" height="400" loading="lazy"></figure><p>Per posizionare un'immagine con maggiore dettaglio, vale la pena menzionare l'uso delle percentuali:</p><pre><code class="language-css">section {
  background-position: 20% 40%;
}
</code></pre><p>Questo posiziona l'immagine al 20% nel senso della larghezza dell'elemento e al 40% nel senso dell'altezza dell'elemento.</p><p>Finora abbiamo visto valori usati in combinazione, ma possiamo anche specificare un singolo valore come <code>background-position: 20px;</code> o <code>background-position: center;</code> or <code>background-position: 20%;</code>, che viene applicato a entrambe le direzioni.</p><h2 id="come-ridimensionare-l-immagine-di-background"><strong>Come ridimensionare l'immagine di background</strong></h2><p>Pe controllare le dimensione dell'immagine di background possiamo usare la proprietà <code>background-size</code>.</p><p>Nuovamente, come nelle proprietà menzionate precedentemente, sono necessari due valori. Il primo per la dimensione orizzontale (x) ed il secondo per la dimensione verticale (y).</p><p>Possiamo usare i pixel, in questo modo:</p><pre><code class="language-css">section {
  background-size: 20px 40px;
  /* ridimensiona l'immagine a 20px di larghezza e 40px di altezza */
}
</code></pre><p>Se non conosciamo la larghezza esatta del contenitore in cui stiamo posizionando l'immagine, ci sono una serie di specifici valori che possiamo fornire alla proprietà.</p><ul><li><code>background-size: cover;</code> ridimensiona l'immagine di background in modo da coprire l'intero spazio dello sfondo dell'elemento indipendentemente dall'ampiezza dello stesso. Se l'immagine è troppo grande e ha una rapporto dimensionale più grande dell'elemento in cui è contenuta, essa verrà stirata e poi tagliata ai bordi.</li><li><code>background-size: contain;</code> <em>contiene </em>l'immagine, come il nome suggerisce. Fa sì che l'intera immagine sia mostrata in background senza tagliare nessuna parte. Se l'immagine è molto più piccola dell'elemento, lo spazio rimasto vuoto verrà riempito con la ripetizione dell'immagine, così possiamo usare la regola <code>background-repeat: no-repeat;</code>, menzionata in precendenza.</li></ul><p>Nell'immagine di seguito, la regola <code>background-size:cover;</code> in questo caso taglia parti dell'immagine.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-21-at-9.18.15-AM.png" class="kg-image" alt="Screenshot-2021-07-21-at-9.18.15-AM" width="600" height="400" loading="lazy"></figure><p>Quando cambiamo la regola in &nbsp;<code>background-size:contain;</code> possiamo vedere che l'immagine si rimpicciolisce per adeguarsi alla dimensione del contenitore (in questo caso, section).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/07/Screenshot-2021-07-21-at-9.18.49-AM.png" class="kg-image" alt="Screenshot-2021-07-21-at-9.18.49-AM" width="600" height="400" loading="lazy"></figure><h2 id="come-usare-la-propriet-background-attachment"><strong>Come usare la proprietà background-attachment</strong></h2><p>Con la proprietà <code>background-attachment</code> possiamo controllare dove viene ancorata l'immagine di background , ovvero se l'immagine è fissa oppure no rispetto alla finestra del browser.</p><p>Il valore di default è <code>background-attachment: scroll;</code>, dove l'immagine di background resta solidale al suo elemento e segue il naturale flusso delle pagine dato dallo scorrimento verso l'alto e verso il basso.</p><p>Il secondo valore della proprietà che possiamo avere è <code>background-attachment: fixed;</code>. Questo rende l'immagine di background fissa nella stessa posizione, rispetto alla pagina e rispetto al viewport (area visibile) del browser. Questo crea un effetto di parallasse di cui puoi vedere un esempio qui:</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_ZEKyRpp" src="https://codepen.io/deniselemonaki/embed/preview/ZEKyRpp?default-tabs=css%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=ZEKyRpp" title="Contenuto incorporato" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><h2 id="i-gradienti-di-background"><strong>I gradienti di background</strong></h2><p>Un caso differente rispetto alla proprietà <code>background-image</code> è richiedere al browser di creare un gradiente.</p><p>La <code>background-image</code> in questo caso non ha un URL, ma invece ha un gradiente lineare.</p><p>Il modo più semplice per creare un gradiente è specificare un angolo. Questo controlla la direzione del gradiente e il passaggio da un colore all'altro. Infine somma i due colori che vuoi unire insieme in un gradiente per lo sfondo del tag.</p><p>Un gradiente che va dall'alto al basso e dal nero al bianco è:</p><pre><code class="language-css">section {
  background-image: linear-gradient(black,white);
}
</code></pre><p>Gli angoli più comuni usati per i gradienti sono:</p><ul><li><code>0deg</code> dall'alto al basso</li><li><code>90deg</code> da sinistra a destra</li><li><code>180deg</code> dal basso all'alto</li><li><code>270deg</code> da destra a sinistra</li></ul><p>Gli angoli soprariportati corrispondono a <code>to top</code>, <code>to right</code>, <code>to bottom</code> e <code>to left</code>, rispettivamente.</p><pre><code class="language-css">section {
  background-image: linear-gradient(to left,pink,orange);
}
</code></pre><figure class="kg-card kg-embed-card"><iframe id="cp_embed_poPrPjo" src="https://codepen.io/deniselemonaki/embed/preview/poPrPjo?default-tabs=css%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=poPrPjo" title="Contenuto incorporato" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><p>Invece del nome dei colori, possiamo utilizzare i colori in notazione esadecimale per essere più dettagliati ed avere una maggiore varietà di opzioni:</p><pre><code class="language-css">section{
  background-image: linear-gradient(to left,#42275a, #734b6d)
      }
</code></pre><figure class="kg-card kg-embed-card"><iframe id="cp_embed_LYyjWwL" src="https://codepen.io/deniselemonaki/embed/preview/LYyjWwL?default-tabs=css%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=LYyjWwL" title="Contenuto incorporato" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><p>Possiamo anche includere più di due colori in un gradiente, creando differenti effetti e schemi di colore.</p><h2 id="conclusioni"><strong>Conclusioni</strong></h2><p>Questo segna la fine della nostra introduzione alla sintassi di base della proprietà <code>background-image</code>.</p><p>Da qui le possibilità sono infinite e lasciano spazio a un sacco di creatività. Questi effetti aiutano l'utente ad avere una piacevole esperienza mentre visitano il tuo sito.</p><p>Spero che questo ti sia stato utile, grazie per aver letto il mio articolo.</p><p>Divertiti con i tuoi progetti e buona programmazione!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript Split - Come dividere una stringa in un array in JS ]]>
                </title>
                <description>
                    <![CDATA[ Generalmente, un stringa rappresenta una sequenza di caratteri in un linguaggio di programmazione. Diamo un'occhiata ad un esempio di stringa creata usando la sequenza di caratteri, "Yes, You Can DO It!". In JavaScript, possiamo creare una stringa in un paio di modi:  * Usando una stringa letterale come dato ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/javascript-split/</link>
                <guid isPermaLink="false">671a0e16a104b204722481e5</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Mon, 04 Nov 2024 09:42:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/11/freeCodeCamp-Cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-split-how-to-split-a-string-into-an-array-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Split – How to Split a String into an Array in JS</a>
      </p><p>Generalmente, un stringa rappresenta una sequenza di caratteri in un linguaggio di programmazione.</p><p>Diamo un'occhiata ad un esempio di stringa creata usando la sequenza di caratteri, "Yes, You Can DO It!". In JavaScript, possiamo creare una stringa in un paio di modi:</p><ul><li>Usando una stringa letterale come dato primitivo:</li></ul><pre><code class="language-js">const msg = "Yes, You Can DO It!";
</code></pre><ul><li>Usando il costruttore <code>String()</code> come un oggetto:</li></ul><pre><code class="language-js">const msg = new String("Yes, You Can DO It!");
</code></pre><p>Un fatto interessante sulle stringhe in JavaScript è che possiamo accedere ai caratteri in una stringa tramite il loro indice. L'indice del primo carattere è 0 e per i caratteri successivi si incrementa di 1 per ciascun carattere. Pertanto possiamo accedere a ciascuno dei caratteri della stringa come segue:</p><pre><code class="language-js">let str = "Yes, You Can Do It!";

console.log(str[0]); // Y
console.log(str[1]); // e
console.log(str[2]); // s
console.log(str[3]); // ,

console.log(str[10]); // a
</code></pre><p>L'immagine sotto rappresenta la stessa cosa:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/split.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"><figcaption><em><em>Accedere ai caratteri della stringa tramite indici</em></em></figcaption></figure><p>Oltre alla possibilità di accedere ai caratteri della stringa tramite i loro indici, JavaScript fornisce un sacco di metodi utili per accedere ai caratteri, eliminare parti di una stringa e manipolarle in vari modi.</p><p>In questo articolo, ti mostrerò un pratico metodo delle stringhe chiamato <code>split()</code>. &nbsp;Spero ti divertirai nel leggerlo.</p><h1 id="il-metodo-split-in-javascript"><strong>Il metodo split() in JavaScript</strong></h1><p>Il metodo <code>split()</code> divide una stringa in due o più sottostringhe in base ad un separatore. Il separatore può essere un singolo carattere, un'altra stringa oppure una espressione regolare.</p><p>Dopo la divisione della stringa in più sottostringhe, il metodo <code>split()</code> le inserisce in un array e restituisce quest'ultimo come risultato. Non viene apportata alcuna modifica alla stringa originale.</p><p>Comprendiamo meglio come funziona con un esempio. Qui è riportata una stringa creata usando una stringa letterale:</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
</code></pre><p>Possiamo chiamare il metodo <code>split()</code> sulla stringa &nbsp;<code>message</code>. Dividiamo la stringa sulla base del carattere spazio (<code>' '</code>). Qui il carattere spazio agisce come separatore.</p><pre><code class="language-js">// Dividiamo usando il carattere spazio
let arr = message.split(' ');

// L'array
console.log(arr); // ["I", "am", "a", "Happy", "Go", "lucky", "Guy"]


// Accedi a ciascun elemento nell'array
console.log(arr[0]); // "I"
console.log(arr[1]); // "am"
console.log(arr[2]); // "a"
console.log(arr[3]); // "Happy"
console.log(arr[4]); // "Go",
console.log(arr[5]); // "lucky"
console.log(arr[6]); // "Guy"
</code></pre><p>Lo scopo principale del metodo <code>split()</code> &nbsp;è estrapolare le parti della stringa che ti interessano per impiegarli successivamente per altre operazioni.</p><h2 id="come-separare-una-stringa-in-ciascuno-dei-suoi-caratteri"><strong>Come separare una stringa in ciascuno dei suoi caratteri</strong></h2><p>Puoi separare una stringa in ciascuno dei suoi caratteri usando una stringa vuota ('') come separatore. Nell'esempio seguente, dividiamo lo stesso messaggio usando una stringa vuota. Il risultato della separazione sarà un array contenente tutti i caratteri della stringa originaria.</p><pre><code class="language-js">console.log(message.split('')); // ["I", " ", "a", "m", " ", "a", " ", "H", "a", "p", "p", "y", " ", "G", "o", " ", "l", "u", "c", "k", "y", " ", "G", "u", "y"]
</code></pre><blockquote><em><em>💡 </em>Nota che la separazione di una stringa vuota ('') usando una stringa vuota come separatore restituisce un array vuoto. Questa potrebbe essere una domanda nei tuoi prossimi colloqui di lavoro!</em></blockquote><pre><code class="language-js">''.split(''); // returns []
</code></pre><h2 id="come-separare-una-stringa-in-un-singolo-array"><strong>Come separare una stringa in un singolo array</strong></h2><p>È possibile invocare il metodo <code>split()</code> su una stringa senza specificare un separatore. In questo caso nel metodo &nbsp;<code>split()</code> &nbsp;non è specificato nessun argomento.</p><p>Quando invochi il metodo &nbsp;<code>split()</code> su una stringa senza separatore, questo restituisce un array contenente l'intera stringa.</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split()); // restituisce ["I am a Happy Go lucky Guy"]
</code></pre><blockquote><em><em>💡 </em>Nota nuovamente che, chiamando il metodo <em><code>split()</code> </em> su una stringa vuota <em>('')</em> senza separatore, otterrai un array con una stringa vuota. Non viene restituito un array vuoto.</em></blockquote><p>Qui di seguito sono riportati due esempi in modo da evidenziare le differenze:</p><pre><code class="language-js">// Restituisce un array vuoto
''.split(''); // restituisce []

// Restituisce un array con una stringa vuota
''.split() // restituisce [""]
</code></pre><h2 id="come-separare-una-stringa-usando-come-separatore-un-carattere-non-presente-nella-stringa-stessa"><strong>Come separare una stringa usando come separatore un carattere non presente nella stringa stessa</strong></h2><p>Solitamente, si usa come separatore un carattere che è parte della stringa che stiamo provando a dividere. Ci sono casi in cui potresti aver passato come argomento un separatore che non fa parte della stringa o non coincide con alcuna parte della stessa. In questo caso, il metodo <code>split()</code> &nbsp;restituisce un array con l'intera stringa come elemento.</p><p>Nell'esempio riportato sotto, la stringa del messaggio non ha il carattere virgola (,). Proviamo a dividere la stringa usando il separatore virgola (,).</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split(',')); // ["I am a Happy Go lucky Guy"]
</code></pre><blockquote><em><em>💡 </em>Dovresti tenere a mente questo fatto in quanto risulta molto utile durante il debug del codice per banali errori come passare il separatore errato nel metodo<em> <code>split()</code></em>. </em></blockquote><h2 id="come-separare-una-stringa-con-un-limite"><strong>Come separare una stringa con un limite</strong></h2><p>Se pensi che il metodo <code>split()</code> &nbsp;assuma solo il separatore come parametro opzionale, lascia che ti dica che ce n'è anche un altro. Puoi passare come parametro opzionale anche un valore limite al metodo <code>split()</code> .</p><pre><code class="language-js">string.split(splitter, limit);
</code></pre><p>Come indica il nome, il parametro <code>limit</code> limita il numero di divisioni. Significa che l'array risultante avrà solo il numero di elementi specificato nel parametro limite.</p><p>Nell'esempio seguente, separiamo una stringa usando lo spazio (' ') come divisore. Possiamo anche passare il numero <code>4</code> come limite. Il metodo <code>split()</code> restituisce un array con solo quattro elementi, ignorando il resto.</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split(' ', 4)); // ["I", "am", "a", "Happy"]
</code></pre><h1 id="come-separare-usando-una-espressione-regolare"><strong>Come separare usando una espressione regolare</strong></h1><p>Possiamo passare anche una espressione regolare (regex) come separatore al metodo &nbsp;<code>split()</code>. Consideriamo la stringa da dividere:</p><pre><code class="language-js">let message = 'The sky is blue. Grass is green! Do you know the color of the Cloud?';
</code></pre><p>Separiamo la stringa ad ogni punto (.), punto esclamativo (!) e punto interrogativo (?). Possiamo scrivere un'espressione regolare che identifica quando questi caratteri si presentano. Quindi passiamo l'espressione regolare al metodo <code>split()</code> ed lo invochiamo sulla stringa soprariportata.</p><pre><code class="language-js">let sentences = message.split(/[.,!,?]/);
console.log(sentences);
</code></pre><p>Il risultato sarà il seguente:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/image-102.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"><figcaption><em><em>Separare una stringa usando un'espressione regolare</em></em></figcaption></figure><p>Puoi usare il parametro <code>limit</code> per limitare l'output ai soli tre elementi iniziali, come segue: </p><pre><code class="language-js">sentences = message.split(/[.,!,?]/, 3);
console.log(sentences);
</code></pre><p>Il risultato sarà il seguente:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/06/image-103.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"><figcaption><em><em>Separare una stringa usando un'espressione regolare e un valore limite</em></em></figcaption></figure><blockquote><em><em>💡 </em>Se vuoi catturare i caratteri usati nell'espressione regolare nell'array risultante, devi modificare leggermente l'espressione regolare. Usa le parentesi tonde per catturare i caratteri corrispondenti. L'espressione regolare aggiornata sarà <em> <code>/([.,!,?])/</code>.</em></em></blockquote><h1 id="come-sostituire-caratteri-in-una-stringa-usando-il-metodo-split-"><strong>Come sostituire caratteri in una stringa usando il metodo Split()</strong></h1><p>Si possono risolvere molti problemi interessanti usando il metodo <code>split()</code> combinato con altri metodi di stringhe e array. Vediamone uno qui. Potrebbe essere comune dover sostituire tutte le occorrenze di una stringa con un altro carattere.</p><p>Per esempio, potresti voler creare un <code>id</code> di un elemento HTML dal valore di un nome. Il valore attribuito al nome potrebbe contenere uno spazio (' '), ma in HTML, il valore <code>id</code> non deve contenere alcuno spazio. Possiamo ovviare a questo problema nel modo seguente:</p><pre><code class="language-js">let name = 'Tapas Adhikary';
let subs = name.split(' ');
console.log(subs); // ["Tapas", "Adhikary"]

let joined = subs.join('-');
console.log(joined); // Tapas-Adhikary
</code></pre><p>Consideriamo che il nome è costiutuito da un nome proprio (Tapas) ed un cognome (Adhikary) separati da uno spazio. Nell'esempio per prima cosa separiamo il nome con uno spazio come separatore. Questo restituisce un array contente il nome ed il cognome come elementi, ovvero <code>['Tapas', 'Adhikary']</code>.</p><p>Quindi usiamo il metodo degli array chiamato <code>join()</code> per unire gli elementi dell'array usando il carattere <code>-</code>. Il metodo <code>join()</code> restituisce una stringa unendo gli elementi con il carattere passato come parametro. Alla fine otteniamo il risultato finale con la stringa <code>Tapas-Adhikary</code>.</p><h1 id="es6-come-separare-un-array-con-la-destrutturazione"><strong><strong>ES6: </strong>come separare un array con la destrutturazione</strong></h1><p>La specifica ECMAScript2015 (ES6) ha introdotto modi più innovativi per estrarre un elemento da un array ed assegnarlo a una variabile. Questa elegante sintassi è conosciuta come destrutturazione degli array (array destructuring). Possiamo usarla con il metodo &nbsp;<code>split()</code> per assegnare l'output ad una variabile facilmente e con meno codice.</p><pre><code class="language-js">let name = 'Tapas Adhikary';
let [firstName, lastName] = name.split(' ');
console.log(firstName, lastName);
</code></pre><p>In questo esempio abbiamo separato il nome usando come separatore il carattere spazio. Quindi abbiamo assegnato il valore restituito dall'array a una coppia di variabili (<code>firstName</code> e <code>lastName</code>) usando la sintassi di destrutturazione degli array.</p><h1 id="prima-di-concludere-"><strong>Prima di concludere...</strong></h1><p>👋 Vorresti continuare a scrivere codice ed imparare con me? Puoi trovare lo stesso contenuto qui in questo video YouTube. Devi solo aprire il tuo editor di codice preferito e iniziare.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe width="560" height="315" src="https://www.youtube.com/embed/xbHFdstSpvc" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy" 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-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; aspect-ratio: 16 / 9; width: 720px; height: auto;" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Spero che tu abbia trovato utile questo articolo, e che leggerlo ti abbia aiutato a comprendere più chiaramente il metodo delle stringhe <code>split()</code> in JavaScript. Per acquisire una buona dimestichezza, usa gli esempi presentati per fare pratica più volte. Puoi trovare tutti gli <a href="https://github.com/atapas/js-handbook-examples/blob/master/string/split/index.js">esempi di codice nel mio repository GitHub</a>.</p><p>Seguimi su <a href="https://twitter.com/tapasadhikary">Twitter (@tapasadhikary)</a>.</p><p>Potrebbero piacerti anche questi articoli (in inglese):</p><ul><li><a href="https://www.freecodecamp.org/news/the-javascript-array-handbook/">The JavaScript Array Handbook – JS Array Methods Explained with Examples</a></li><li><a href="https://blog.greenroots.info/10-devtools-tricks-to-help-you-with-css-and-ux-design-ckpp7mtnu04u6whs143e7huwx">10 DevTools tricks to help you with CSS and UX design</a></li><li><a href="https://blog.greenroots.info/a-practical-guide-to-object-destructuring-in-javascript-cknx6tb2l06yvg1s1425rh54f">A practical guide to object destructuring in JavaScript</a></li><li><a href="https://blog.greenroots.info/10-trivial-yet-powerful-html-facts-you-must-know-ckmx0d7q30346c1s125iydcsa">10 trivial yet powerful HTML facts you must know</a></li><li><a href="https://blog.greenroots.info/10-vs-code-emmet-tips-to-make-you-more-productive-ckknjvxal028f1qs18w20e94t">10 VS Code emmet tips to make you more productive</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come convertire una Stringa in un Numero in JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Ci sono molti modi pe convertire una stringa in un numero usando JavaScript. Ma qual è in codice nella pratica? In questo articolo, ti mostrerò 11 modi per convertire una stringa in un numero. Qui c'è uno Scrim interattivo su come convertire una stringa in un numero in JavaScript Come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-convertire-una-stringa-in-un-numero-in-javascript/</link>
                <guid isPermaLink="false">67192945a104b2047224803f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Sat, 02 Nov 2024 10:54:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/10/volkan-olmez-aG-pvyMsbis-unsplash.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-convert-a-string-to-a-number-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Convert a String to a Number in JavaScript</a>
      </p><p>Ci sono molti modi pe convertire una stringa in un numero usando JavaScript. Ma qual è in codice nella pratica?</p><p>In questo articolo, ti mostrerò 11 modi per convertire una stringa in un numero.</p><h3 id="qui-c-uno-scrim-interattivo-su-come-convertire-una-stringa-in-un-numero-in-javascript"><strong>Qui c'è uno Scrim interattivo su come convertire una stringa in un numero in JavaScript</strong></h3><figure class="kg-card kg-embed-card"><iframe src="https://scrimba.com/scrim/co2894c679bc693326603ac73?embed=freecodecamp,mini-header" width="100%" height="420" title="Embedded content" loading="lazy" 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-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle;"></iframe></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-number-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione <strong><code>Number()</code> </strong></strong></h2><p>Un modo per convertire una stringa in un numero è utilizzare la funzione &nbsp;<code>Number()</code> .</p><p>In questo esempio, abbiamo una stringa denominata &nbsp;<code>quantity</code> con il valore <code>"12"</code>.</p><pre><code class="language-js">const quantity = "12";
</code></pre><p>Se usiamo l'operatore <code>typeof</code> su &nbsp;<code>quantity</code>, otteniamo come risultato il tipo stringa.</p><pre><code class="language-js">console.log(typeof quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-9.50.17-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Possiamo convertire <code>quantity</code> &nbsp;in un numero utilizzando la funzione &nbsp;<code>Number</code> &nbsp;in questo modo:</p><pre><code class="language-js">Number(quantity)
</code></pre><p>Possiamo controllare come questa variabile sia ora un numero utilizzando l'operatore <code>typeof</code> nuovamente:</p><pre><code class="language-js">console.log(typeof Number(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-9.57.35-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se si prova a passare come argomento un valore che non può essere convertito in un numero, allora il valore risultante sarà <code>NaN</code> ("Not a Number", letteralmente "non un numero").</p><pre><code class="language-js">console.log(Number("awesome"));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-10.00.34-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-parseint-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione <strong><strong><strong><code>parseInt()</code></strong></strong> </strong></strong></h2><p>Un altro modo per convertire una stringa in un numero è utilizzare la funzione <strong><strong><code>parseInt()</code></strong></strong>. Questa funzione prende come argomento una stringa e, opzionalmente, una radice.</p><p>Una radice è un numero tra 2 e 36 che rappresenta la base in un sistema numerico. Per esempio, una radice pari a 2 rappresenta il sistema binario, mentre la radice 10 rappresenta il sistema decimale.</p><p>Possiamo utilizzare la variabile <code>quantity</code> già usata in precedenza e convertirla in un numero:</p><pre><code class="language-js">const quantity = "12";

console.log(parseInt(quantity, 10));
</code></pre><p>Cosa succede se provo a cambiare la variabile <code>quantity</code> in <code>"12.99"</code>? Il risultato utilizzando <strong><strong><code>parseInt()</code></strong></strong> sarà il numero 12.99?</p><pre><code class="language-js">const quantity = "12.99";

console.log(parseInt(quantity, 10));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-10.45.08-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, il risultato è un numero intero arrotondato. Se desideravi come risultato un numero in virgola mobile (floating point number), allora avresti dovuto utilizzare <strong><strong><code>parseFloat()</code></strong></strong>.</p><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-parsefloat-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione <strong><strong><strong><code>parseFloat()</code></strong></strong> </strong></strong></h2><p>La funzione <strong><strong><code>parseFloat()</code></strong> </strong>prende come argomento un valore e restituisce come risultato un numero floating point. Esempi di numeri floating point sono 12.99 e 3.14.</p><p>Se modifichiamo il nostro esempio precedente per usare <code>parseFloat()</code>, il risultato sarà il numero floating point 12.99.</p><pre><code class="language-js">const quantity = "12.99";

console.log(parseFloat(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-10.55.03-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Nel caso in cui fossero presenti spazi bianchi nella stringa prima o dopo il valore che deve essere convertito, la funzione <code>parseFloat()</code> effettuerà ugualmente la conversione.</p><pre><code class="language-js">const quantity = "   12.99    ";

console.log(parseFloat(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.05.35-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se il primo carattere nella stringa non può essere convertito in un numero, allora <code>parseFloat()</code> &nbsp;restituirà <code>NaN</code>.</p><pre><code class="language-js">const quantity = "F12.99";

console.log(parseFloat(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.08.33-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-l-operatore-unario-pi-"><strong>Come convertire una stringa in un numero in JavaScript usando l'operatore unario più <strong>(<code>+</code>)</strong></strong></h2><p>L'operatore unario più &nbsp;(<code>+</code>) convertirà una stringa in un numero. L'operatore deve essere posizionato prima dell'operando.</p><pre><code class="language-js">const quantity = "12";

console.log(+quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.14.51-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Possiamo anche usare l'operatore unario più (<code>+</code>) &nbsp;per convertire una stringa in un numero floating point.</p><pre><code class="language-js">const quantity = "12.99";

console.log(+quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.16.38-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se il valore della stringa non può essere convertito in un numero, allora il risultato sarà <code>NaN</code>.</p><pre><code class="language-js">const quantity = "awesome";

console.log(+quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.18.10-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-moltiplicando-la-stringa-per-il-numero-1"><strong>Come convertire una stringa in un numero in JavaScript moltiplicando la stringa per il numero 1</strong></h2><p>Un altro modo per convertire una stringa in un numero è utilizzare una operazione matematica di base. Puoi moltiplicare il valore della stringa per 1 ed otterrai un numero.</p><pre><code class="language-js">const quantity = "12";

console.log(quantity * 1);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.42.58-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, quando moltiplichiamo il valore di <code>quantity</code> per 1, il risultato è il numero 12. Ma come funziona?</p><p>In questo esempio, JavaScript ha convertito il nostro valore della stringa in un numero e quindi ha eseguito l'operazione matematica. Tuttavia se il valore contenuto nella stringa non può essere convertito, allora l'operazione matematica non può essere eseguita e il risultato sarà <code>NaN</code>.</p><pre><code class="language-js">const quantity = "awesome";

console.log(quantity * 1);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.18.10-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Questo metodo funziona anche con i numeri floating point.</p><pre><code class="language-js">const quantity = "10.5";

console.log(quantity * 1);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-11.56.19-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-dividendo-la-stringa-per-il-numero-1"><strong>Come convertire una stringa in un numero in JavaScript dividendo la stringa per il numero 1</strong></h2><p>Invece di moltiplicare per 1, puoi anche dividere la stringa per 1. JavaScript convertirà il valore della nostra stringa in un numero e quindi eseguirà l'operazione matematica.</p><pre><code class="language-js">const quantity = "10.5";

console.log(quantity / 1);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.08.37-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-sottraendo-il-numero-0-dalla-stringa"><strong>Come convertire una stringa in un numero in JavaScript sottraendo il numero 0 dalla stringa</strong></h2><p>Un ulteriore metodo è sottrarre 0 dalla stringa. Come prima, JavaScript convertirà il valore della nostra stringa in un numero ed eseguirà l'operazione matematica.</p><pre><code class="language-js">const quantity = "19";

console.log(quantity - 0);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.11.59-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-utilizzando-l-operatore-not-bit-a-bit-"><strong>Come convertire una stringa in un numero in JavaScript utilizzando l'operatore NOT bit a bit <strong>(<code>~</code>)</strong></strong></h2><p>L'operatore NOT bit a bit (<code>~</code>) inverte i bit di un operando e converte tale valore in un intero a 32 bit con segno. Un intero a 32 bit con segno è un valore che rappresenta un numero intero con 32 bit (equivalenti a 4 byte).</p><p>Se utilizziamo un operatore NOT bit a bit (<code>~</code>) &nbsp;su un numero, questi eseguirà la seguente operazione: -(x + 1) </p><pre><code class="language-js">console.log(~19);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.20.18-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Ma se utilizziamo due operatori NOT bit a bit &nbsp;(<code>~</code>), allora convertiremo la nostra stringa in un numero:</p><pre><code class="language-js">const quantity = "19";

console.log(~~quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.28.16-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Questo metodo non funziona con i numeri floating point perchè il risultato sarà sempre un intero.</p><pre><code class="language-js">const quantity = "19.99";

console.log(~~quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.31.16-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se provi ad usare questo metodo su un carattere non-numerico, il risultato sarà zero.</p><pre><code class="language-js">const quantity = "awesome";

console.log(~~quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.32.45-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Questo metodo ha dei limiti perchè inizierà a dare problemi per valori che sono considerati troppo grandi. È importante assicurarsi che il numero da convertire sia compreso tra i valori degli interi a 32 bit con segno (ovvero compreso tra -2.147.483.648 e +2.147.483.648).</p><pre><code class="language-js">const quantity = "2700000000";

console.log(~~quantity);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.36.16-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Per saperne di più sull'operatore NOT bit a bit (<code>~</code>) , puoi fare riferimento alla seguente <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT">documentazione</a>.</p><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-math-floor-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione <strong><strong><strong><code>Math.floor()</code></strong></strong> </strong></strong></h2><p>Un altro modo di convertire una stringa in un numero è utilizzando la funzione <strong><strong><code>Math.floor()</code></strong></strong> . Questa funzione arrotonda per difetto un numero all'intero più vicino. </p><pre><code class="language-js">const quantity = "13.4";

console.log(Math.floor(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.44.53-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Come nei precedenti esempi, se proviamo ad usare un carattere non numerico, il risultato sarà &nbsp;<code>NaN</code>.</p><pre><code class="language-js">const quantity = "awesome";

console.log(Math.floor(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.46.08-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-math-ceil-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione<strong> <strong><strong><code>Math.ceil()</code></strong></strong> </strong> </strong></h2><p>La funzione <code>Math.ceil()</code> &nbsp;arrotonda per eccesso un numero all'interno più vicino.</p><pre><code class="language-js">const quantity = "7.18";

console.log(Math.ceil(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.48.15-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="come-convertire-una-stringa-in-un-numero-in-javascript-usando-la-funzione-math-round-"><strong>Come convertire una stringa in un numero in JavaScript usando la funzione<strong> <strong><strong><code>Math.round()</code></strong></strong></strong></strong></h2><p>La funzione &nbsp;<strong><strong><code>Math.round()</code></strong></strong> arrotonda un numero all'intero più vicino.</p><p>Se abbiamo il valore di 6.3, la funzione &nbsp;<strong><strong><code>Math.round()</code></strong> </strong>restituirà il valore 6.</p><pre><code class="language-js">const quantity = "6.3";

console.log(Math.round(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.50.20-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Ma se cambio tale valore a 6.5, allora la funzione <strong><strong><code>Math.round()</code></strong> </strong>restituirà il valore 7.</p><pre><code class="language-js">const quantity = "6.5";

console.log(Math.round(quantity));
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/05/Screen-Shot-2022-05-01-at-12.51.35-PM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="conclusioni"><strong>Conclusioni</strong></h2><p>In questo articolo, ti ho mostrato 11 modi per convertire una stringa in un numero usando JavaScript.</p><p>Qui sono elencati gli 11 differenti metodi discussi nell'articolo:</p><ol><li>usare la funzione <code>Number()</code> </li><li>usare la funzione <code>parseInt()</code> </li><li>usare la funzione <code>parseFloat()</code> </li><li>usare l'operatore unario più (<code>+</code>)</li><li>moltiplicare la stringa per il numero 1</li><li>dividere la stringa per il numero 1</li><li>sottrarre il numero 0 dalla stringa</li><li>usare l'operatore NOT bit a bit (<code>~</code>)</li><li>usare la funzione <code>Math.floor()</code> </li><li>usare la funzione <code>Math.ceil()</code> </li><li>usare la funzione <code>Math.round()</code> </li></ol><p>Spero che questo articolo ti sia piaciuto. Buona fortuna per il tuo viaggio nel mondo di JavaScript.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Annullare il merge in Git – Come annullare l'ultimo commit di merge in Git ]]>
                </title>
                <description>
                    <![CDATA[ Il Branching (la ramificazione dello sviluppo di un progetto) è una parte essenziale di Git, in quanto ti permette di lavorare senza manomettere il codice già in produzione. Quando finisci di lavorare con un branch diverso da main, vuoi unirlo con il ramo main con un commit di merge,  in ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/annullare-il-merge-in-git-come-annullare-lultimo-commit-di-merge-in-git/</link>
                <guid isPermaLink="false">671fcfb09ae93404d06943d8</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Tue, 29 Oct 2024 14:43:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/10/puppy-g3ddb72a98_1920.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/git-undo-merge-how-to-revert-the-last-merge-commit-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Undo Merge – How to Revert the Last Merge Commit in Git</a>
      </p><p>Il Branching (la ramificazione dello sviluppo di un progetto) è una parte essenziale di Git, in quanto ti permette di lavorare senza manomettere il codice già in produzione.</p><p>Quando finisci di lavorare con un branch diverso da <code>main</code>, vuoi unirlo con il ramo <code>main</code> con un commit di <em>merge</em>, &nbsp;in modo che le nuove feature o i bug risolti che hai appena inserito diventino effettivi e possano essere mostrati.</p><p>Ma cosa succede se finisci di effettuare il <em>merge </em>e ti accorgi di aver dimenticato di fare una cosa? Oppure cosa succede se accidentalmente effettui il <em>merge </em>quando non sei ancora pronto?</p><p>Puoi annullare quasi qualsiasi azione in Git. Così, in questo articolo, ti mostrerò come annullare un <em>merge </em>in Git, in modo da ripristinare la situazione precedente all'ultimo commit che hai effettuato.</p><h2 id="come-annullare-un-commit-di-merge-in-git"><strong>Come annullare un commit di merge in Git</strong></h2><p>Puoi usare il comando Git reset per annullare un <em>merge</em>.</p><p>Come prima cosa, è necessario controllare l'hash (o id) del commit, da usare per tornare al commit precedente.</p><p>Per controllare l'hash, usa il comando <code>git log</code> oppure <code>git reflog</code>. <code>git reflog</code> è una opzione migliore perché le informazioni sono più leggibili con questo comando.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><p>Quando ottieni l'hash del commit a cui vuoi tornare, lancia <code>git reset --hard commit-prima-del-merge</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-2-5.png" class="kg-image" alt="ss-2-5" width="600" height="400" loading="lazy"></figure><p>Dovresti vedere alcuni elementi essere rimossi dal tuo editor di codice quando lanci il comando.</p><p>Se non sei sicuro dell'hash dell'ultimo commit, puoi lanciare il comando <code>git reset --hard HEAD~1</code> &nbsp;per tornare al commit precedente al merge:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-3-3.png" class="kg-image" alt="ss-3-3" width="600" height="400" loading="lazy"></figure><p>Nota che quando utilizzi il flag &nbsp;<code>--hard</code> per annullare un merge, qualsiasi cambiamento non salvato in un commit viene annullato.</p><h2 id="un-modo-migliore-per-annullare-un-merge-in-git"><strong>Un modo migliore per annullare un merge in Git</strong></h2><p>Dato che i metodi discussi precedentemente annullano le modifiche non salvate in un commit, Git fornisce un flag più sicuro, denominato &nbsp;<code>--merge</code>.</p><p>Per annullare un merge con il flag &nbsp;<code>--merge</code>, lancia &nbsp;<code>git reflog</code> per vedere gli hash dei commit, quindi lancia &nbsp;<code>git reset --merge commit-precedente</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><p>Si può anche usare la keyword HEAD con il flag &nbsp;<code>--merge</code> lanciando <code>git reset --merge HEAD~1</code>: </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss5.png" class="kg-image" alt="ss5" width="600" height="400" loading="lazy"></figure><p><strong><strong>N.B.</strong></strong>: Se non ottieni una risposta da questo comando quando usi il flag &nbsp;<code>--merge</code>, non preoccuparti, funziona.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo, hai imparato come annullare un merge in Git, e adesso potrai annullare un merge non voluto o errato e lavorare in Git con maggiore efficienza.</p><p>Qui ci sono i punti principali da tenere a mente con i flag &nbsp;<code>--hard</code> e <code>--merge</code> quando si usano per annullare un merge: il flag &nbsp;<code>--hard</code> rimuove le modifiche non salvate in un commit, mentre il flag &nbsp;<code>--merge</code> mantiene le modifiche non salvate in un commit.</p><p>Grazie per aver letto questo articolo!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ La Funzione Enumerate di Python – Esempio di Enumerazione dell'Indice di un Ciclo in Python ]]>
                </title>
                <description>
                    <![CDATA[ Quando stai programmando in Python, puoi utilizzare la funzione enumerate() e un ciclo for per visualizzare ciascun valore di un iterabile con una variabile contatore.  In questo articolo, ti mostrerò come usare la funzione enumerate() di Python con un ciclo for e ti spiegherò perché è una funzione migliore ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/la-funzione-enumerate-di-python-esempio-di-enumerazione-dellindice-di-un-ciclo-in-python/</link>
                <guid isPermaLink="false">669534307faf37044ec58a6f</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Wed, 24 Jul 2024 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/07/tine-ivanic-u2d0BPZFXOY-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/python-enumerate-python-enum-for-loop-index-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Enumerate – Python Enum For Loop Index Example</a>
      </p><p>Quando stai programmando in Python, puoi utilizzare la funzione <code>enumerate()</code> e un ciclo <code>for</code> per visualizzare ciascun valore di un iterabile con una variabile contatore. </p><p>In questo articolo, ti mostrerò come usare la funzione <code>enumerate()</code> di Python con un ciclo <code>for</code> e ti spiegherò perché è una funzione migliore rispetto a creare un tuo contatore incrementale.</p><p>Prima però diamo un'occhiata a come farlo senza la funzione <code>enumerate()</code>.</p><h2 id="come-usare-un-ciclo-for-senza-la-funzione-enumerate-in-python"><strong>Come usare un ciclo <strong><code>for</code></strong> senza la funzione <strong><code>enumerate()</code></strong> <strong>in Python</strong></strong></h2><p>In Python, un iterabile è un oggetto su cui è possibile iterare per restituire un valore alla volta. Tra gli esempi di iterabili sono compresi liste, tuple e stringhe.</p><p>In questo esempio, abbiamo una lista di nomi di cani ed una variabile chiamata <code>count</code>.</p><pre><code class="language-py">dogs = ['Harley', 'Phantom', 'Lucky', 'Dingo']
count = 1</code></pre><p>Possiamo usare un ciclo <code>for</code> per attraversare la lista e stampare ciascun nome. Inoltre, incrementeremo la variabile <code>count</code> di 1 ogni volta per tenere traccia di quante volte abbiamo iterato sulla lista.</p><pre><code class="language-py">for name in dogs:
    print(count, name)
    count += 1</code></pre><p>Di seguito il risultato stampato sullo schermo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-22-at-3.12.05-AM.png" class="kg-image" alt="Screen-Shot-2021-09-22-at-3.12.05-AM" width="600" height="400" loading="lazy"></figure><p>Anche se questo approccio funziona, presenta un possibile errore.</p><p>Un errore comune potrebbe essere quello di dimenticare di incrementare la variabile <code>count</code>.</p><p>Se modifico il codice, otteniamo:</p><pre><code class="language-py">dogs = ['Harley', 'Phantom', 'Lucky', 'Dingo']
count = 1
for name in dogs:
    print(count, name)</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-22-at-3.15.00-AM.png" class="kg-image" alt="Screen-Shot-2021-09-22-at-3.15.00-AM" width="600" height="400" loading="lazy"></figure><p>Ora la variabile <code>count</code> non tiene traccia più accuratamente del numero di iterazioni del ciclo sulla lista.</p><p>Invece di far incrementare un variabile <code>count</code>, possiamo usare la funzione <code>enumerate()</code> con il ciclo <code>for</code>.</p><h2 id="che-cosa-la-funzione-enumerate-in-python"><strong>Che cosa è la funzione <strong><code>enumerate()</code></strong> in Python? </strong></h2><p>La funzione integrata di Python <code>enumerate()</code> prende un iterabile come input e un argomento opzionale di inizio.</p><pre><code class="language-py">enumerate(iterabile, argomento opzionale di inizio)</code></pre><p>Se ometti l'argomento opzionale di inizio, il contatore viene impostato a zero.</p><p>Il valore restituito dalla funzione <code>enumerate()</code> è un oggetto.</p><p>Questa funzione tiene traccia delle iterazioni eseguite così che tu non ti debba ricordare di aggiornare la variabile <code>count</code> .</p><p>Possiamo usare la funzione <code>enumerate()</code> con un ciclo <code>for</code> per visualizzare il valore di un iterabile con un contatore.</p><h2 id="come-usare-un-ciclo-for-con-la-funzione-enumerate-in-python"><strong>Come usare un ciclo <strong><code>for</code></strong> con la funzione <strong><code>enumerate()</code></strong> in Python </strong></h2><p>In questo esempio, vogliamo visualizzare la lista delle indicazioni stradali per andare da Times Square alla Juilliard School of Music a New York.</p><p>Come prima cosa dobbiamo creare la lista delle indicazioni, denominata <code>directions</code>:</p><pre><code class="language-py">directions = [
    'Head north on Broadway toward W 48th St',
    'Turn left onto W 58th St',
    'Turn right onto 8th Ave',
    'Turn left onto Broadway',
    'Turn left onto Lincoln Center Plaza',
    'Turn right onto Jaffe Dr',
    'Turn left onto Broadway',
    'Turn left onto W 65th St'
]</code></pre><p>Quindi, nel ciclo <code>for</code>, creiamo le variabili <code>count</code> e <code>direction</code> che ci permetteranno di eseguire l'iterazione.</p><p>La funzione <code>enumerate()</code> prenderà come argomenti di input la lista &nbsp;<code>directions</code> e la variabile <code>start</code>. Vogliamo iniziare il conteggio da 1 invece che da 0 (come impostato di default).</p><pre><code class="language-py">for count, direction in enumerate(directions, start=1):</code></pre><p>All'interno del ciclo, stamperemo le variabili <code>count</code> e <code>direction</code>.</p><pre><code class="language-py">print(count, direction)</code></pre><p>Ecco il codice completo:</p><pre><code class="language-py">directions = [
    'Head north on Broadway toward W 48th St',
    'Turn left onto W 58th St',
    'Turn right onto 8th Ave',
    'Turn left onto Broadway',
    'Turn left onto Lincoln Center Plaza',
    'Turn right onto Jaffe Dr',
    'Turn left onto Broadway',
    'Turn left onto W 65th St'
]

for count, direction in enumerate(directions, start=1):
    print(count, direction)</code></pre><p>E il risultato nella console:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/09/Screen-Shot-2021-09-22-at-3.52.27-AM.png" class="kg-image" alt="Screen-Shot-2021-09-22-at-3.52.27-AM" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere la variabile <code>count</code> &nbsp;è stata automaticamente aggiornata dalla funzione <code>enumerate()</code>.</p><p>In questo modo si rimuove la possibilità di errori se dimentichiamo di incrementare la variabile <code>count</code>.</p><h2 id="conclusioni"><strong>Conclusioni</strong></h2><p>Puoi utilizzare la funzione <code>enumerate()</code> ed il ciclo <code>for</code> per visualizzare ciascun valore di un iterabile con un contatore.</p><p>La funzione <code>enumerate()</code> prende come input un iterabile e un argomento opzionale di inizio.</p><pre><code class="language-py">enumerate(iterabile, argomento opzionale di inizio)</code></pre><p>Se l'argomento opzionale di inizio viene omesso, il conteggio viene inizializzato a zero.</p><p>L'uso della funzione <code>enumerate()</code> è un'alternativa migliore rispetto a creare un proprio contatore incrementale in un ciclo <code>for</code>.</p><p>La funzione <code>enumerate()</code> aggiorna automaticamente il conteggio e pertanto elimina la possibilità che si possa dimenticare di incrementare il contatore.</p><p>Spero che questo articolo ti sia piaciuto e buona fortuna per il tuo viaggio nel mondo di Python.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Simbolo Punto Elenco – L'Elenco Puntato con Unicode in HTML ]]>
                </title>
                <description>
                    <![CDATA[ Nei tuoi documenti HTML, spesso hai necessità di creare una lista di elementi. A questo scopo puoi usare gli elenchi puntati. Puoi mostrare gli elenchi puntati con il relativo carattere (o entità) Unicode. In questo articolo, ti mostrerò le entità Unicode e HTML utili a mostrare gli elenchi puntati in ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/simbolo-punto-elenco-lelenco-puntato-con-unicode-in-html/</link>
                <guid isPermaLink="false">669636037faf37044ec58bae</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Unicode ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Mon, 22 Jul 2024 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/07/bullet.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/dot-symbol-bullet-point-in-html-unicode/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Dot Symbol – Bullet Point in HTML Unicode</a>
      </p><p>Nei tuoi documenti HTML, spesso hai necessità di creare una lista di elementi. A questo scopo puoi usare gli elenchi puntati.</p><p>Puoi mostrare gli elenchi puntati con il relativo carattere (o entità) Unicode.</p><p>In questo articolo, ti mostrerò le entità Unicode e HTML utili a mostrare gli elenchi puntati in una pagina web.</p><p>Verso la fine di questo articolo, ti mostrerò inoltre le combinazioni a cinque caratteri che ti permettono di visualizzare il simbolo del punto.</p><h2 id="le-entit-unicode-e-html-per-gli-elenchi-puntati"><strong>Le entità Unicode e HTML per gli elenchi puntati</strong></h2><p>Il carattere Unicode per mostrare il simbolo del punto, o punto elenco, è <code>U+2022</code>.</p><p>Tuttavia, per usare questo carattere Unicode correttamente, sostituisci <code>U+</code> con una "e" commerciale (<code>&amp;</code>), cancelletto (<code>#</code>) e <code>x</code>. Quindi digita il numero 2022 ed aggiungi un punto e virgola. In questo modo, diventa <code>&amp;#x2022;</code>.</p><p>Apparirà così:</p><pre><code class="language-html">&lt;h1&gt;Languages of the web&lt;/h1&gt;
&lt;h3&gt;&amp;#x2022; HTML&lt;/h3&gt;
&lt;h3&gt;&amp;#x2022; CSS&lt;/h3&gt;
&lt;h3&gt;&amp;#x2022; JavaScript&lt;/h3&gt;
&lt;h3&gt;&amp;#x2022; PHP&lt;/h3&gt;
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><p>Oltre al carattere Unicode <code>&amp;#x2022;</code> puoi anche usare le entità HTML &nbsp;<code>&amp;bull;</code> e <code>&amp;#8226;</code> per mostrare elenchi puntati o simboli punto elenco sulla pagina web.</p><pre><code class="language-html">&lt;h1&gt;Languages of the web&lt;/h1&gt;
&lt;h3&gt;&amp;#8226; HTML&lt;/h3&gt;
&lt;h3&gt;&amp;bull; CSS&lt;/h3&gt;
&lt;h3&gt;&amp;#8226; JavaScript&lt;/h3&gt;
&lt;h3&gt;&amp;bull; PHP&lt;/h3&gt;
</code></pre><p>L'output rimane lo stesso:<br></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/ss2-4.png" class="kg-image" alt="ss2-4" width="600" height="400" loading="lazy"></figure><h2 id="combinazione-di-tasti-rapida-per-digitare-il-simbolo-del-punto"><strong>Combinazione di tasti rapida per digitare il simbolo del punto</strong></h2><p>Per digitare il simbolo del punto sulla tua tastiera, attiva il tastierino numerico premendo <code>BlocNum</code>, tieni premuto <code>Alt</code> e digita <code>0</code>, <code>1</code>, <code>4</code>, e <code>9</code> &nbsp;in successione.</p><p>Se non digiti i numeri con il tastierino numerico, il punto non apparirà.</p><p>Grazie per aver letto l'articolo!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ L'Operatore TypeOf in JavaScript - Come Verificare il Tipo di una Variabile o di un Oggetto in JS ]]>
                </title>
                <description>
                    <![CDATA[ I tipi di dato ed il controllo di tipo di dato (type checking) sono aspetti fondamentali di ogni linguaggio di programmazione. Molti linguaggi di programmazione, come Java, sono fortemente tipizzati. Questo significa che una variabile definita con uno specifico tipo può contenere esclusivamente un valore appartenente a tale tipo. JavaScript, ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/loperatore-typeof-di-javascript-come-verificare-il-tipo-di-una-variabile/</link>
                <guid isPermaLink="false">668fe55f7faf37044ec5874f</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Sat, 20 Jul 2024 14:16:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/07/cover.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-typeof-how-to-check-the-type-of-a-variable-or-object-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript TypeOf – How to Check the Type of a Variable or Object in JS</a>
      </p><p>I tipi di dato ed il controllo di tipo di dato (type checking) sono aspetti fondamentali di ogni linguaggio di programmazione.</p><p>Molti linguaggi di programmazione, come Java, sono <em>fortemente tipizzati</em>. Questo significa che una variabile definita con uno specifico tipo può contenere esclusivamente un valore appartenente a tale tipo.</p><p>JavaScript, invece, è un linguaggio <em>debolmente tipizzato</em> o <em>dinamicamente tipizzato</em>. Questo significa che una variabile può contenere un valore di qualsiasi tipo. Anche il seguente codice JavaScript può essere eseguito:</p><pre><code class="language-js">let one = 1;
one = 'one';
one = true;
one = Boolean(true);
one = String('It is possible');
</code></pre><p>Tenendo questo in considerazione, diventa di importanza critica conoscere il tipo di una variabile in qualsiasi momento.</p><p>Il tipo di una variabile è determinato dal tipo di valore ad essa assegnato. JavaScript ha uno speciale operatore, denominato <code>typeof</code>, il quale ti permette di conoscere il tipo di qualsiasi valore.</p><p>In questo articolo, impareremo come viene utilizzato <code>typeof</code>, insieme ad alcuni tranelli da cui stare in guardia.</p><h1 id="i-tipi-di-dato-in-javascript"><strong><strong>I tipi di dato in JavaScript</strong></strong></h1><p>Diamo una rapida occhiata ai tipi di dato in JavaScript prima di analizzare meglio l'operatore <code>typeof</code>.</p><p>Ci sono sette tipi di dato primitivi in JavaScript. Un tipo di dato primitivo è qualsiasi cosa che non è un oggetto. Essi sono:</p><ol><li>String (stringa di testo)</li><li>Number (numero floating-point in doppia precisione)</li><li>BigInt (numero intero di dimensione arbitraria)</li><li>Symbol (variabile particolare il cui valore è unico) </li><li>Boolean (variabile booleana)</li><li>undefined</li><li>null</li></ol><p>Qualsiasi altra cosa è un oggetto (Object) - &nbsp;array e funzioni compresi. Un oggetto è una raccolta di coppie chiave-valore.</p><h1 id="l-operatore-typeof-di-javascript"><strong><strong>L'operatore TypeOf di Java</strong>S<strong>cript</strong></strong></h1><p>L'operatore <code>typeof</code> considera solo un operando (operatore unario). Valuta il tipo dell'operando e restituisce il risultato come una stringa. </p><pre><code class="language-js">typeof 007;  // restituisce 'number'
</code></pre><p>Esiste una sintassi alternativa per l'operatore &nbsp;<code>typeof</code>, che può essere usato come una funzione:</p><pre><code class="language-js">typeof(operand)
</code></pre><p>Questa sintassi è utile quando vuoi valutare una espressione invece di un singolo valore. Ecco un esempio:</p><pre><code class="language-js">typeof(typeof 007); // restituisce 'string'
</code></pre><p>Nell'esempio qui sopra, l'espressione <code>typeof 007</code> valuta come tipo di dato "number" e restituisce la stringa 'number'. <code>typeof('number')</code> quindi fornisce come risultato un tipo di dato <code>'string'</code>.</p><p>Osserviamo un altro esempio &nbsp;per comprendere l'importanza delle parentesi con l'operatore <code>typeof</code>.</p><pre><code class="language-js">typeof(999-3223); // restituisce, "number"</code></pre><p>Se ometti le parentesi, l'espressione restituirà <code>NaN</code>("Not a Number"):</p><pre><code class="language-js">typeof 999-3223; // restituisce, NaN</code></pre><p>Questo accade perché, in primo luogo, l'espressione <code>typeof 999</code> darà come risultato una stringa, "number". Quindi l'espressione <code>"number" - 32223</code> restituirà &nbsp;NaN, come accade quando si esegue una operazione di sottrazione tra una stringa ed un numero.</p><h3 id="esempi-di-typeof-in-javascript"><strong>Esempi di TypeOf in JavaScript</strong></h3><p>I seguenti snippet di codice mostrano il risultato del controllo di tipi di dato di differenti valori utilizzando l'operatore <code>typeof</code>.</p><pre><code class="language-js">typeof 0;  //'number'
typeof +0;  //'number'
typeof -0;  //'number'
typeof Math.sqrt(2);  //'number'
typeof Infinity;  //'number'
typeof NaN;  //'number', anche se risulta Not a Number
typeof Number('100');  //'number', dopo aver convertito la stringa '100' nel tipo Number
typeof Number('freeCodeCamp');  //'number', nonstante questa stringa letterale non possa essere convertita in Number

typeof true;  //'boolean'
typeof false;  //'boolean'
typeof Boolean(0);  //'boolean'

typeof 12n;  //'bigint'

typeof '';  //'string'
typeof 'freeCodeCamp';  //'string'
typeof `freeCodeCamp is awesome`;  //'string'
typeof '100';  //'string'
typeof String(100); //'string'

typeof Symbol();  //'symbol'
typeof Symbol('freeCodeCamp');  //'symbol'

typeof {blog: 'freeCodeCamp', author: 'Tapas A'};  //'object';
typeof ['This', 'is', 101]; //'object'
typeof new Date();  //'object'
typeof Array(4);  //'object'

typeof new Boolean(true);  //'object'; 
typeof new Number(101);  //'object'; 
typeof new String('freeCodeCamp');  //'object';
typeof new Object;  //'object'

typeof alert;  //'function'
typeof function () {}; //'function'
typeof (() =&gt; {});  //'function' - è una funzione a freccia, pertanto sono necessarie le parentesi
typeof Math.sqrt;  //'function'

let a;
typeof a;  //'undefined'
typeof b;  //'undefined'
typeof undefined;  //'undefined'

typeof null;  //'object'
</code></pre><p>La tavola seguente mostra i valori risultanti dal controllo di tipo forniti da <code>typeof</code>:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; margin: 0.5em 0px 2.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, transparent 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, transparent 75%) 100% center / 10px 100% scroll rgb(255, 255, 255); color: rgb(10, 10, 35); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead 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: 16px; vertical-align: baseline;"><tr 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: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); font-style: inherit; font-variant: inherit; font-weight: 700; 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: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: left; text-transform: uppercase; background-color: var(--gray10);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; 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: 12px; vertical-align: baseline; color: var(--gray85);">TIPO</strong></th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); font-style: inherit; font-variant: inherit; font-weight: 700; 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: 1.2rem; vertical-align: baseline; color: var(--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--gray10);"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: bold; 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: 12px; vertical-align: baseline; color: var(--gray85);">VALORE DI RITORNO DI TYPEOF</strong></th></tr></thead><tbody 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: 16px; vertical-align: baseline;"><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">String</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'string'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">Number</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'number'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">BigInt</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'bigint'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">Symbol</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'symbol'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">Boolean</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'boolean'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">undefined</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'undefined'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">Function object</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'function'</code></td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">null</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'object'</code>(vedi sotto!)</td></tr><tr 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: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(90deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-size: 20px 100%; background-repeat: no-repeat;">Qualsiasi altro oggetto</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: 1px solid var(--gray10); 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: 16px; vertical-align: baseline; background-image: linear-gradient(270deg, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0)); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;"><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'object'</code></td></tr></tbody></table><!--kg-card-end: html--><h1 id="tranelli-comuni-con-typeof"><strong>Tranelli comuni con<strong><strong><strong> <code>typeof</code></strong></strong></strong></strong></h1><p>Ci sono dei casi in cui l'operatore &nbsp;<code>typeof</code> potrebbe non restituire i tipi che ci aspettiamo. Questo può causare confusione ed errori. Ecco alcuni casi:</p><h3 id="il-tipo-di-nan-number-numero-"><strong>Il tipo di<strong><strong><strong> NaN</strong></strong></strong> è Number (numero)</strong></h3><pre><code class="language-js">typeof NaN;  //'number', anche se è Not a Number (letteralmente Non un Numero)</code></pre><p>Il risultato di <code>typeof NaN</code> è <code>'number'</code>, ovvero numero. Questo è strano, pertanto non dovremmo usare <code>typeof</code> per individuare un valore <code>NaN</code>. Ci sono modi migliori per gestire questa situazione. Li vedremo tra poco.</p><h3 id="il-tipo-di-null-object-oggetto-"><strong>Il tipo di<strong><strong><strong> <code>null</code> </strong></strong></strong>è Object (oggetto)</strong></h3><pre><code class="language-js">  typeof null;  //'object'
</code></pre><p>In JavaScript, &nbsp;<code>typeof null</code> restituisce object (oggetto), il che dà l'errata impressione che <code>null</code> sia un oggetto invece che un tipo di dato primitivo.</p><p>Il risultato di <code>typeof null</code> è effettivamente un bug nel linguaggio. C'è stato un tentativo di risolverlo in passato ma è stato abbandonato a causa di problemi di compatibilità con le versioni precedenti di JS.</p><h3 id="il-tipo-di-una-variabile-non-dichiarata-undefined"><strong>Il tipo di una variabile non dichiarata è Undefined</strong></h3><p>Prima dello standard ES6, un controllo di tipo su una variabile non dichiarata forniva come risultato &nbsp;<code>'undefined'</code>. Ma questo non è un modo sicuro per gestire tale situazione ed evitare errori.</p><p>Con lo standard ES6 possiamo dichiarare variabili con visibilità a livello di blocco (un blocco è un pezzo di codice delimitato da {}. La visibilità a livello di blocco significa che la variabile è visibile a tutto il codice inserito tra queste parentesi graffe) con le parole chiave <code>let</code> oppure <code>const</code>. Se utilizzi l'operatore <code>typeof</code> su tali variabili prima che siano inizializzate, otterrai un errore di tipo <code>ReferenceError</code>.</p><pre><code class="language-js"> typeof cat; // ReferenceError
 let cat = 'brownie'; </code></pre><h3 id="il-tipo-di-una-funzione-costruttore-object-oggetto"><strong>Il tipo di una funzione costruttore è object - oggetto</strong></h3><p>Tutte le funzioni costruttore, ad eccezione del costruttore <code>Function</code>, saranno sempre classificate da <code>typeof</code> come 'object', ovvero oggetto.</p><pre><code class="language-js">typeof new String('freeCodeCamp'); //'object'</code></pre><p>Questo può portare ad un po' di confusione, siccome ci si attende che l'operatore restituisca il tipo effettivo del dato (nel caso soprariportato, un tipo di dato <code>string</code> - stringa).</p><h3 id="il-tipo-di-un-array-un-oggetto"><strong>Il tipo di un array è un oggetto</strong></h3><p>Sebbene tecnicamente corretto, questo potrebbe essere il caso più spiacevole. Vogliamo differenziare tra un array ed un oggetto anche se un array è tecnicamente un oggetto in JavaScript.</p><pre><code class="language-js">typeof Array(4);  //'object'</code></pre><p>Fortunatamente ci sono modi per rilevare un array correttamente. Li vedremo tra poco.</p><h1 id="oltre-typeof-un-migliore-controllo-del-tipo-dei-dati"><strong>Oltre <strong><strong><strong><code>typeof</code> – </strong></strong></strong>Un migliore controllo del tipo dei dati</strong></h1><p>Ora che abbiamo conosciuto alcune delle limitazioni che sorgono con l'impiego dell'operatore <code>typeof</code>, osserviamo come porvi rimedio ed implementare un controllo del tipo dei dati più efficace.</p><h3 id="come-rilevare-nan"><strong>Come rilevare<strong><strong><strong> NaN</strong></strong></strong></strong></h3><p>In JavaScript, NaN è un valore speciale. Il valore NaN rappresenta il risultato di una espressione aritmetica che non può essere effettivamente rappresentata. Per esempio:</p><pre><code class="language-js">let result = 0/0;
console.log(result);  // restituisce NaN
</code></pre><p>Inoltre, se eseguiamo una qualsiasi operazione aritmetica con <code>NaN</code>, questa fornirà sempre come risultato <code>NaN</code>.</p><pre><code class="language-js">console.log(NaN + 3); // restituisce NaN
</code></pre><p>Il controllo di tipo su NaN eseguito utilizzando l'operatore <code>typeof</code> non aiuta molto, poichè restituisce il tipo <code>'number'</code>, numero. JavaScript ha una funzione globale denominata <code>isNaN()</code> per verificare se un risultato è NaN.</p><pre><code class="language-js">isNaN(0/0); // restituisce true
</code></pre><p>Ma anche qui sorge un problema:</p><pre><code class="language-js">isNaN(undefined); // restituisce vero per 'undefined'
</code></pre><p>Nello standard ES6. il metodo <code>isNaN()</code> è aggiunto all'oggetto globale <code>Number</code>. Questo metodo è molto più affidabile e pertanto è quello preferito.</p><pre><code class="language-js">Number.isNaN(0/0); // restituisce true
Number.isNaN(undefined); // restituisce false
</code></pre><p>Un altro aspetto interessante di &nbsp;<code>NaN</code> è che l'unico valore di JavaScript che non è mai uguale a nessun altro valore, incluso se stesso. Pertanto questo è un altro metodo per rilevare NaN dove lo standard ES6 non è supportato:</p><pre><code class="language-js">function isNaN (input) {
  return input !== input;
}
</code></pre><h3 id="come-rilevare-null-in-javascript"><strong>Come rilevare null in JavaScript</strong></h3><p>Abbiamo visto come rilevare null usando l'operatore <code>typeof</code> generi confusione. Il metodo preferito per verificare se qualche valore è uguale a null è utilizzare un operatore di uguaglianza stretta (<code>===</code>).</p><pre><code class="language-js">function isNull(input) {
 return input === null;
}
</code></pre><p>Accertati di non utilizzare l'operatore di uguaglianza generico <code>==</code> per errore. Usare &nbsp;<code>==</code> al posto di &nbsp;<code>===</code> fornirà un risultato fuorviante.</p><h3 id="come-rilevare-un-array-in-javascript"><strong>Come rilevare un array in JavaScript</strong></h3><p>Dall'introduzione dello standard ES6, possiamo rilevare un array utilizzando il metodo <code>Array.isArray</code> .</p><pre><code class="language-js">Array.isArray([]); // restituisce vero
Array.isArray({}); // restituisce falso
</code></pre><p>Prima di ES6, potevamo usare l'operatore <code>instanceof</code> &nbsp;per identificare un array:</p><pre><code class="language-js">function isArray(input) {
  return input instanceof Array;
}
</code></pre><h1 id="una-soluzione-generale-al-controllo-del-tipo-dei-dati-in-javascript"><strong>Una soluzione generale al controllo del tipo dei dati in JavaScript</strong></h1><p>Esiste un modo con cui possiamo creare una soluzione generale al problema del controllo del tipo dei dati. Diamo un occhiata al metodo <code>Object.prototype.toString</code>. Questo metodo è molto potente ed estremamente utile per implementare codice apposito per il controllo di tipo.</p><p>Quando <code>Object.prototype.toString</code> viene invocato utilizzando <code>call()</code> o <code>apply()</code>, questo restituisce il tipo dell'oggetto nel formato: <code>[object Tipo]</code>. La parte <code>Tipo</code> nel valore restituito costituisce il tipo di dato effettivamente ricercato.</p><p>Diamo un'occhiata a come funziona con qualche esempio:</p><pre><code class="language-js">// restituisce '[object Array]'
Object.prototype.toString.call([]); 

// restituisce '[object Date]'
Object.prototype.toString.call(new Date()); 

// restituisce '[object String]'
Object.prototype.toString.call(new String('freeCodeCamp'));

// restituisce '[object Boolean]'
Object.prototype.toString.call(new Boolean(true));

// restituisce '[object Null]'
Object.prototype.toString.call(null);
</code></pre><p>Questo significa che se prendiamo la stringa restituita ed estraiamo la parte <code>Tipo</code>, avremo il tipo di dato effettivo. Qui riporto un tentativo di implementare quanto appena detto:</p><pre><code class="language-js">function typeCheck(value) {
  const return_value = Object.prototype.toString.call(value);
  // possiamo usare anche le espressioni regolari per fare questo...
  const type = return_value.substring(
           return_value.indexOf(" ") + 1, 
           return_value.indexOf("]"));

  return type.toLowerCase();
}
</code></pre><p>Ora possiamo usare la funzione <code>typeCheck</code> per rilevare i tipi di dato:</p><pre><code class="language-js">typeCheck([]); // 'array'
typeCheck(new Date()); // 'date'
typeCheck(new String('freeCodeCamp')); // 'string'
typeCheck(new Boolean(true)); // 'boolean'
typeCheck(null); // 'null'
</code></pre><h1 id="riassumendo"><strong>Riassumendo</strong></h1><p>Per riassumere quanto abbiamo imparato in questo articolo:</p><ul><li>In JavaScript il controllo del tipo dei dati non è così rigoroso come in altri linguaggi di programmazione.</li><li>Utilizzo dell'operatore &nbsp;<code>typeof</code> per rilevare i tipi di dato.</li><li>Ci sono due varianti della sintassi per l'operatore <code>typeof</code>: <code>typeof</code> e <code>typeof(espressione)</code>.</li><li>Il risultato dell'operatore <code>typeof</code> può essere fuorviante a volte. In questi casi dobbiamo necessariamente affidarci ad altri metodi disponibili (<code>Number.isNaN</code>, &nbsp;<code>Array.isArray</code>, e così via).</li><li>Possiamo usare <code>Object.prototype.toString</code> per creare un metodo generico per il controllo del tipo di dato.</li></ul><h1 id="prima-di-terminare-"><strong>Prima di terminare...</strong></h1><p>Grazie per aver letto questo articolo! Connettiamoci! Puoi taggarmi nei commenti su <a href="https://twitter.com/tapasadhikary">Twitter (@tapasadhikary)</a>.</p><p>Potrebbero interessarti anche questi articoli:</p><ul><li><a href="https://blog.greenroots.info/javascript-undefined-and-null-lets-talk-about-it-one-last-time-ckh64kmz807v848s15kdkg3dd">JavaScript undefined and null: Let's talk about it one last time!</a> (inglese)</li><li><a href="https://blog.greenroots.info/javascript-equality-comparison-with-and-objectis-ckdpt2ryk01vel9s186ft8cwl">JavaScript: Equality comparison with ==, === and Object.is</a> (inglese)</li><li><a href="https://www.freecodecamp.org/italian/news/la-parola-chiave-this-in-javascript-5-regole-chiave-di-binding-spiegate-per-principianti-di-js/">La Parola Chiave `this` in Javascript + 5 Regole Chiave di Binding Spiegate per Principianti di JS</a></li></ul><p>È tutto per ora. Ci rivediamo con il mio prossimo articolo. A presto!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come Verificare lo Stato della Connessione Internet Usando JavaScript Asincrono ]]>
                </title>
                <description>
                    <![CDATA[ È possibile utilizzare JavaScript per controllare se la tua app è connessa ad internet? In questo articolo, ti fornirò una risposta aggiornata a questa domanda. La soluzione farà uso dell'API Fetch di Javascript e della programmazione asincrona con il costrutto Async & Await. Prima però, diamo un'occhiata ad un approccio ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-verificare-lo-stato-della-connessione-internet-usando-javascript-asincrono/</link>
                <guid isPermaLink="false">668292aab3d5b00437d67b4c</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Mon, 08 Jul 2024 15:32:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/07/js_online_offline.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-check-internet-connection-status-with-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Check Internet Connection Status Using Async JavaScript</a>
      </p><p>È possibile utilizzare JavaScript per controllare se la tua app è connessa ad internet?</p><p>In questo articolo, ti fornirò una risposta aggiornata a questa domanda.</p><p>La soluzione farà uso dell'API Fetch di Javascript e della programmazione asincrona con il costrutto Async &amp; Await. Prima però, diamo un'occhiata ad un approccio comunemente accettato e vediamo perché potrebbe non essere la scelta migliore da implementare nella tua applicazione.</p><h2 id="navigator-online"><strong><strong>navigator.onLine</strong></strong></h2><p>La proprietà "online" dell'interfaccia navigator, <code>navigator.onLine</code>, è utilizzata frequentemente per rilevare lo stato online/offline del browser.</p><p>Combinata con i listener per gli eventi online ed offline, sembra fornire agli sviluppatori una soluzione semplice e facile da implementare.</p><h3 id="diamo-un-occhiata-a-come-implementare-navigator-online"><strong>Diamo un'occhiata a come implementare <strong>navigator.onLine</strong></strong></h3><p>Iniziamo aggiungendo un event listener all'evento "load". Quando l'evento "load" viene attivato, il listener controlla la proprietà "online" dell'interfaccia "navigator" e quindi mostra lo stato della connessione.</p><p>La proprietà "online" di navigator fornisce una risposta booleana (vero o falso). Per terminare l'azione del listener, utilizzeremo un operatore ternario per impostare il valore dell'elemento DOM che mostra lo stato della connessione.</p><pre><code class="language-javascript">window.addEventListener("load", (event) =&gt; {
  const statusDisplay = document.getElementById("status");
  statusDisplay.textContent = navigator.onLine ? "Online" : "OFFline";
});</code></pre><p><em>Ma perché la parola "navigator" (navigatore)? È un riferimento al browser Netscape Navigator in uso negli anni '90.</em></p><p>Posiziona un elemento h1 al centro nella tua pagina HTML con l'id "status". &nbsp;Se applichi il codice JavaScript riportato qui sopra alla tua pagina, dovresti vedere comparire il testo "Online".</p><p>Tuttavia questo aggiorna solamente l'elemento h1 quando la pagina viene caricata. Proviamo ad aggiungere dei listener per gli eventi offline e online che aggiornano il display dello stato ogni volta che l'uno o l'altro evento viene attivato.</p><pre><code class="language-javascript">window.addEventListener("offline", (event) =&gt; {
  const statusDisplay = document.getElementById("status");
  statusDisplay.textContent = "OFFline";
});

window.addEventListener("online", (event) =&gt; {
  const statusDisplay = document.getElementById("status");
  statusDisplay.textContent = "Online";
});</code></pre><p>Puoi andare alla scheda Applicazione degli strumenti Chrome per sviluppatori (<em>Chrome Dev Tools &gt; Application Tab </em>) &nbsp;e cliccare su ServiceWorker per impostare il browser in modo che risponda come se fosse offline.</p><p>Seleziona e deseleziona la checkbox Offline alcune volte. Dovresti vedere il display di stato rispondere immediatamente agli eventi offline e online che sono stati attivati.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/offline_check_nav_online.PNG" class="kg-image" alt="offline_check_nav_online" width="600" height="400" loading="lazy"><figcaption>strumenti Chrome per sviluppatori &gt; Applicazione&gt; Service Workers &gt; Checkbox Offline</figcaption></figure><h2 id="andiamo-un-po-pi-a-fondo"><strong>Andiamo un po' più a fondo</strong></h2><p>A prima vista, quanto riportato sopra sembra una buona soluzione, oltre che abbastanza semplice. Sfortunatamente, se leggiamo qualcosa in più nella documentazione della proprietà "online" di navigator e sugli eventi online/offline, troviamo che c'è un problema.</p><p><a href="https://caniuse.com/#search=navigator.onLine">Una ricerca di navigator.online su CanIUse.com</a> mostra il supporto diffuso fornito dai browser alla proprietà per lo stato online | offline. Tuttavia, guardano alle note riportate sotto la tabella relativa al supporto nelle diverse versioni, possiamo leggere:</p><blockquote>“Online non significa sempre connessione ad Internet. Può anche significare connessione a qualche rete”.</blockquote><p>Mmh, questo ci mette un po' i bastoni tra le ruote.</p><p>Così, se volessi veramente determinare lo stato online del browser, dovresti sviluppare metodi addizionali per la questa verifica.</p><p>Diamo anche un'occhiata al <a href="https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine">riferimento sulla documentazione MDN per navigator.onLine</a>.</p><blockquote><em><em>“</em>I browsers implementano questa proprietà in modo differente...non si può assumere che un valore true significhi necessariamente che il browser abbia accesso ad internet. Si potrebbe incorrere in falsi positivi...<em>”</em></em></blockquote><p>Questo conferma i nostri timori nell'utilizzare la proprietà online di navigator come soluzione per verificare la connessione Internet. È una soluzione che può devastare la nostra applicazione se questa dipende dalla conoscenza di quando delle sorgenti esterne di dati sono disponibili.</p><p>Uno di tali esempi è quando proviamo a determinare se una Web App Progressiva (Progressive Web App o PWA) sia online oppure no. MDN raccomanda persino,</p><blockquote><em><em>“...</em>se realmente si vuole determinare lo stato della connessione del browser, si dovrebbero sviluppare metodi addizionali di verifica.<em>”</em></em></blockquote><p>Una ricerca rapida nel web per "<em>navigator online non funziona</em>" (<em><em>“navigator online not working”</em></em>) fornisce diversi post nei forum di chi ha riscontrato problemi dipendendo da questa proprietà.</p><h2 id="allora-qual-la-soluzione"><strong>Allora, qual è la soluzione?</strong></h2><p>Ci serve sapere quando la nostra applicazione è realmente connessa a Internet e non solamente ad un router o una rete locale. Torniamo al nostro file JavaScript e ricominciamo da capo.</p><p>L'idea è fare una richiesta HTTP e trattarla elegantemente gestendo gli errori se questa fallisce. Se la richiesta ha successo, siamo online, mentre se fallisce, non lo siamo.</p><p>Richiederemo una piccola immagine a un intervallo temporale predefinito per determinare lo stato online. Il moderno linguaggio JavaScript fornisce l'API Fetch e la programmazione asincrona con il costrutto Async &amp; Await. Utilizzeremo questi strumenti per portare a termine il nostro obiettivo.</p><h3 id="la-funzione-checkonlinestatus-"><strong>La funzione <strong>checkOnlineStatus()</strong></strong></h3><p>Iniziamo creando una funzione freccia asincrona denominata checkOnlineStatus. La funziona restituirà vero o falso come la proprietà online di navigator.</p><p>All'interno della funzione, impostiamo un blocco try dove attendiamo una richiesta fetch per una immagine da 1 pixel. Assicurati che il tuo service worker non stia salvando questa immagine nella cache.</p><p>Un codice di risposta HTTP tra 200 e 299 indica che la richiesta ha avuto successo, pertanto forniremo il risultato del confronto sul codice di stato. Questo sarà vero se lo stato della risposta è compreso tra 200 e 299 e falso per gli altri valori.</p><p>Inoltre dobbiamo fornire un blocco catch che intercetti l'errore se la richiesta fallisce. La funzione ritornerà falso all'interno del blocco catch per indicare che siamo veramente offline, qualora accadesse.</p><pre><code class="language-javascript">const checkOnlineStatus = async () =&gt; {
  try {
    const online = await fetch("/1pixel.png");
    return online.status &gt;= 200 &amp;&amp; online.status &lt; 300; // può essere vera o falsa
  } catch (err) {
    return false; // sicuramente offline
  }
};</code></pre><p>Come prossimo passo, utilizzeremo il metodo setInterval e lo passeremo ad una funziona async anonima. La funzione async attenderà il risultato della nostra funzione checkOnlineStatus. Utilizzeremo quindi un operatore ternario con tale risultato per mostrare lo stato corrente della connessione.</p><p>Per testare questo esempio, imposta l'intervallo temporale ad ogni 3 secondi (3'000 millisecondi). Ma così è troppo frequente. Controllare ogni 30 secondi (30'000 millisecondi) potrebbe essere sufficiente per le tue effettive necessità.</p><pre><code class="language-javascript">setInterval(async () =&gt; {
  const result = await checkOnlineStatus();
  const statusDisplay = document.getElementById("status");
  statusDisplay.textContent = result ? "Online" : "OFFline";
}, 3000); // probabilmente troppo frequente, usa 30'000  per controllare ogni 30 secondi</code></pre><p>Con il nostro nuovo codice salvato, torniamo alla scheda Application negli strumenti per sviluppatori di Chrome per testare la risposta quando siamo offline.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/07/offline_check_fetch.PNG" class="kg-image" alt="offline_check_fetch" width="600" height="400" loading="lazy"><figcaption>strumenti Chrome per sviluppatori &gt; Applicazione&gt; Service Workers &gt; Checkbox Offline</figcaption></figure><p>Ho quasi dimenticato di includere il listener dell'evento "load" con funzionalità asincrona! Il rilevamento dell'evento "load" è importante forse nell'unico caso in cui si abbia una Web App Progressiva che utilizzi un service worker per essere disponibile in modalità offline. In caso contrario, la tua pagina web o la tua web app semplicemente non viene caricata senza una connessione.</p><p>Ecco qui il nuovo listener dell'evento load:</p><pre><code>window.addEventListener("load", async (event) =&gt; {
  const statusDisplay = document.getElementById("status");
  statusDisplay.textContent = (await checkOnlineStatus())
    ? "Online"
    : "OFFline";
});</code></pre><h2 id="una-considerazione-finale"><strong>Una considerazione finale</strong></h2><p>Il codice riportato sopra con le richieste HTTP effettuate ad intervalli prestabiliti va bene per mostrare lo stato della connessione della tua App. Detto questo, non suggerisco di affidarsi ad uno stato di connessione che viene controllato 20 o 30 secondi prima di effettuare una richiesta di dati critica nella tua applicazione.</p><p>In questo caso, dovresti invocare la funzione checkOnlineStatus direttamente prima della richiesta e valutare la risposta prima di richiedere i dati.</p><pre><code class="language-javascript">const yourDataRequestFunction = async () =&gt; {
    const online = await checkOnlineStatus();
    if (online) {
    	// make data request
    }
}</code></pre><h2 id="conclusioni"><strong>Conclusioni</strong></h2><p>Anche se navigator.onLine è ampiamente supportato nei diversi browser, fornisce risultati inaffidabili quando è necessario determinare se la nostra applicazione è realmente connessa a Internet. Utilizzando l'API Fetch e la programmazione asincrona in Javascript, possiamo rapidamente programmare una soluzione più affidabile.</p><p><a href="https://gist.github.com/gitdagray/f310be81be217750fc9d2b233e2ae70c">Qui c'è un link al code gist</a> su GitHub, e qui c'è un video tutorial che ho realizzato (video in lingua originale):</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe width="480" height="270" src="https://www.youtube.com/embed/hIaGzJ3txqM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Come creare il tuo primo package in Python ]]>
                </title>
                <description>
                    <![CDATA[ Alcuni mesi fa, ho deciso di rilasciare Caer [https://github.com/jasmcaus/caer], un pacchetto (package) per la visione artificiale (computer vision) disponibile in Python. Ho trovato l'intero processo estremamente complicato e frustrante. Probabilmente puoi immaginarne il motivo: documentazione scarsa (e confusa), mancanza di buoni tutorial, e così via. Ho così deciso di scrivere ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-creare-il-tuo-primo-package-in-python/</link>
                <guid isPermaLink="false">667d7b2630e9f504366b72fe</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Sisti ]]>
                </dc:creator>
                <pubDate>Fri, 28 Jun 2024 13:17:47 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/06/5f9c980f740569d1a4ca17ef.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/build-your-first-python-package/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/build-your-first-python-package/</a>
      </p><p>Alcuni mesi fa, ho deciso di rilasciare <a href="https://github.com/jasmcaus/caer">Caer</a>, un pacchetto (package) per la visione artificiale (computer vision) disponibile in Python. Ho trovato l'intero processo estremamente complicato e frustrante. Probabilmente puoi immaginarne il motivo: documentazione scarsa (e confusa), mancanza di buoni tutorial, e così via.</p><p>Ho così deciso di scrivere questo articolo nella speranza di aiutare chi sta affrontando le stesse difficoltà nel creare un package in Python. Realizzeremo un modulo molto semplice e lo renderemo disponibile a chiunque in tutto il mondo. &nbsp;</p><p>Il contenuto di questo modulo segue una struttura molto basilare. In totale sono riportati quattro file Python, ciascuno dei quali contiene un singolo metodo. Per questo tutorial adottiamo appositamente uno schema molto semplice.</p><pre><code>base-verysimplemodule  --&gt; Cartella base
└── verysimplemodule   --&gt; Modulo effettivo
    ├── extras
    │   ├── multiply.py
    │   ├── divide.py
    ├── add.py
    ├── subtract.py</code></pre><p>Puoi notare che abbiamo una cartella chiamata &nbsp;<code>verysimplemodule</code>, la quale, a sua volta, contiene i due file Python <code>add.py</code> e <code>subtract.py</code>. C'è anche una sottocartella chiamata <code>extras</code> (che contiene i file <code>multiply.py</code> e <code>divide.py</code>). La cartella <code>verysimplemodule</code> costituirà la base del nostro modulo Python.</p><h3 id="creare-i-file-__-init-__-py"><strong>Creare i file __ init __.py</strong></h3><p>Una cosa che si trova sempre in qualsiasi package di Python è un file &nbsp;<code>__init__.py</code>. Questo file comunica a Python di considerare le cartelle come moduli (o sotto-moduli).</p><p>Molto semplicemente, questo file conserva i nomi di tutti i metodi contenuti in tutti i file Python che si trovano nella sua stessa cartella.</p><p>Un tipico file <code>__init__.py</code> ha il seguente formato:</p><pre><code class="language-python">from file import method 

# 'method' è un funzione presente nel file denominato 'file.py'</code></pre><p>Per creare un package in Python, occorre aggiungere un file <code>__init__.py</code> &nbsp;in ogni sottocartella del tuo package. Queste sottocartelle diventano i <em>sottomoduli</em> del tuo package.</p><p>Nel nostro caso, aggiungiamo i nostri file <code>__init__.py</code> alla cartella del modulo effettivo, denominata <code>verysimplemodule</code>, in questo modo:</p><pre><code class="language-python">from add import add
from subtract import subtract</code></pre><p>e facciamo lo stesso per la sottocartella <code>extras</code>, in questo modo:</p><pre><code class="language-python">from multiply import multiply
from divide import divide</code></pre><p>Una volta fatto questo, siamo praticamente a metà dell'opera!</p><h3 id="come-impostare-il-file-setup-py"><strong>Come impostare il file<strong> setup.py</strong></strong></h3><p>All'interno della cartella <code>base-verysimplemodule</code> (e nella stessa cartella del nostro modulo <code>verysimplemodule</code>), dobbiamo aggiungere il file <code>setup.py</code>. Questo file è essenziale se si intende effettuare il build del modulo in questione.</p><p>Nota: si può nominare il file <code>setup.py</code> a piacimento. Questo file non deve avere un nome specifico, a differenza del file <code>__init__.py</code>.</p><p>Alcune possibili scelte per il nome possono essere <code>setup_my_very_awesome_python_package.py</code> e <code>python_package_setup.py</code>, ma di solito è buona pratica utilizzare <code>setup.py</code>.</p><p>Il file <code>setup.py</code> conterrà informazioni sul tuo package, specificamente il nome del package, la sua versione, le dipendenze dalle diverse piattaforme e molto altro.</p><p>Per i nostri scopi, non sono richieste meta-informazioni avanzate, così il seguente codice dovrebbe andare bene per la maggior parte dei pacchetti che creerai:</p><pre><code class="language-python">from setuptools import setup, find_packages

VERSION = '0.0.1' 
DESCRIPTION = 'Il mio primo package in Pyhton'
LONG_DESCRIPTION = 'Il mio primo package in Python con una descrizione un po più lunga'

# Impostazioni
setup(
       # il nome deve essere uguale a quello della cartella 'verysimplemodule'
        name="verysimplemodule", 
        version=VERSION,
        author="Jason Dsouza",
        author_email="&lt;youremail@email.com&gt;",
        description=DESCRIPTION,
        long_description=LONG_DESCRIPTION,
        packages=find_packages(),
        install_requires=[], # aggiungi qualsiasi package addizionale che 
        # deve essere installato insieme al tuo package. Ad Es. 'caer'
        
        keywords=['python', 'first package'],
        classifiers= [
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Education",
            "Programming Language :: Python :: 2",
            "Programming Language :: Python :: 3",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: Microsoft :: Windows",
        ]
)</code></pre><p>Una volta fatto questo, possiamo lanciare il seguente comando nella stessa cartella di <code>base-verysimplemodule</code>:</p><pre><code>python setup.py sdist bdist_wheel</code></pre><p>Questo comando permetterà di effettuare il build di tutti i pacchetti necessari richiesti da Python. Il comandi <code>sdist</code> e <code>bdist_wheel</code> permettono di creare una distribuzione sorgente (<em>source distribution</em>) e una distribuzione binaria in formato wheel (<em>.whl</em>) che potrai successivamente caricare su PyPi.</p><h3 id="pypi-eccoci-arrivati-"><strong><strong>PyPi — </strong>eccoci arrivati!</strong></h3><p><a href="https://pypi.org/" rel="noopener">PyPi</a> è l'archivio ufficiale di Python dove sono conservati tutti i package Python. Si può considerarlo un pò come il <em>Github per i Package di Python</em>.</p><p>Per rendere il tuo package disponibile agli utenti in tutto il mondo, devi attivare un <a href="https://pypi.org/account/register/" rel="noopener">account PyPi</a>.</p><p>Fatto ciò, saremo pronti per caricare il nostro package su PyPi. Ricordi la distribuzione sorgente e la distribuzione binaria Wheel che sono state costruite quando è stato lanciato il comando <code>python setup.py</code>? Bene, è proprio ciò che verrà effettivamente caricato su PyPi.</p><p>Ma prima di fare tutto questo, devi installare <code>twine</code> se non lo hai già installato. L'operazione è molto semplice e si esegue lanciando il comando <code>pip install twine</code>.</p><h3 id="come-caricare-il-tuo-package-su-pypi"><strong>Come caricare il tuo package su PyPi</strong></h3><p>Assumendo di avere installato <code>twine</code> , procediamo lanciando il seguente comando:</p><pre><code>twine upload dist/*</code></pre><p>Questo comando caricherà i contenuti della cartella <code>dist</code>, che è stata generata automaticamente quando abbiamo lanciato il comando <code>python setup.py</code>. Verrà visualizzato un prompt che chiederà lo username e la password dell'account PyPi, quindi procediamo ed inseriamoli come richiesto.</p><p>A questo punto, se hai seguito questo tutorial alla lettera, potresti ottenere un errore del tipo <strong>il repository è già esistente.</strong></p><p>Questo accade di solito perché c'è un conflitto tra i nomi del tuo package e di un package già esistente. In altre parole, cambia il nome del tuo package - quel nome è già stato utilizzato.</p><p>Ed è tutto!</p><p>Per installare orgogliosamente il tuo modulo tramite <code>pip</code>, avvia un terminale e lancia il comando:</p><pre><code>pip install &lt;nome_package&gt; 

# nel nostro caso:
pip install verysimplemodule</code></pre><p>Osserva come Python installa accuratamente il tuo package dai file binari che sono stati generati prima.</p><p>Apri una shell interattiva di Python e prova ad importare il tuo package:</p><pre><code class="language-shell">&gt;&gt; import verysimplemodule as vsm

&gt;&gt; vsm.add(2,5)
7
&gt;&gt; vsm.subtract(5,4)
1</code></pre><p>Per accedere ai metodi per divisione emoltiplicazione ( ricordi che erano in una sottocartella chiamata <code>extras</code>?), lancia il comandi:</p><pre><code class="language-shell">&gt;&gt; import verysimplemodule as vsm

&gt;&gt; vsm.extras.divide(4,2)
2
&gt;&gt; vsm.extras.multiple(5,3)
15</code></pre><p>È proprio così semplice.</p><p>Congratulazioni! Hai appena creato il tuo primo package in Python. Anche se molto semplice, il tuo package è adesso disponibile per il download da chiunque in tutto il mondo (premesso che abbia Python, ovviamente).</p><h2 id="qual-il-prossimo-passo"><strong>Qual è il prossimo passo?</strong></h2><h3 id="test-pypi"><strong>Test<strong> PyPi</strong></strong></h3><p>Il package che abbiamo usato in questo tutorial era un modulo estremamente semplice - le operazioni matematiche basilari di addizione, sottrazione, moltiplicazione e divisione. Non ha senso caricarlo direttamente in PyPi <em>specialmente </em>se lo stai provando per la prima volta.</p><p>Fortunatamente per noi, esiste <a href="http://test.pypi.org/" rel="noopener">Test PyPi</a>, una istanza separata di PyPi dove puoi testare e sperimentare il tuo pacchetto (è necessario iscriverti ad un account separato sulla piattaforma).</p><p>Il processo da seguire per caricare su Test PyPi è praticamente lo stesso, con qualche piccola modifica.</p><pre><code class="language-shell"># Il seguente comando caricherà il package su Test PyPi
# Ti verrà chiesto di fornire le tue credenziali di accesso a Test PyPi

twine upload --repository testpypi dist/*</code></pre><p>Per scaricare progetti da Test PyPi:</p><pre><code class="language-shell">pip install --index-url "https://test.pypi.org/simple/&lt;nome_package&gt;"</code></pre><h3 id="meta-informazioni-avanzate"><strong>Meta-informazioni avanzate</strong></h3><p>Le meta-informazioni che abbiamo usato nel file <code>setup.py</code> erano molto basilari. Puoi aggiungere ulteriori informazioni come manutentori multipli (se ci sono), email dell'autore, informazioni sulla licenza ed un gran numero di altri dati.</p><p><a href="https://packaging.python.org/guides/distributing-packages-using-setuptools/" rel="noopener">Questo articolo</a> si rivelerà particolarmente utile se intendi farlo.</p><h3 id="dai-un-occhiata-ad-altri-repository"><strong>Dai un'occhiata ad altri repository</strong></h3><p>Vedere come gli altri repository hanno costruito i loro pacchetti si può rivelare molto utile.</p><p>Mentre realizzavo <a href="https://github.com/jasmcaus/caer" rel="noopener">Caer</a>, osservavo costantemente come <a href="https://github.com/numpy/numpy" rel="noopener">Numpy</a> e <a href="https://github.com/deepmind/sonnet" rel="noopener">Sonnet</a> impostavano il loro pacchetti. Raccomanderei di dare un'occhiata ai repository di <a href="https://github.com/jasmcaus/caer" rel="noopener">Caer</a>, <a href="https://github.com/numpy/numpy" rel="noopener">Numpy</a> e <a href="https://github.com/tensorflow/tensorflow" rel="noopener">Tensorflow</a> se stai pianificando di realizzare pacchetti leggermente più avanzati.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
