<?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[ JavaScript - 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[ JavaScript - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 18 May 2026 19:57:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/javascript/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ In cosa consiste il problema aritmetico dei numeri a virgola mobile? ]]>
                </title>
                <description>
                    <![CDATA[ Ti è mai capitato di lavorare con numeri come 1/3, il cui risultato è 0.33333... continuando all'infinito? Noi umani di norma arrotondiamo numeri del genere, ma ti sei mai chiesto come vengono gestiti dai computer? In questo articolo esploreremo il modo in cui i computer gestiscono i numeri decimali illimitati, ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/problema-numeri-in-virgola-mobile/</link>
                <guid isPermaLink="false">672bc34c3c328904519c89a1</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Laura Albano ]]>
                </dc:creator>
                <pubDate>Thu, 06 Feb 2025 16:13:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2025/02/9824633d-727a-49ce-9080-0fa3a7b18ed6.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/what-is-a-floating-point-arithmetic-problem/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is a Floating-Point Arithmetic Problem?</a>
      </p><p>Ti è mai capitato di lavorare con numeri come 1/3, il cui risultato è 0.33333... continuando all'infinito? Noi umani di norma arrotondiamo numeri del genere, ma ti sei mai chiesto come vengono gestiti dai computer?</p><p>In questo articolo esploreremo il modo in cui i computer gestiscono i numeri decimali illimitati, includendo il concetto degli errori di precisione. Esamineremo il problema aritmetico della virgola mobile, una problematica universale che riguarda vari linguaggi di programmazione. Ci focalizzeremo in particolare su come JavaScript affronta questo problema. </p><p>Inoltre, impareremo come funzionano le operazioni binarie dietro le quinte, il limite oltre il quale JavaScript tronca i numeri, basandosi sullo standard IEEE 754, e introdurremo <code>BigInt</code> come soluzione per gestire in maniera accurata grandi numeri senza perdere precisione. </p><p>Innanzitutto prendiamo in considerazione un esempio. Riesci ad indovinare il risultato di questa operazione?</p><pre><code class="language-javascript">console.log(0.1 + 0.2);
</code></pre><p>Potresti aver pensato che la risposta fosse 0.3, vero? Ma in realtà il risultato è:</p><pre><code class="language-javascript">Output: 0.30000000000000004
</code></pre><p>Ti starai chiedendo perché ciò accada. Perché ci sono così tanti zero in più, e perché l'ultima cifra è 4?</p><p>La risposta è semplice: i numeri 0.1 e 0.2 non possono essere rappresentati in maniera precisa in JavaScript (ovvero "esattamente" o "accuratamente")</p><p>Sembrerebbe facile, no? Ma la spiegazione è un po' più complicata.</p><p>Quindi cosa ne pensi? È un bug o una funzionalità?</p><p>Be', non è un bug. È un problema di base, che ha a che fare con il metodo in cui i computer gestiscono i numeri, in particolare i numeri a virgola mobile. &nbsp;</p><h2 id="perch-succede-questa-cosa"><strong>Perché succede questa cosa? </strong></h2><p>Capiamolo attraverso la matematica di base.</p><p>La frazione 1/3, è rappresentata in decimali da 0.33333... dove il 3 si ripete all'infinito. Non possiamo scriverlo in maniera esatta, quindi lo approssimiamo come 0.333 o 0.333333 per risparmiare tempo e spazio. </p><p>In maniera simile, con un computer, dobbiamo comunque approssimare, perché 1/3 o 0.3333... sarebbe un numero troppo grande e occuperebbe un spazio infinito (che non abbiamo). </p><p>Ciò porta a quello che noi chiamiamo il problema aritmetico della virgola mobile. </p><h2 id="il-problema-aritmetico-della-virgola-mobile">Il problema aritmetico della virgola mobile</h2><p>In parole povere, i numeri a virgola mobile sono numeri che non possono essere scritti in maniera esatta, e che quindi vengono approssimati. In un computer questo tipo di approssimazione può portare a piccoli errori di precisione, che chiamiamo il problema aritmetico della virgola mobile. </p><h2 id="spiegazione-binaria"><strong>Spiegazione binaria</strong></h2><p>Adesso che ci siamo occupati di questa semplice spiegazione, comprendiamo questo concetto anche dal punto di vista binario. JavaScript gestisce tutto in codice binario dietro le quinte. </p><p>Binario è un sistema di numeri che utilizza solo due cifre: 0 e 1.</p><h3 id="perch-0-1-e-0-2-non-possono-essere-rappresentati-accuratamente-nel-sistema-binario"><strong>Perché 0.1 e 0.2 non possono essere rappresentati accuratamente nel sistema binario? </strong></h3><p>Il problema principale è che non tutti i numeri decimali possono essere perfettamente rappresentati come frazioni binarie. </p><p>Prendiamo 0.1 come esempio: quando si prova a rappresentare 0.1 in binario, si scopre che non può essere espresso come una frazione binaria finita, invece diventa una frazione continua, proprio come 1/3 in numeri decimali diventa 0.333..., ripetuto all'infinito. </p><p>In binario, 0.1 diventa:</p><pre><code class="language-plaintext">0.0001100110011001100110011001100110011... (si ripete all'infinito)
</code></pre><p>Dato che i computer hanno una memoria limitata, non possono memorizzare questa sequenza infinita in maniera esatta, ma la devono troncare ad un certo punto, e ciò crea un piccolo errore di arrotondamento. Questo è il motivo per cui 0.1 in binario è solo una approssimazione dell'effettivo numero. </p><p>Come 0.1, 0.2 non può essere rappresentato accuratamente nel sistema binario. Diventa invece: </p><pre><code class="language-plaintext">0.00110011001100110011001100110011... (si ripete all'infinito)
</code></pre><p>Di nuovo il computer tronca questa sequenza binaria infinita, causando un piccolo errore di rappresentazione. </p><p>Quindi cosa succede quando addizioniamo 0.1 + 0.2? Quando si addizionano 0.1 + 0.2 in JavaScript, le approssimazioni binarie per 0.1 e 0.2 sono sommate. Ma, dato che entrambi i valori sono solo approssimazioni, anche il risultato è una approssimazione.</p><p>Invece di ottenere esattamente 0.3, otterremo: </p><pre><code class="language-javascript">console.log(0.1 + 0.2); // Output: 0.30000000000000004
</code></pre><p>Questo minimo errore si verifica perché né 0.1 né 0.2 possono essere rappresentati accuratamente nel sistema binario, quindi il risultato finale ha un piccolo errore di arrotondamento. </p><h2 id="come-tronca-i-numeri-javascript"><strong>Come tronca i numeri JavaScript?</strong></h2><p>Adesso sorge una domanda: come fa JavaScript a sapere quando deve troncare il valore (<strong>t<strong>r</strong>oncamento</strong> significa abbreviare un numero rimuovendo le cifre in più dopo un certo punto)?</p><p>C'è un limite massimo ed un limite minimo per farlo. </p><p>Per gestire questa operazione nel mondo dei computer, abbiamo uno standard che definisce come i numeri a virgola mobile vengono memorizzati e calcolati. </p><h2 id="standard-ieee-754"><strong><strong>Standard</strong> <strong>IEEE 754</strong></strong></h2><p>JavaScript utilizza lo standard IEEE 754 per gestire le operazioni aritmetiche con i numeri a virgola mobile. </p><p>Lo standard stabilisce dei limiti di numeri interi sicuri per il tipo <code>Number</code> in JavaScript, che evitano la perdita di precisione:</p><ul><li><strong>Massimo Numero Intero Sicuro<strong>:</strong></strong> 2^53 - 1 o 9007199254740991</li><li><strong>Minimo Numero Intero Sicuro<strong>:</strong></strong> -(2^53 - 1) o -9007199254740991</li></ul><p>Oltre questi limiti JavaScript non può rappresentare accuratamente i numeri interi, dato il modo in cui funziona l'aritmetica dei numeri a virgola mobile.</p><p>Per questa ragione, JavaScript ci fornisce due costanti per rappresentare questi limiti: &nbsp;</p><ul><li><code>Number.MAX_SAFE_INTEGER</code></li><li><code>Number.MIN_SAFE_INTEGER</code></li></ul><h3 id="nel-caso-avessi-bisogno-di-un-numero-pi-grande"><strong>Nel caso avessi bisogno di un numero più grande?</strong></h3><p>Se hai bisogno di lavorare con numeri più grandi del massimo numero intero sicuro (come quelli utilizzati nella crittografia o nelle finanze), JavaScript ha una soluzione: BigInt. </p><h3 id="bigint"><strong>BigInt</strong></h3><p><code>BigInt</code> è un oggetto integrato che ti permette di lavorare con numeri interi che vanno oltre il limite degli interi sicuri. Ti permette di rappresentare numeri più grandi di 9007199254740991 senza preoccuparti degli errori di precisione!</p><p>Per utilizzare <code>BigInt</code> bisogna semplicemente aggiungere una <code>n</code> alla fine di un numero intero: </p><pre><code class="language-javascript">const bigNumber = 1234567890123456789012345678901234567890n;
</code></pre><p>In alternativa, puoi utilizzare il costruttore <code>BigInt</code>:</p><pre><code class="language-javascript">const bigNumber = BigInt("1234567890123456789012345678901234567890");
</code></pre><h4 id="calcoli-con-bigint"><strong>Calcoli con BigInt</strong></h4><p>Si possono svolgere operazioni aritmetiche utilizzando <code>BigInt</code>, come addizione, sottrazione, moltiplicazione, e anche elevamento a potenza. Tuttavia, c'è un problema: non possiamo fare operazioni aritmetiche mescolando <code>BigInt</code> con il tipo <code>Number</code>, non senza prima fare delle conversioni esplicite tra un tipo e l'altro. </p><p>Per esempio, questo non funzionerà: </p><pre><code class="language-javascript">let result = bigNumber + 5; // Error: cannot mix BigInt and other types
</code></pre><p>C'è bisogno prima di convertire <code>Number</code> in <code>BigInt</code>:</p><pre><code class="language-javascript">let result = bigNumber + BigInt(5); // Adesso funziona!
</code></pre><h3 id="quando-utilizzare-bigint"><strong>Quando utilizzare BigInt? </strong></h3><p><code>BigInt</code> è particolarmente utile in aree in cui è richiesta precisione, come ad esempio:</p><ul><li>Algoritmi crittografici </li><li>Gestire grandi set di dati</li><li>Calcoli finanziari che richiedono precisione</li></ul><h3 id="riassumendo"><strong>Riassumendo </strong></h3><ul><li>Il limite intero sicuro in JavaScript garantisce una rappresentazione accurata dei numeri tra -(2^53 - 1) e 2^53 - 1.</li><li>Gli errori di precisione si verificano a causa dell'aritmetica dei numeri a virgola mobile, quando si lavora con particolari numeri (come 0.1 + 0.2).</li><li>Se hai bisogno di utilizzare numeri oltre del limite sicuro, <code>BigInt</code> è tuo amico. Ma ricorda che per combinare <code>BigInt</code> con il tipo <code>Number</code> bisogna prima fare delle conversioni esplicite. </li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Switch case in JavaScript - Esempio di istruzione switch ]]>
                </title>
                <description>
                    <![CDATA[ A volte in JavaScript si può considerare l'utilizzo di un'istruzione switch al posto di un'istruzione if else. L'istruzione switch può offrire una sintassi più semplice rispetto a istruzioni  if else più complicate. Consideriamo l'esempio sottostante – invece di utilizzare questa lunga istruzione if else, possiamo scegliere di utilizzare un'istruzione ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/switch-case-in-javascript-esempio-di-istruzione-switch/</link>
                <guid isPermaLink="false">6779439a5815bf043a6b6177</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan Forcati ]]>
                </dc:creator>
                <pubDate>Sat, 18 Jan 2025 16:45:49 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2025/01/karl-pawlowicz-QUHuwyNgSA0-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-switch-case-js-switch-statement-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Switch Case – JS Switch Statement Example</a>
      </p><p>A volte in JavaScript si può considerare l'utilizzo di un'istruzione <code>switch</code> al posto di un'istruzione <code>if else</code>.</p><p>L'istruzione <code>switch</code> può offrire una sintassi più semplice rispetto a istruzioni <code>if else</code> più complicate.</p><p>Consideriamo l'esempio sottostante – invece di utilizzare questa lunga istruzione <code>if else</code>, possiamo scegliere di utilizzare un'istruzione <code>switch</code> più semplice da leggere.</p><pre><code class="language-js">const animale = "cane";

if (animale === "lucertola") {
  console.log("Ho una lucertola");
} else if (animale === "cane") {
  console.log("Ho un cane");
} else if (animale === "gatto") {
  console.log("Ho un gatto");
} else if (animale === "serpente") {
  console.log("Ho un serpente");
} else if (animale === "pappagallo") {
  console.log("Ho un pappagallo");
} else {
  console.log("Non ho nessun animale");
}
</code></pre><pre><code class="language-js">const animale = "cane";

switch (animale) {
  case "lucertola":
    console.log("Ho una lucertola");
    break;
  case "cane":
    console.log("Ho un cane");
    break;
  case "gatto":
    console.log("Ho un gatto");
    break;
  case "serpente":
    console.log("Ho un serpente");
    break;
  case "pappagallo":
    console.log("Ho un pappagallo");
    break;
  default:
    console.log("Non ho nessun animale");
    break;
}
</code></pre><p>In questo articolo, vedremo cosa sono le istruzioni switch e come funzionano. Ti aiuterò anche a capire se sono una buona alternativa da utilizzare nel tuo codice.</p><h2 id="che-cos-un-istruzione-switch"><strong>Che cos'è un'istruzione switch?</strong></h2><p>Nella programmazione, un'istruzione <code>switch</code> è un'istruzione di controllo del flusso che confronta il valore di una <code>espressione</code> con diversi casi possibili.</p><p>Questa è la sintassi di base di un'istruzione <code>switch</code>:</p><pre><code class="language-js">switch (espressione) {
  case 1:
   //questo codice verrà eseguito se questo caso corrisponde all'espressione
    break;
  case 2:
   //questo codice verrà eseguito se questo caso corrisponde all'espressione
    break;
  case 3:
   //questo codice verrà eseguito se questo caso corrisponde all'espressione
    break;
  default:
    //questo codice verrà eseguito se nessun caso corrisponde all'espressione
    break;
}
</code></pre><p>Il computer valuterà l'istruzione <code>switch</code> verificando l'uguaglianza (stretta) <code>===</code> tra i vari <code>case</code> e l'<code>espressione</code>. Se uno dei casi corrisponde all'<code>espressione</code>, allora verrà eseguito il codice all'interno di quella clausola <code>case</code>.</p><pre><code class="language-js">switch (espressione) {
  case 1:
   //questo codice verrà eseguito se questo caso corrisponde all'espressione
    break;
  case 2:
   //questo codice verrà eseguito se questo caso corrisponde all'espressione
    break;
}
</code></pre><p>Se nessuno dei casi corrisponde all'espressione, allora la clausola <code>default</code> verrà eseguita.</p><pre><code class="language-js">  default:
    //questo codice verrà eseguito se nessun caso corrisponde all'espressione
    break;
</code></pre><p>Se più casi dell'istruzione <code>switch</code> possono corrispondere all'espressione, allora il primo <code>case</code> che corrisponde all'<code>espressione</code> verrà utilizzato.</p><p>Le istruzioni <code>break</code> permettono di uscire dall'istruzione <code>switch</code> quando un <code>case</code> corrisponde. Se non sono presenti istruzioni <code>break</code>, allora il computer continuerà l'esecuzione dell'istruzione <code>switch</code> anche se viene trovata una corrispondenza.</p><p>Se sono presenti delle istruzioni <code>return</code> nello <code>switch</code>, allora non è necessaria l'istruzione <code>break</code>.</p><h2 id="esempio-di-istruzioni-switch-in-javascript"><strong>Esempio di istruzioni switch in JavaScript</strong></h2><p>In questo esempio, confrontiamo <code>"oboe"</code> con i vari casi. <code>"oboe"</code> corrisponderà alla terza clausola <code>case</code> e stamperà nella console "Suono l'oboe".</p><pre><code class="language-js">switch ("oboe") {
  case "tromba":
    console.log("Suono la tromba");
    break;
  case "flauto":
    console.log("Suono il flauto");
    break;
  case "oboe":
    console.log("Suono l'oboe");
    break;
  default:
    console.log("Non suono nessuno strumento");
    break;
}
</code></pre><p>Se cambiassimo l'espressione in <code>"nessuno strumento"</code>, allora verrebbe eseguita la clausola <code>default</code> e il messaggio stampato nella console sarebbe "Non suono nessuno strumento".</p><pre><code class="language-js">switch ("nessuno strumento") {
  case "tromba":
    console.log("Suono la tromba");
    break;
  case "flauto":
    console.log("Suono il flauto");
    break;
  case "oboe":
    console.log("Suono l'oboe");
    break;
  default:
    console.log("Non suono nessuno strumento");
    break;
}
</code></pre><h2 id="senza-istruzioni-break"><strong>Senza istruzioni break</strong></h2><p>In questo esempio, c'è corrispondenza con il <code>case</code> 2. Ma senza un'istruzione <code>break</code>, il computer continuerà con il <code>case</code> 3 e con la clausola <code>default</code>.</p><p>Vedrai il risultato di tre istruzioni <code>console.log</code> perché non è stata inclusa l'istruzione <code>break</code>.</p><pre><code class="language-js">switch (2) {
  case 1:
    console.log("È stato scelto il numero 1");
  case 2:
    console.log("È stato scelto il numero 2");
  case 3:
    console.log("È stato scelto il numero 3");
  default:
    console.log("Non è stato scelto nessun numero");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-1.png" class="kg-image" alt="Console-1" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2025/01/Console-1.png 600w, https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-1.png 722w" sizes="(min-width: 720px) 720px" width="722" height="198" loading="lazy"></figure><h2 id="dove-posizionare-la-clausola-default">Dove posizionare la clausola default</h2><p>La convenzione usuale è quella di inserire la clausola <code>default</code> come ultima clausola. Ma si può posizionare anche prima di altre clausole.</p><pre><code class="language-js">const cibo = "noccioline";

switch (cibo) {
  case "torta":
    console.log("Mi piace la torta");
    break;
  case "pizza":
    console.log("Mi piace la pizza");
    break;
  default:
    console.log("Mi piace di tutto");
    break;
  case "gelato":
    console.log("Mi piace il gelato");
    break;
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-2.png" class="kg-image" alt="Console-2" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2025/01/Console-2.png 600w, https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-2.png 646w" width="646" height="114" loading="lazy"></figure><p>Il computer controllerà sempre ogni caso per trovare una corrispondenza. Poiché il valore della variabile <code>cibo</code> non corrisponde a nessuno dei casi, allora verrà eseguito il caso di <code>default</code>.</p><h2 id="casi-multipli-per-una-stessa-operazione"><strong>Casi multipli per una stessa operazione</strong></h2><p>A volte, a più casi può corrispondere una stessa operazione.</p><p>Invece di scrivere gli stessi <code>console.log</code> per ciascun caso, possiamo tralasciare le istruzioni <code>break</code> e inserire un'istruzione dopo l'elenco dei casi.</p><p>Il messaggio "Questo paese si trova in Europa" verrà stampato nella console se <code>paese</code> corrisponde a uno dei casi tra <code>"Francia"</code>, <code>"Spagna"</code>, <code>"Irlanda"</code> o <code>"Polonia"</code>.</p><pre><code class="language-js">const paese = "Irlanda";
switch (paese) {
  case "Francia":
  case "Spagna":
  case "Irlanda":
  case "Polonia":
    console.log("Questo paese si trova in Europa");
    break;
  case "Stati Uniti":
  default:
    console.log("Questo paese non si trova in Europa");
}
</code></pre><h2 id="ambito-di-blocco-e-istruzioni-switch"><strong>Ambito di blocco e istruzioni switch</strong></h2><p>Nell'esempio seguente si verificherà un errore, perché la variabile <code>messaggio</code> è già stata dichiarata e non si può dichiarare un'altra variabile con lo stesso nome nello stesso ambito di blocco.</p><pre><code class="language-js">const commissione = "Andare a fare shopping";
switch (commissione) {
  case "Andare dal dentista":
    let messaggio = "Odio andare dal dentista";
    console.log(messaggio);
    break;
  case "Andare a fare shopping":
    let messaggio = "Adoro fare shopping";
    console.log(messaggio);
    break;
  default:
    console.log("Nessuna commissione");
    break;
}
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-3.png" class="kg-image" alt="Console-3" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2025/01/Console-3.png 600w, https://www.freecodecamp.org/italian/news/content/images/size/w1000/2025/01/Console-3.png 1000w, https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-3.png 1258w" sizes="(min-width: 720px) 720px" width="1258" height="62" loading="lazy"><figcaption>Errore di sintassi: la variabile 'messaggio' è già stata dichiarata</figcaption></figure><p>Per evitare il messaggio di errore, i casi devono essere racchiusi in parentesi graffe.</p><pre><code class="language-js">const commissione = "Andare a fare shopping";
switch (commissione) {
  case "Andare dal dentista": {
    let messaggio = "Odio andare dal dentista";
    console.log(messaggio);
    break;
  }
  case "Andare a fare shopping": {
    let messaggio = "Adoro fare shopping";
    console.log(messaggio);
    break;
  }
  default: {
    console.log("Nessuna commissione");
    break;
  }
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-4-1.png" class="kg-image" alt="Console-4-1" srcset="https://www.freecodecamp.org/italian/news/content/images/size/w600/2025/01/Console-4-1.png 600w, https://www.freecodecamp.org/italian/news/content/images/2025/01/Console-4-1.png 722w" sizes="(min-width: 720px) 720px" width="722" height="71" loading="lazy"></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Un'istruzione <code>switch</code> può essere un'alternativa all'istruzione <code>if else</code>. Un'istruzione <code>switch</code> confronta il valore di un'<code>espressione</code> con diversi casi.</p><p>Le istruzioni <code>switch</code> controllano l'uguaglianza stretta. In questo esempio, poiché <code>"2"!== 2</code>, verrà eseguita la clausola <code>default</code>.</p><pre><code class="language-js">switch (2) {
  case "2":
    console.log("Il numero 2 in una stringa");
    break;
  case "3":
    console.log("Il numero 3 in una stringa");
    break;
  default:
    console.log("Nessun numero presente");
    break;
}
</code></pre><p>Le istruzioni <code>break</code> permettono di uscire da uno <code>switch</code> quando c'è corrispondenza con un <code>case</code>. Se non sono presenti istruzioni <code>break</code>, allora il computer continuerà l'esecuzione dell'istruzione <code>switch</code> anche se viene trovata una corrispondenza.</p><p>Spero che questo articolo sull'istruzione <code>switch</code> ti sia piaciuto.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Le istruzioni condizionali if-else e if-then in JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Ci saranno occasioni in cui avrai bisogno di scrivere comandi che gestiscono decisioni diverse nel tuo codice.  Per esempio, se stai creando un bot, puoi fare in modo che risponda con messaggi differenti in base ai comandi che può ricevere. In questo articolo spiegherò cos'è un'istruzione if...else con esempi ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/le-istruzioni-condizionali-if-else-e-if-then-in-javascript/</link>
                <guid isPermaLink="false">6725181e9ae93404d0694789</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Laura Albano ]]>
                </dc:creator>
                <pubDate>Tue, 19 Nov 2024 19:41:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/11/walling-e_MdMMKrgdY-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-if-else-and-if-then-js-conditional-statements/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript If-Else and If-Then – JS Conditional Statements</a>
      </p><p>Ci saranno occasioni in cui avrai bisogno di scrivere comandi che gestiscono decisioni diverse nel tuo codice. </p><p>Per esempio, se stai creando un bot, puoi fare in modo che risponda con messaggi differenti in base ai comandi che può ricevere.</p><p>In questo articolo spiegherò cos'è un'istruzione <code>if...else</code> con esempi di codice. Ci occuperemo anche dell'operatore condizionale ternario, che può essere utilizzato come abbreviazione delle istruzioni <code>if...else</code>. </p><h2 id="cos-un-istruzione-if-else-in-javascript"><strong>Cos'è un'istruzione if...else in JavaScript?</strong></h2><p>L'<code>if...else</code> è un tipo di istruzione condizionale (conditional statement), che esegue un blocco di codice quando la condizione contenuta nell'istruzione <code>if</code> è <code>truthy</code> (vera). Se la condizione è <code>falsy</code> (falsa), allora sarà il blocco <code>else</code> ad essere eseguito. </p><p>I valori <code>truthy</code> e <code>falsy</code> vengono convertiti in <code>true</code> (vero) o <code>false</code> (falso) nelle istruzioni <code>if</code>. </p><pre><code class="language-js">if (condizione) {
   // codice eseguito se la condizione è vera
} else {
   // codice eseguito se la condizione è falsa
}
</code></pre><p>Qualunque valore che non è definito <code>falsy</code>, verrà considerato <code>truthy</code> in JavaScript.</p><p>Ecco una lista di valori <code>falsy</code> :</p><ul><li><code>false</code> </li><li><code>0</code> (zero)</li><li><code>-0</code> (zero negativo)</li><li><code>0n</code> (BigInt zero)</li><li><code>""</code>, <code>''</code>, <code>``</code> (stringa vuota)</li><li><code>null</code></li><li><code>undefined</code></li><li><code>NaN</code> (not a number)</li></ul><h2 id="esempi-di-istruzioni-if-else-in-javascript"><strong>Esempi di istruzioni if...else in JavaScript</strong></h2><p>In questo esempio, la condizione nell'istruzione <code>if</code> &nbsp;è <code>true</code>, quindi il messaggio che verrà mostrato nella console sarà "Nick is an adult".</p><pre><code class="language-js">const age = 18;

if (age &gt;= 18) {
  console.log("Nick is an adult.");
} else {
  console.log("Nick is a child.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-3.18.12-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Ma se cambio la variabile <code>age</code> in modo che sia minore di 18, allora la condizione diventerà <code>false</code>, quindi il codice questa volta eseguirà il blocco <code>else</code>.</p><pre><code class="language-js">const age = 12;

if (age &gt;= 18) {
  console.log("Nick is an adult.");
} else {
  console.log("Nick is a child.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-3.17.07-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="esempi-con-varie-condizioni-istruzioni-if-else-if-else-in-javascript"><strong>Esempi con varie condizioni <strong>(</strong>istruzioni <strong>if...else if...else)</strong> in JavaScript </strong></h2><p>A volte potresti voler testare varie condizioni, e in questi casi entra in gioco il blocco <code>else if</code>.</p><pre><code class="language-js">if (condizione 1) {
   // codice eseguito quando condizione 1 è true
} else if (condizione 2) {
  // codice eseguito quando condizione 2 è true
} else {
   // codice eseguito quando nessuna delle condizioni precedenti è true
}
</code></pre><p>Quando la condizione dell'<code>if</code> è <code>false</code>, il computer valuta la condizione dell'<code>else if</code>. &nbsp;Se anche questa risulta <code>false</code>, allora passa al blocco <code>else</code>. </p><p>In questo esempio, il blocco <code>else if</code> sarà quello che verrà eseguito, dato che Alice ha un'età compresa tra 18 e 21 anni. </p><pre><code class="language-js">const age = 18;

if (age &lt; 18) {
  console.log("Alice is under 18 years old.");
} else if (age &gt;= 18 &amp;&amp; age &lt;= 21) {
  console.log("Alice is between the ages of 18 and 21.");
} else {
  console.log("Alice is over 21 years old.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-3.33.33-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="quando-utilizzare-le-istruzioni-switch-invece-che-le-istruzionii-if-else"><strong>Quando utilizzare le istruzioni switch invece che le istruzionii if...else? </strong></h2><p>Ci sono occasioni in JavaScript in cui potresti considerare di utilizzare un'istruzione <a href="https://www.freecodecamp.org/news/javascript-switch-case-js-switch-statement-example/"><code>switch</code></a>, invece di un'istruzione <code>if else</code>. </p><p>Le istruzioni <code>switch</code> &nbsp;hanno una sintassi più pulita, a differenza delle complicate istruzioni <code>if else</code>.</p><p>Dai un'occhiata a questo esempio in basso – invece di utilizzare questa lunga istruzione <code>if else</code>, potresti scegliere di servirti di un'istruzione <code>switch</code> , che è molto più semplice da leggere. </p><pre><code class="language-js">const pet = "dog";

if (pet === "lizard") {
  console.log("I own a lizard");
} else if (pet === "dog") {
  console.log("I own a dog");
} else if (pet === "cat") {
  console.log("I own a cat");
} else if (pet === "snake") {
  console.log("I own a snake");
} else if (pet === "parrot") {
  console.log("I own a parrot");
} else {
  console.log("I don't own a pet");
}
</code></pre><pre><code class="language-js">const pet = "dog";

switch (pet) {
  case "lizard":
    console.log("I own a lizard");
    break;
  case "dog":
    console.log("I own a dog");
    break;
  case "cat":
    console.log("I own a cat");
    break;
  case "snake":
    console.log("I own a snake");
    break;
  case "parrot":
    console.log("I own a parrot");
    break;
  default:
    console.log("I don't own a pet");
    break;
}
</code></pre><p>Le istruzioni <code>switch</code> non sono sempre la scelta più appropriata in tutte le situazioni, ma se pensi delle istruzioni <code>if else</code> siano troppo lunghe e complicate, allora un'istruzione <code>switch</code> potrebbe essere un'opzione alternativa. </p><h2 id="l-operatore-logico-and-e-le-istruzioni-if-else-in-javascript"><strong>L'operatore logico AND (&amp;&amp;) e le istruzioni if...else in JavaScript</strong></h2><p>Con l'operatore logico AND (<code>&amp;&amp;</code>), se entrambe le condizioni sono <code>true</code>, allora verrà eseguito il &nbsp;blocco <code>if</code>. Se una o entrambe le condizioni sono <code>false</code>, allora sarà eseguito il blocco <code>else</code>.</p><p>In questo esempio, dato che l'età è maggiore di 16 e la variabile <code>ownsCar</code> è <code>true</code>, verrà eseguito il blocco <code>if</code>. Il messaggio mostrato dalla console sarà "Jerry is old enough to drive and has his own car." &nbsp;</p><pre><code class="language-js">const age = 17;
const ownsCar = true;

if (age &gt;= 16 &amp;&amp; ownsCar) {
  console.log("Jerry is old enough to drive and has his own car.");
} else {
  console.log("Jerry does not drive.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-4.22.49-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Cambiando la variabile <code>age</code> in modo che sia minore di 16, entrambe le condizioni non sono più <code>true</code> e quindi verrà eseguito il blocco <code>else</code>. </p><pre><code class="language-js">const age = 13;
const ownsCar = true;

if (age &gt;= 16 &amp;&amp; ownsCar) {
  console.log("Jerry is old enough to drive and has his own car.");
} else {
  console.log("Jerry does not drive.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-4.20.19-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="l-operatore-logico-or-e-le-istruzioni-if-else-in-javascript"><strong>L'operatore logico OR (||) e le istruzioni if...else in JavaScript</strong></h2><p>Nel caso dell'operatore logico OR (<code>||</code>), se una o entrambe le condizioni sono <code>true</code>, allora il codice nell'istruzione <code>if</code> sarà eseguito.</p><p>In questo esempio, anche se la variabile <code>isSale</code> è <code>false</code>, il codice nel blocco <code>if</code> verrà eseguito lo stesso, perché almeno la variabile <code>boyfriendIsPaying</code> è <code>true</code>. </p><pre><code class="language-js">const boyfriendIsPaying = true;
const isSale = false;

if (boyfriendIsPaying || isSale) {
  console.log("Jesse will go shopping.");
} else {
  console.log("Jesse will not go shopping.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-4.40.36-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Se cambiassi il valore della variabile <code>boyfriendIsPaying</code> in <code>false</code>, allora il blocco &nbsp;<code>else</code> verrebbe eseguito, perché entrambe le condizioni sarebbero <code>false</code>.</p><pre><code class="language-js">const boyfriendIsPaying = false;
const isSale = false;

if (boyfriendIsPaying || isSale) {
  console.log("Jesse will go shopping.");
} else {
  console.log("Jesse will not go shopping.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-4.42.12-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="l-operatore-logico-not-e-le-istruzioni-if-else-in-javascript"><strong>L'operatore logico NOT (!) e le istruzioni if...else in JavaScript</strong></h2><p>L'operatore logico NOT (<code>!</code>) cambia il valore di qualcosa da <code>true</code> a <code>false</code>, ma può anche fare il contrario, trasformandolo da <code>false</code> a <code>true</code>.</p><p>Possiamo modificare l'esempio precedente utilizzando l'operatore <code>!</code>, per rendere <code>false</code> la variabile <code>boyfriendIsPaying</code>. Dato che entrambe le condizioni adesso sono <code>false</code>, il blocco <code>else</code> verrà eseguito. </p><pre><code class="language-js">const boyfriendIsPaying = true;
const isSale = false;

if (!boyfriendIsPaying || isSale) {
  console.log("Jesse will go shopping.");
} else {
  console.log("Jesse will not go shopping.");
}
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-5.02.04-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><h2 id="l-operatore-condizionale-ternario-in-javascript"><strong>L'operatore condizionale (ternario) in JavaScript</strong></h2><p>Se stai utilizzando un'istruzione <code>if else</code> breve, potresti scegliere di servirti dell'operatore ternario.</p><p>Questa è la sintassi di base dell'operatore ternario: </p><pre><code class="language-js">condizione ? se condizione è true : se condizione è false</code></pre><p>La condizione è posizionata prima del simbolo <code>?</code> e se è <code>true</code>, allora il codice tra il simbolo <code>?</code> ed il simbolo <code>:</code> verrà eseguito. Se la condizione è <code>false</code>, allora sarà il codice dopo il simbolo <code>:</code> ad essere eseguito. </p><p>In questo esempio, dato che l'età è maggiore di 18, il messaggio mostrato dalla console sarà "Can vote".</p><pre><code class="language-js">const age = 32;
const citizen = age &gt;= 18 ? "Can vote" : "Cannot vote";
console.log(citizen);
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-09-at-5.25.14-AM.png" class="kg-image" alt="Image" width="600" height="400" loading="lazy"></figure><p>Questo è invece lo stesso codice, ma scritto usando un'istruzione <code>if else</code>:</p><pre><code class="language-js">const age = 32;
let citizen;

if (age &gt;= 18) {
  citizen = "Can vote";
} else {
  citizen = "Cannot vote";
}

console.log(citizen);
</code></pre><h2 id="in-conclusione">In conclusione </h2><p>Le istruzioni <code>if else</code> eseguono un blocco di codice se la condizione nell'istruzione <code>if</code> è <code>truthy</code>. Se la condizione è <code>falsy</code>, allora sarà il blocco <code>else</code> ad essere eseguito. </p><p>Ci saranno occasioni in cui vorrai testare varie condizioni, e in questi casi potrai utilizzare le istruzioni <code>if...else if...else</code>.</p><p>Se pensi che un'istruzione <code>if else</code> sia lunga e complicata, allora c'è la possibilità di utilizzare un'istruzione <code>switch</code> come alternativa. </p><p>Utilizzare gli operatori logici per testare più di una condizione, può essere un'alternativa alle istruzioni <code>if else</code> annidate l'una nell'altra. </p><p>L'operatore ternario può essere utilizzato come metodo per scrivere un'istruzione <code>if else</code> in modo più sintetico. </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[ 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[ Che Cos'è la Ricorsione? Funzioni Ricorsive in JavaScript Spiegate con Esempi di Codice ]]>
                </title>
                <description>
                    <![CDATA[ La ricorsione è una tecnica usata per risolvere problemi computazionali attraverso una funzione che invoca sé stessa fino a quando il programma ottiene il risultato desiderato. Questo tutorial ti consentirà di imparare cos'è ricorsione e quali sono le differenze rispetto ai più comuni loop. Che cos'è la ricorsione? Prendiamo come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/che-cose-la-ricorsione-funzioni-ricorsive-in-javascript-spiegate-con-esempi-di-codice/</link>
                <guid isPermaLink="false">661b3a1daedb4204c0d38dc6</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Privitera ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2024 08:23:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/04/recursion-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/what-is-recursion-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Recursion? A Recursive Function Explained with JavaScript Code Examples</a>
      </p><p>La ricorsione è una tecnica usata per risolvere problemi computazionali attraverso una funzione che invoca sé stessa fino a quando il programma ottiene il risultato desiderato.</p><p>Questo tutorial ti consentirà di imparare cos'è ricorsione e quali sono le differenze rispetto ai più comuni loop.</p><h2 id="che-cos-la-ricorsione"><strong>Che cos'è la ricorsione?</strong></h2><p>Prendiamo come esempio una funzione che mostra nella console i numeri da 1 a 5. Ecco come possiamo scriverla usando la ricorsione:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function log(num){
    if(num &gt; 5){
        return;
    }
    console.log(num);
    log(num + 1);
}

log(1);</code></pre><figcaption>Esempio di una funzione ricorsiva</figcaption></figure><p>Quando questo codice è eseguito, la funzione <code>log</code> continua a invocare sé stessa fino a quando il valore della variabile <code>num</code> è minore di <code>5</code>.</p><p>Una funzione ricorsiva deve avere almeno una condizione che porti la funzione a smettere di invocarsi. Se la funzione continua a invocarsi, a un certo punto JavaScript darà errore.</p><p>La condizione che consente alla funzione ricorsiva di smettere di invocare sé stessa si chiama <strong>caso base</strong>. Nella funzione <code>log</code> sopra, il caso<em> </em>base e quando <code>num</code> è maggiore di <code>5</code>.</p><h2 id="perch-non-usare-un-ciclo"><strong>Perché non usare un ciclo?</strong></h2><p>Qualsiasi problema che possiamo risolvere con una funzione ricorsiva può sempre essere risolto con una soluzione iterativa. L'esempio precedente può essere sostituito con questo codice:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">for(let i = 1; i &lt;= 5; i++){
    console.log(i);
}</code></pre><figcaption>Un ciclo for come alternativa alla funzione ricorsiva</figcaption></figure><p>I linguaggi di programmazione moderni come JavaScript possiedono istruzioni come <code>for</code> e <code>while</code> che forniscono alternative alle funzioni ricorsive. Tuttavia, esistono linguaggi come Clojure che non includono dichiarazioni di cicli, quindi in questi casi abbiamo bisogno di usare la ricorsione per ripetere parti del codice.</p><p>Inoltre, per usare un ciclo <code>for</code> è necessario sapere quante volte il codice dovrà essere ripetuto. Le funzioni ricorsive e il ciclo <code>while</code> invece possono essere usate per eseguire una parte di codice senza sapere quante volte sarà necessario ripeterlo. L'unica cosa che basta sapere è la condizione che fermerà l'esecuzione del codice.</p><p>Per esempio, immagina di dover risolvere questo problema:</p><ul><li>Scegli un numero a caso tra 1 e 10 fino a quando ottieni 5.</li><li>Registra quante volte il codice è stato eseguito prima di ottenere 5.</li></ul><p>Ecco la soluzione usando una funzione ricorsiva:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
    result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
    count++;
    randomUntilFive(result, count);
}

randomUntilFive();</code></pre><figcaption>Funzione ricorsiva che sceglie casualmente un numero fino a quando il risultato è 5</figcaption></figure><p>Non è possible sostituire il codice qui sopra con un ciclo <code>for</code>, ma è possibile farlo con un ciclo <code>while</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let result = 0;
let count = 0;

while (result !== 5) {
  result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
  count++;
}

console.log(`Il risultato casuale: ${result}`);
console.log(`Numero di esecuzioni del codice: ${count}`);</code></pre><figcaption>Alterativa alla funzione ricorsiva con un ciclo while</figcaption></figure><p>Ad esclusione dei colloqui di lavoro in cui ti può essere chiesto di risolvere un problema usando la ricorsione, puoi sempre trovare una soluzione alternativa che usa i cicli <code>for</code> o <code>while</code>.</p><h2 id="come-leggere-una-funzione-ricorsiva"><strong>Come leggere una funzione ricorsiva</strong></h2><p>Una funzione ricorsiva non è facile o intuitiva da capire a prima vista. I seguenti punti ti aiuteranno a leggere e capire una funzione ricorsiva velocemente.</p><ol><li>Prima di tutto, identifica sempre qual è il <strong>caso base</strong><em>;</em></li><li>Passa argomenti nella funzione che raggiungono immediatamente il caso base;</li><li>Includi argomenti che consentiranno almeno una iterazione della funzione ricorsiva.</li></ol><p>Proviamo a seguire questi passaggi usando l'esempio precedente di <code>randomUntilFive()</code>. Puoi identificare il caso base per questa funzione all'interno dell'istruzione <code>if</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        // il caso base è attivato
    }
    // la funzione è invocata ricorsivamente
}

randomUntilFive();</code></pre><figcaption>Identificare il caso base della funzione</figcaption></figure><p>Questo significa che puoi raggiungere il caso base passando il numero <code>5</code> nel parametro <code>result</code> come segue:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
}

randomUntilFive(5);</code></pre><figcaption>Raggiungere il caso base di una funzione ricorsiva</figcaption></figure><p>Il parametro <code>count</code> non dovrebbe essere zero. Tuttavia, se passiamo il numero <code>5</code> come argomento della funzione sopra allora soddisfiamo il requisito del punto 2.</p><p>Infine, dobbiamo trovare un argomento che ci consenta di eseguire la funzione ricorsiva una volta. Nel caso qui sopra, possiamo passare qualsiasi numero tranne <code>5</code>, oppure possiamo anche non passare alcun argomento:</p><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
    result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
    count++;
    randomUntilFive(result, count);
}

randomUntilFive(4); 
// qualsiasi numero diverso da 5
// eseguirà la ricorsione</code></pre><p>Ecco fatto. Ora abbiamo capito che la funzione <code>randomUntilFive()</code> invocherà sé stessa ricorsivamente fino a quando il valore di <code>result</code> non sarà <code>5</code>.</p><h2 id="come-scrivere-una-funzione-ricorsiva"><strong>Come scrivere una funzione ricorsiva</strong></h2><p>Scrivere una funzione ricorsiva non è molto diverso da leggerne una.</p><ol><li>Crea una funzione regolare con un caso base che può essere raggiunto con i suoi parametri;</li><li>Passa argomenti nella funzione che attivano immediatamente il caso base;</li><li>Passa argomenti che attivano la ricorsione una volta sola.</li></ol><p>Prendiamo l'esempio di una funzione per il calcolo di <a href="https://it.wikipedia.org/wiki/Fattoriale">fattoriali</a>. Ecco il fattoriale di cinque:</p><p><strong><strong>5*4*3*2*1 = 120</strong></strong></p><p>Il caso base di questa funzione è uno, quindi creiamo una funzione <code>factorial</code> che restituisce uno:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function factorial(num){
    if(num === 1){
        return num;
    }
    
}

console.log(factorial(1));</code></pre><figcaption>Il caso base per la funzione <code>factorial</code></figcaption></figure><p>Ora, andiamo al passo 3. Abbiamo bisogno di raggiungere la chiamata ricorsiva nella funzione e invocarla almeno una volta. Visto che il calcolo fattoriale diminuisce il numero di uno ad ogni moltiplicazione, possiamo simulare questo caso passando l'argomento <code>num-1</code> nella chiamata ricorsiva:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function factorial(num){
    if(num === 1){
        return num;
    }
    return num * factorial(num-1) 
}

console.log(factorial(2));</code></pre><figcaption>La ricorsione di <code>factorial</code></figcaption></figure><p>Abbiamo finito. Puoi testare la funzione passando 5 come argomento:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">console.log(factorial(5));</code></pre><figcaption>Test della funzione <code>factorial</code></figcaption></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Abbiamo imparato che cos'è una funzione ricorsiva e quali sono le differenze tra questo tipo di funzione e le comuni istruzioni di ciclo <code>for</code> e <code>while</code>. Una funzione ricorsiva deve sempre avere almeno un caso base affinché eviti di invocare sé stessa all'infinito. In caso contrario, la funzione darà un errore.</p><p>Quando leggiamo una funzione ricorsiva, dobbiamo simulare una situazione dove il caso base è eseguito immediatamente senza eseguire la chiamata ricorsiva.</p><p>Quando abbiamo trovato il caso base, facciamo un passo indietro e proviamo a eseguire la chiamata ricorsiva almeno una volta. In questo modo, la tua mente percorrerà il codice ricorsivo e capirà intuitivamente come funziona.</p><p>Lo stesso vale per quando dobbiamo scrivere una funzione ricorsiva. È bene pensare sempre al caso base all'inizio, e poi includere un argomento nella funzione che faccia eseguire la chiamata ricorsiva almeno una volta. Dopo aver fatto questo, tutto il resto sarà facile.</p><h2 id="grazie-per-aver-letto-questo-tutorial"><strong>Grazie per aver letto questo tutorial</strong></h2><p>Se questo articolo ti è piaciuto e vuoi migliorare le tue abilità in JavaScript, ti consiglio di leggere il mio nuovo libro <em><em>Beginning Modern JavaScript</em></em> <a href="https://www.amazon.com/dp/B0CQXHMF8G">qui</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2024/01/beginning-js-cover.png" class="kg-image" alt="beginning-js-cover" width="600" height="400" loading="lazy"></figure><p>Questo libro è pensato per essere facile da capire e accessibile per chiunque voglia imparare JavaScript. Le sue semplici guide passo-passo ti aiuteranno a capire come usare JavaScript per creare un'applicazione dinamica.</p><p>Ti prometto che <em>capirai davvero cosa stai facendo con JavaScript.</em></p><p>Alla prossima!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Imparare JavaScript per Principianti – Il Manuale delle Basi di JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ L'obiettivo di questo manuale è di introdurti rapidamente alle basi di JavaScript in modo che tu possa iniziare a programmare applicazioni. Invece di coprire tutte le teorie e i concetti di JavaScript, ti insegnerò solo gli elementi costitutivi più importanti del linguaggio. Tratteremo cose come variabili, tipi di dato, funzioni, ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/imparare-javascript-per-principianti-il-manuale-delle-basi-di-javascript/</link>
                <guid isPermaLink="false">64aadb5caedaa5069ba9716c</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Tue, 25 Jul 2023 09:09:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/07/book-cover.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/learn-javascript-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn JavaScript for Beginners – JS Basics Handbook</a>
      </p><p>L'obiettivo di questo manuale è di introdurti rapidamente alle basi di JavaScript in modo che tu possa iniziare a programmare applicazioni.</p><p>Invece di coprire tutte le teorie e i concetti di JavaScript, ti insegnerò solo gli elementi costitutivi più importanti del linguaggio. Tratteremo cose come variabili, tipi di dato, funzioni, oggetti, e array. Imparerai anche come combinarli tra loro per creare un programma, piccolo ma solido.</p><p>Tralasceremo anche HTML, CSS e l'utilizzo di JavaScript nel browser. Questo tutorial si concentra solo su JavaScript come linguaggio di programmazione e utilizza il terminale per eseguire il codice.</p><p>Questo tutorial ha anche degli esercizi alla fine di alcuni capitoli che ti danno il tempo di mettere in pratica ciò che hai imparato e "assorbire" i nuovi concetti.</p><p>Questo manuale è completamente gratuito proprio qui in questa pagina web. Se desideri <a href="https://codewithnathan.com/js-course">la versione PDF ed EPUB di questo tutorial</a> (in lingua inglese - n.d.t.), puoi pagare una piccola somma. Contribuirai a supportarmi nella creazione di un tutorial JavaScript approfondito che ti aiuterà a creare un'applicazione web completa.</p><h2 id="sommario"><strong>Sommario</strong></h2><!--kg-card-begin: markdown--><ul>
<li><a href="#1-introduzione-a-javascript">1 - Introduzione a Javascript</a>
<ul>
<li><a href="#1-1-perche-imparare-javascript">1.1 - Perché imparare Javascript?</a></li>
<li><a href="#1-2-javascript-vs-java">1.2 - Javascript vs. Java</a></li>
</ul>
</li>
<li><a href="#2-come-preparare-il-tuo-computer">2 - Come preparare il tuo computer</a>
<ul>
<li><a href="#2-1-come-installare-vscode">2.1 - Come installare VSCode</a></li>
<li><a href="#2-2-come-installare-node-js">2.2 - Come installare Node.js</a></li>
</ul>
</li>
<li><a href="#3-breve-introduzione-alla-console">3 - Breve introduzione alla console</a></li>
<li><a href="#4-e-ora-di-dire-hello-world">4 - È ora di dire Hello World!</a></li>
<li><a href="#5-struttura-del-codice">5 - Struttura del codice</a>
<ul>
<li><a href="#5-1-istruzioni">5.1 - Istruzioni</a></li>
<li><a href="#5-2-commenti">5.2 - Commenti</a></li>
<li><a href="#5-3-flusso-di-esecuzione">5.3 - Flusso di esecuzione</a></li>
<li><a href="#5-4-esercizio-nr-1">5-4 - Esercizio nr. 1</a></li>
</ul>
</li>
<li><a href="#6-variabili">6 - Variabili</a>
<ul>
<li><a href="#6-1-denominazione">6.1 - Denominazione</a></li>
<li><a href="#6-2-il-tipo-di-variabile-const">6.2 - Il tipo di variabile const</a></li>
<li><a href="#6-3-il-tipo-di-variabile-var">6.3 - Il tipo di variabile var</a></li>
<li><a href="#6-4-esercizio-nr-2">6.4 - Esercizio nr. 2</a></li>
</ul>
</li>
<li><a href="#7-tipi-di-dato-base">7 - Tipi di dato base</a>
<ul>
<li><a href="#7-1-stringhe">7.1 - Stringhe</a></li>
<li><a href="#7-2-numeri-interi-e-con-virgola-mobile">7.2 - Numeri (interi e con virgola mobile)</a></li>
<li><a href="#7-3-booleani">7.3 - Booleani</a></li>
<li><a href="#7-4-undefined">7.4 - undefined</a></li>
<li><a href="#7-5-null">7.5 - null</a></li>
</ul>
</li>
<li><a href="#8-conversione-di-tipo-e-coercizione-di-tipo">8 - Conversione di tipo e coercizione di tipo </a>
<ul>
<li><a href="#8-1-coercizione-di-tipo">8.1 - Coercizione di tipo</a>
<ul>
<li><a href="#8-1-1-regole-della-coercizione-di-tipo">8.1.1 - Regole della coercizione di tipo</a></li>
<li><a href="#8-1-2-perche-dovresti-evitare-la-coercizione-di-tipo">8.1.2 - Perchè dovresti evitare la coercizione di tipo</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#9-operatori">9 - Operatori </a>
<ul>
<li><a href="#9-1-operatori-aritmetici">9.1 - Operatori aritmetici</a></li>
<li><a href="#9-2-operatori-di-assegnazione">9.2 - Operatori di assegnazione</a></li>
<li><a href="#9-3-operatori-di-confronto">9.3 - Operatori di confronto</a></li>
<li><a href="#9-4-operatori-logici">9.4 - Operatori logici</a></li>
<li><a href="#9-5-operatore-typeof">9.5 - Operatore typeof</a></li>
<li><a href="#9-6-esercizio-nr-3">9.6 - Esercizio nr. 3</a></li>
</ul>
</li>
<li><a href="#10-array">10 - Array </a>
<ul>
<li><a href="#10-1-posizione-dell-indice">10.1 - Posizione dell'indice</a></li>
<li><a href="#10-2-metodi-speciali-di-manipolazione">10.2 - Metodi speciali di manipolazione</a></li>
<li><a href="#10-3-esercizio-nr-4">10.3 - Esercizio nr. 4</a></li>
</ul>
</li>
<li><a href="#11-flussi-di-controllo-condizionali">11 - Flussi di controllo (condizionali) </a>
<ul>
<li><a href="#11-1-istruzione-if-else">11.1 - Istruzione if...else</a></li>
<li><a href="#11-2-istruzione-switch-case">11.2 - Istruzione switch...case</a></li>
<li><a href="#11-3-corpo-dell-istruzione-switch-case">11.3 - Corpo dell'istruzione switch...case</a></li>
<li><a href="#11-4-casi-d-uso-dell-istruzione-switch-case">11.4 - Casi d'uso dell'istruzione switch...case</a></li>
<li><a href="#11-5-esercizio-nr-5">11.5 - Esercizio nr. 5</a></li>
</ul>
</li>
<li><a href="#12-flussi-di-controllo-cicli">12 - Flussi di controllo (cicli) </a>
<ul>
<li><a href="#12-1-istruzione-for">12.1 - Istruzione for</a></li>
<li><a href="#12-2-quando-usare-un-ciclo-for">12.2 - Quando usare un ciclo for</a></li>
<li><a href="#12-3-istruzione-while">12.3 - Istruzione while</a></li>
<li><a href="#12-4-quando-usare-un-ciclo-while">12.4 - Quando usare un ciclo while</a></li>
<li><a href="#12-5-esercizio-nr-6">12.5 - Esercizio nr. 6</a></li>
</ul>
</li>
<li><a href="#13-funzioni">13 - Funzioni</a>
<ul>
<li><a href="#13-1-come-creare-la-tua-funzione">13.1 - Come creare la tua funzione</a></li>
<li><a href="#13-2-parametri-e-argomenti-della-funzione">13.2 - Parametri e argomenti della funzione</a></li>
<li><a href="#13-3-parametri-predefiniti">13.3 - Parametri predefiniti</a></li>
<li><a href="#13-4-parametri-predefiniti-e-null">13.4 - Parametri predefiniti e null</a></li>
<li><a href="#13-5-istruzione-return">13.5 - Istruzione return</a></li>
<li><a href="#13-6-ambito-di-una-variabile">13.6 - Ambito di una variabile</a></li>
<li><a href="#13-7-parametro-rest">13.7 - Parametro rest</a></li>
<li><a href="#13-8-funzione-freccia">13.8 - Funzione freccia</a></li>
<li><a href="#13-9-funzioni-freccia-su-singola-riga-o-pi%C3%B9-righe">13.9 - Funzioni freccia su singola riga o più righe</a></li>
<li><a href="#13-10-funzione-freccia-senza-parentesi-tonde">13.10 - Funzione freccia senza parentesi tonde</a></li>
<li><a href="#13-11-la-funzione-freccia-non-ha-associazione-con-arguments">13.11 - La funzione freccia non ha associazione con arguments</a></li>
<li><a href="#13-12-convertire-facilmente-una-funzione-normale-in-funzione-freccia">13.12 - Convertire facilmente una funzione normale in funzione freccia</a></li>
<li><a href="#13-13-esercizio-nr-7">13.13 - Esercizio nr. 7</a></li>
</ul>
</li>
<li><a href="#14-oggetti">14 - Oggetti</a>
<ul>
<li><a href="#14-1-accedere-ai-valori">14.1 - Accedere ai valori</a></li>
<li><a href="#14-2-aggiungere-una-nuova-proprieta">14.2 - Aggiungere una nuova proprietà</a></li>
<li><a href="#14-3-modificare-una-proprieta">14.3 - Modificare una proprietà</a></li>
<li><a href="#14-4-eliminare-una-proprieta">14.4 - Eliminare una proprietà</a></li>
<li><a href="#14-5-verificare-se-esiste-una-proprieta">14.5 - Verificare se esiste una proprietà</a></li>
<li><a href="#14-6-esercizio-nr-8">14.6 - Esercizio nr. 8</a></li>
</ul>
</li>
<li><a href="#15-esercizio-finale-sviluppare-un-registratore-di-cassa">15 - Esercizio finale: sviluppare un registratore di cassa</a></li>
<li><a href="#16-conclusione">16 - Conclusione</a></li>
<li><a href="#17-soluzioni">17 - Soluzioni</a></li>
</ul>
<!--kg-card-end: markdown--><h2 id="1-introduzione-a-javascript"><strong>1 - Introduzione a Javascript</strong></h2><p>JavaScript è stato creato intorno all'aprile 1995 da Brendan Eich. A quel tempo, stava lavorando allo sviluppo di un browser per un'azienda chiamata Netscape. Gli fu detto che aveva solo 10 giorni per progettare e codificare un prototipo funzionante di un linguaggio di programmazione che potesse essere eseguito nel browser.</p><p>Aveva bisogno di creare un linguaggio che piacesse ai programmatori non professionisti, come Microsoft Visual Basic.</p><p>Il motivo per cui gli furono concessi solo 10 giorni era che Netscape aveva bisogno di rilasciare il suo browser, che all'epoca era in competizione con Microsoft.</p><p>All'inizio, JavaScript non era così potente come lo è oggi, poiché originariamente era stato progettato per aggiungere interazione e animazione alle pagine web. È stato dal 2005, quando sono stati rilasciati jQuery e AJAX, che JavaScript ha iniziato a essere utilizzato in ogni sito web.</p><p>Semplicemente non esisteva una facile alternativa a jQuery e AJAX per la manipolazione del DOM e l'invio di richieste asincrone. Inoltre, un'attiva comunità di sviluppatori JavaScript ha continuato ad aggiungere nuove funzionalità alla libreria.</p><p>Poi Google ha lanciato il suo moderno browser Chrome e Facebook ha iniziato a portare più persone online. JavaScript ha iniziato a crescere per soddisfare le ambizioni di queste gigantesche società di Internet.</p><p>I browser hanno iniziato a sviluppare API che potevi usare in JavaScript per recuperare informazioni come indirizzi IP e posizioni geografiche dal browser, fornendo maggiori risorse alle società Internet per localizzare le funzionalità dei loro siti web.</p><p>Poi è avvenuta un'altra innovazione che ha reso JavaScript ancora più potente.</p><p>Un ambiente lato server chiamato Node.js fu rilasciato nel 2009, consentendo l'esecuzione di JavaScript lato server come PHP, Java, Python, Ruby e molti altri linguaggi. Ha inoltre consentito ai programmatori di sviluppare applicazioni web full-stack utilizzando solo JavaScript.</p><p>Oggi, JavaScript è un linguaggio che può alimentare le applicazioni Web, desktop e mobili.</p><p>Ecco una citazione da Tim O'Reilly, il fondatore di O'Reilly Media:</p><blockquote><em>Imparare JavaScript significava voler dire che non eri uno sviluppatore serio. Oggi non imparare JavaScript significa la stessa cosa<em>.</em></em></blockquote><p>Imparare JavaScript è ora fondamentale per chi voglia diventare uno sviluppatore web.</p><!--kg-card-begin: markdown--><p><a name="1-1-perche-imparare-javascript"></a></p>
<h3 id="11perchimpararejavascript">1.1 - Perché imparare JavaScript?</h3>
<!--kg-card-end: markdown--><p>Ci sono 4 buone ragioni per le quali hai bisogno di imparare e comprendere a fondo JavaScript:</p><ol><li>JavaScript è il solo linguaggio che funziona all'interno del browser</li><li>È abbastanza facile da imparare (ma difficile da padroneggiare)</li><li>È un linguaggio essenziale per sviluppare applicazioni web</li><li>Ci sono parecchie opportunità di carriera per gli sviluppatori JavaScript</li></ol><p>Imparare JavaScript apre grandi opportunità laddove potrai essere uno sviluppatore frontend, backend, o per piattaforme mobili.</p><p>Praticamente, imparare JavaScript apre la porta ad avanzamenti di carriera in campo informatico.</p><h3 id="1-2-javascript-vs-java"><strong>1.2 - JavaScript vs Java</strong></h3><p>All'inizio, JavaScript era in realtà chiamato LiveScript. È stato rinominato in JavaScript perché Java era un linguaggio di programmazione molto popolare.</p><p>Poiché la maggior parte degli sviluppatori di software aveva già familiarità con Java, si pensava che il nome JavaScript aiutasse a commercializzare JavaScript come un ottimo linguaggio di programmazione e attirasse l'interesse degli sviluppatori in quel momento.</p><p>Giusto per essere chiari, JavaScript e Java sono due linguaggi di programmazione completamente diversi. Non è necessario conoscere Java per imparare JavaScript (o viceversa). :)</p><h2 id="2-come-preparare-il-tuo-computer"><strong>2 - Come preparare il tuo computer</strong></h2><p>Per scrivere un programma usando JavaScript, devi installare 2 strumenti gratuiti che sono disponibili su tutti i sistemi operativi.</p><p>Il primo strumento da installare è Visual Studio Code</p><h3 id="2-1-come-installare-vscode"><strong>2.1 - Come installare VSCode</strong></h3><p><a href="https://code.visualstudio.com/download">Visual Studio Code</a> o VSCode in breve, è un programma di editor testi creato allo scopo di scrivere del codice. Oltre a essere gratuito, VSCode è open source e disponibile su tutti i maggiori sistemi operativi.</p><p>Puoi usare VSCode su Windows, macOS e Linux, quindi se non hai un editor testi nel tuo computer adatto per la programmazione, consiglio di installare VSCode.</p><p>Ora che hai un editor testi per scrivere codice JavaScript, ti serve un software per eseguire il codice. Andremo a installare Node.js.</p><h3 id="2-2-come-installare-node-js"><strong>2.2 - Come installare Node.js</strong></h3><p>Per eseguire JavaScript al di fuori del browser, devi installare Node.js, che è essenzialmente un esecutore di codice JavaScript.</p><p>Vai semplicemente al sito di <a href="https://nodejs.org/en/download">Node.js</a> &nbsp;e scarica l'ultima versione di tipo LTS (supporto di lunga durata) adatta al tuo computer. Una volta scaricato, installalo nel tuo sistema.</p><p>Devi eseguire Node.js usando la console, quindi apri il tuo prompt dei comandi (windows) o il tuo terminale (macOS/Linux) ed esegui il seguente comando:</p><pre><code class="language-sh">node -v
</code></pre><p>Questo comando stamperà nella console la versione del tuo Node.js appena installato.</p><h2 id="3-breve-introduzione-alla-console"><strong>3 - Breve introduzione alla console</strong></h2><p>La console è un'interfaccia basata su testo che puoi utilizzare per digitare ed eseguire comandi sul tuo computer. Su Windows, si chiama Prompt dei Comandi. Su macOS e Linux è nota come Terminale.</p><p>Non utilizzerai tutti i comandi disponibili all'interno della console. In effetti, devi solo conoscere 7 comandi di base che ti consentono di eseguire il codice JavaScript.</p><p>Innanzitutto, apri il programma della console sul tuo computer e, per i sistemi Linux e macOs digita il comando pwd:</p><pre><code class="language-sh">pwd
</code></pre><p>Questo è il comando che usi per trovare in quale directory il tuo terminale si trova attualmente. &nbsp;<code>pwd</code> sta per "print working directory" (stampa directory di lavoro).</p><p>Su Windows il comando da utilizzare per trovare la directory di lavoro è cd:</p><pre><code class="language-dos">cd</code></pre><p>Per cambiare la directory di lavoro devi digitare il comando <code>cd</code> seguito dal percorso della directory.</p><p>Ecco un esempio per spostarsi su una directory figlia (scendere di un livello):</p><pre><code class="language-sh">cd nome_directory/nome_sotto_directory
</code></pre><p>Per spostarsi alla directory genitore, (risalire di un livello) aggiungi &nbsp;<code>..</code> al comando <code>cd</code>:</p><pre><code class="language-sh">cd ..
</code></pre><p>Per risalire più di un livello di directory usa &nbsp;<code>../..</code></p><p>Per pulire la tua console dai comandi e dai risultati degli stessi, per i sistemi Linux e macOs usa il comando <code>clear</code>:</p><pre><code class="language-sh">clear
</code></pre><p>Per il Prompt dei Comandi di Windows digita il comando <code>cls</code>:</p><pre><code class="language-dos">cls
</code></pre><p>Per stampare l'elenco di file e directory nella directory corrente, per i sistemi Linux e macOs esegui il comando <code>ls</code>:</p><pre><code class="language-sh">ls
</code></pre><p>Per il Prompt dei Comandi di Windows digita <code>dir</code>:</p><pre><code class="language-dos">dir
</code></pre><p>Per creare un nuovo file, per Linux e macOS usa il comando <code>touch</code> seguito dal nome del file e dall'estensione:</p><pre><code class="language-sh">touch index.js
</code></pre><p>per il Prompt dei Comandi di Windows usa il comando <code>type</code> in questo modo:</p><pre><code class="language-dos">type nul &gt; index.js
</code></pre><p>I comandi qui sopra creano un nuovo file JavaScript vuoto chiamato <code>index.js</code> nella tua directory di lavoro corrente.</p><p>Per creare una nuova directory, per i sistemi Linux e macOs usa il comando <code>mkdir</code> seguito dal nome della directory:</p><pre><code class="language-sh">mkdir mio_progetto
</code></pre><p>Per il Prompt dei Comandi di Windows digita il comando <code>md</code> seguito dal nome della directory:</p><pre><code class="language-dos">md mio_progetto
</code></pre><p>Per eseguire JavaScript usando Node.js, digita <code>node</code> seguito dal nome del file, in questo modo:</p><pre><code class="language-sh">node index.js
</code></pre><p>Vedrai un eventuale risultato dell'elaborazione del codice nella stessa console.</p><p>Ci sono molte cose che puoi fare con la console ma per eseguire solo codice JavaScript questi 7 comandi dovrebbero essere sufficienti .</p><p>Andiamo ora a eseguire il tuo primo programma JavaScript!</p><!--kg-card-begin: markdown--><p><a name="4-e-ora-di-dire-hello-world"></a></p>
<h2 id="4oradidirehelloworld">4 - È ora di dire Hello World!</h2>
<!--kg-card-end: markdown--><p>È ora di eseguire il tuo primo programma JavaScript usando Node.</p><p>Dalla console, crea un nuovo file JavaScript chiamato <code>index.js</code>.</p><pre><code class="language-sh"># Per sistemi Linux e MacOs
touch index.js
</code></pre><pre><code class="language-dos">rem Per sistemi Windows
type &gt; nul index.js
</code></pre><p>Poi apri il file usando VSCode (<code>code index.js</code> ) e inserisci al suo interno la seguente riga di codice:</p><pre><code class="language-js">console.log("Hello World!");
</code></pre><p>Ritorna alla console, ed esegui questo script con Node:</p><pre><code class="language-sh">node index.js
</code></pre><p>Nella console dovrebbe essere eseguito il file <code>index.js</code>, che stamperà "Hello World!".</p><p>Hai appena eseguito il tuo primo programma JavaScript usando Node.js. Eccellente!</p><p>Quando esegui il comando <code>node index.js</code> il programma Node.js inizia a leggere lo script riga per riga, dall'inizio alla fine.</p><p>Il programma <code>node</code> vede che hai scritto <code>console.log</code> seguito da parentesi <code>()</code>, quindi sa che gli stai chiedendo di stampare qualcosa. Il programma quindi legge ciò che hai inserito tra parentesi e lo stampa sulla console.</p><p>Nel tuo VSCode o in un altro programma di editor di testo, dovresti vedere diverse parti del tuo codice evidenziate con colori diversi. Questa è una funzionalità dell'editor di testo chiamata <em>colorazione della sintassi</em> ed è davvero utile per aiutarti a distinguere le diverse parti del codice.</p><p>La parola <code>log</code> è una funzione, quindi viene presentata in un colore, mentre le parole tra parentesi hanno un altro colore.</p><p>Una funzione è semplicemente un pezzo di codice utilizzato per eseguire un determinato compito. La funzione <code>log()</code> viene utilizzata per "stampare" qualsiasi cosa tu inserisca tra parentesi.</p><p>D'altra parte, la parola chiave <code>console</code> è un oggetto, ovvero una entità autonoma che dà accesso a determinate funzionalità.</p><p>Impareremo di più su funzioni e oggetti in seguito. Per ora, ricorda solo che l'istruzione <code>console.log()</code> viene utilizzata per stampare cose sulla console.</p><p>Successivamente, inizieremo con l'apprendimento della struttura del codice JavaScript.</p><h2 id="5-struttura-del-codice"><strong>5 - Struttura del codice</strong></h2><p>Un programma per computer è costituito da una serie di pezzi di codice scritti in un file di testo. Questi file di testo vengono quindi eseguiti tramite un software progettato appositamente per l'esecuzione del codice. Il software Node.js che hai scaricato in precedenza è lo strumento che elabora il codice JavaScript.</p><p>Prima di proseguire, cerchiamo di capire la struttura del codice.</p><h3 id="5-1-istruzioni"><strong>5.1 - Istruzioni</strong></h3><p>Un'istruzione è un singolo comando che il computer deve eseguire. Pensala come una frase, ma per i computer. Possiamo terminare un'istruzione utilizzando un punto e virgola <code>;</code> proprio come possiamo terminare una frase usando un punto <code>.</code></p><p>Puoi scrivere più istruzioni in una singola riga, ma la convenzione è di scrivere un'istruzione per riga:</p><pre><code class="language-js">// Questo è difficile da leggere
console.log("Hello World!"); console.log("Sto imparando JavaScript");

// Adesso è meglio
console.log("Hello World!");
console.log("Sto imparando JavaScript");
</code></pre><p>Ogni istruzione è l'espressione di un'azione che deve essere eseguita dal software che esegue il codice.</p><h3 id="5-2-commenti"><strong>5.2 - Commenti</strong></h3><p>In programmazione, i commenti sono testi che usiamo per comunicare il contesto del codice scritto nel file.</p><p>Per scrivere un commento in JavaScript, devi aggiungere due barre <code>//</code> prima del testo del commento, come mostrato di seguito:</p><pre><code class="language-js">// Questo è un commento
// Anche questo è un commento

// Qui sotto si stampano due righe di istruzioni
console.log("Hello World!");
console.log("Sto imparando JavaScript");
</code></pre><p>I commenti vengono ignorati dall'elaboratore del linguaggio, pertanto è possibile utilizzare i commenti per disabilitare parte del codice senza doverlo eliminare.</p><p>Il codice seguente mostra come disabilitare la seconda istruzione di stampa:</p><pre><code class="language-js">console.log("Hello World!");
// console.log("Sto imparando JavaScript");
</code></pre><h3 id="5-3-flusso-di-esecuzione"><strong>5.3 - Flusso di esecuzione</strong></h3><p>Un elaboratore di linguaggio come Node.js esegue le istruzioni con un approccio dall'alto verso il basso. L'istruzione scritta nella prima riga verrà eseguita prima di quella della seconda riga, quindi proseguirà fino all'ultima riga:</p><pre><code class="language-js">console.log("Hello World!");
console.log("Sto imparando JavaScript");

// Stampa di numeri
console.log(1);
console.log(2);
console.log(3);
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">Hello World!
Sto imparando JavaScript
1
2
3
</code></pre><p>Se vuoi stampare i numeri prima del testo, devi spostare le corrispondenti righe con le istruzioni &nbsp;<code>console.log()</code> all'inizio.</p><h3 id="5-4-esercizio-nr-1"><strong>5.4 - Esercizio nr. 1</strong></h3><p>Cerca di stampare il tuo nome, età, occupazione sulla console.</p><p>Il risultato dovrebbe assomigliare a questo:</p><pre><code class="language-txt">Mario Rossi
19
Studente
</code></pre><p>Ora che hai appreso la struttura base del codice di JavaScript continuiamo imparando le variabili.</p><h2 id="6-variabili"><strong>6 - Variabili</strong></h2><p>Prima di spiegare cos'è una variabile, modifica il codice che hai scritto nel file <code>index.js</code> come segue:</p><pre><code class="language-js">let message = "Hello World!"
console.log(message)
</code></pre><p>Quindi esegui il codice utilizzando il comando <code>node index.js</code>. Vedrai lo stesso risultato di quando hai scritto il messaggio "Hello World!" direttamente all'interno della funzione <code>console.log()</code>. Come può essere?</p><p>Questo perché &nbsp;<code>message</code> scritto nel codice sopra è una <em>variabile</em>.</p><p>Nella programmazione, una variabile è semplicemente un nome che dai a un valore in modo che tu possa accedere a quel valore in un secondo momento. Puoi pensare a una variabile come a un'etichetta che può essere associata a un determinato valore, quindi puoi fare riferimento al valore usando l'etichetta.</p><p>Per dichiarare una variabile, devi digitare la parola chiave <code>let</code> seguita dal nome della variabile.</p><p>La prima riga del codice indica a JavaScript di associare la variabile <code>message</code> al valore "Hello World!":</p><pre><code class="language-js">let message = "Hello World!"
</code></pre><p>Nella seconda riga, viene indicato a JavaScript di stampare il valore di <code>message</code>, ed è esattamente quello che fa.</p><p>Puoi modificare il valore della tua variabile assegnandole un altro valore come segue:</p><pre><code class="language-js">message = "Hello World!"
print(message)
message = "Bel tempo oggi!"
print(message)
</code></pre><p>Esegui il file e vedrai due righe stampate come risultato:</p><pre><code class="language-txt">Hello World!
Bel tempo oggi!
</code></pre><p>Le variabili vengono utilizzate per fare riferimento ai dati in modo da poter utilizzare gli stessi dati più volte nel programma.</p><p>Successivamente, vedremo alcune regole per la denominazione delle variabili.</p><h3 id="6-1-denominazione"><strong>6.1 - Denominazione</strong></h3><p>JavaScript ha alcune regole di denominazione che devi conoscere per evitare errori di denominazione.</p><p>I nomi delle variabili possono contenere solo lettere dell'alfabeto, numeri e trattini bassi (<code>_</code>). Ciò significa che puoi denominare la tua variabile <code>message</code>,<code> message_1</code>, <code>message_2</code>.</p><p>Il primo carattere del nome della variabile non deve essere un numero. <code>message_1</code> va bene. <code>1_message</code> no.</p><p>Non puoi utilizzare parole chiave riservate come <code>console</code> perché vengono utilizzate da JavaScript per eseguire determinate operazioni. Ci sono molte altre parole chiave usate da JavaScript che imparerai nei seguenti capitoli come <code>if</code>, <code>for</code> e <code>while</code>.</p><p>I nomi delle variabili fanno distinzione tra maiuscole e minuscole, il che significa che <code>Message</code>, <code>MESSAGE</code> e <code>message</code> possono essere utilizzati per creare tre diverse variabili. Ma ovviamente, non consiglio di usare nomi simili in quanto crea confusione.</p><p>A volte è necessaria più di una parola per dichiarare il nome di una variabile. JavaScript ha due convenzioni di denominazione utilizzate da tutti gli sviluppatori:</p><ol><li><code>camelCase</code></li><li><code>snake_case</code></li></ol><p><em>Il camel case</em> è una convenzione di denominazione che usa la lettera maiuscola per il primo carattere della parola successiva. Ecco un esempio:</p><pre><code class="language-js">let laMiaStupendaVariabile
</code></pre><p>La convenzione di denominazione <em>snake case</em> usa un trattino basso per separare le parole. Ecco un esempio:</p><pre><code class="language-js">let la_mia_stupenda_variabile
</code></pre><p>Entrambe sono convenzioni di denominazione accettabili, ma dovresti adottarne solo una nel tuo codice per evitare confusione.</p><h3 id="6-2-il-tipo-di-variabile-const"><strong>6.2 - Il tipo di variabile <code>const</code></strong></h3><p>Ci sono situazioni nelle quali è necessario memorizzare un valore che non cambia mai in una variabile.</p><p>Il tipo di variabile <code>const</code> è una variabile che non cambia il suo valore finché il programma è in esecuzione. L'eventuale successiva modifica del valore di una costante produrrà un errore.</p><p>In JavaScript, una variabile costante viene dichiarata utilizzando la parola chiave <code>const</code>.</p><p>Quanto segue mostra come dichiarare 2 costanti in JavaScript:</p><pre><code class="language-js">const FILE_SIZE_LIMIT = 2000
const MAX_SPEED = 300
</code></pre><p>La convenzione di denominazione per una costante consiste nell'usare tutte lettere maiuscole, sebbene si possano anche utilizzare lettere minuscole. Il maiuscolo è solo uno standard per far risaltare maggiormente le costanti.</p><!--kg-card-begin: markdown--><p><a name="6-3-il-tipo-di-variabile-var"></a></p>
<h3 id="63iltipodivariabilevar">6.3 - Il tipo di variabile <code>var</code></h3>
<!--kg-card-end: markdown--><p>La parola chiave <code>var</code> viene utilizzata per dichiarare variabili con ambito globale. Questa era l'unica parola chiave che potevi utilizzare per dichiarare le variabili prima che JavaScript rilasciasse le nuove <code>let</code> e <code>const</code> nel 2015.</p><p>Attualmente, dovresti evitare di usare <code>var</code> se puoi, poiché <code>var</code> può introdurre bug che puoi evitare usando al suo posto <code>let</code>.</p><p>Per mostrarti cosa intendo, considera il seguente esempio:</p><pre><code class="language-js">if(true) {
    var name = "Nathan";
}

console.log(name)
</code></pre><p>Il codice qui sopra stamperà correttamente la variabile <code>name</code>, ma in realtà non dovrebbe perché la variabile <code>name</code> è dichiarata all'interno del blocco <code>if</code>.</p><p>Questo perché qualsiasi variabile dichiarata utilizzando &nbsp;<code>var</code> è accessibile ovunque. &nbsp;L'ambito di tale variabile è globale.</p><p>Al contrario, la parola chiave <code>let</code> ha un ambito di blocco, il che significa che la variabile è accessibile solo dal blocco nel quale è stata definita e da tutti i suoi blocchi figli.</p><p>Ma perché preoccuparsi di definire l'ambito della variabile? Questo perché quando si hanno centinaia o migliaia di righe di codice, può diventare frustrante tracciare un errore che si verifica a causa di variabili globali.</p><p>C'è un principio nello sviluppo del software chiamato "principio di minima esposizione", il che significa che non esponi alcuna parte del tuo programma che non sia necessaria.</p><p>Attribuire un ambito di blocco a una variabile garantisce che la stessa sia esposta e accessibile solo nelle parti del tuo codice che richiedono la variabile.</p><p>Una variabile dichiarata utilizzando <code>let</code> è identica a una variabile dichiarata utilizzando <code>var</code> ad eccezione del livello di ambito.</p><pre><code class="language-js">if(true) {
    let name = "Nathan";
}

console.log(name)  // Error: name is not defined (errore: name non è definito)
</code></pre><p>Ciò significa anche che ora hai &nbsp;<code>var</code>, <code>let</code> e <code>const</code> per dichiarare una variabile. Quale usare?</p><p>In generale, puoi prima dichiarare una variabile con <code>const</code>. Quando scrivi il codice dell'applicazione e ti rendi conto che è necessario modificare l'assegnazione della variabile, puoi modificare la dichiarazione in <code>let</code>.</p><p>Se sai fin dall'inizio che il valore della variabile cambierà, puoi usare <code>let</code> immediatamente. Basta non usare <code>var</code> oggi o qualcuno potrebbe arrabbiarsi con te.</p><h3 id="6-4-esercizio-nr-2"><strong>6.4 - Esercizio nr. 2</strong></h3><p>Scrivi un programma con tre variabili, ciascuna con il seguente valore:</p><ol><li>La prima variabile (<code>nome</code>) contiene il tuo nome</li><li>La seconda variabile (<code>eta</code>) contiene la tua età</li><li>La terza variabile (<code>occupazione</code>) contiene la tua occupazione</li></ol><p>Poi stampa le variabili usando il metodo <code>console.log()</code>. Ecco un esempio del risultato:</p><pre><code class="language-txt">Mario Rossi
Studente
19
</code></pre><p>Il modo in cui usi le variabili per creare un programma che faccia quello che desideri è una delle abilità più importanti che puoi avere come programmatore.</p><p>Ma prima di saperne di più su come utilizzare le variabili, impariamo a conoscere i tipi di dato in JavaScript.</p><h2 id="7-tipi-di-dato-base">7 - Tipi di Dato Base</h2><p>I tipi di dato sono semplicemente definizioni per diversi tipi di dato noti a un linguaggio di programmazione.</p><p>Un tipo di dato contiene specifiche su ciò che puoi e non puoi fare con quel dato.</p><p>Per mostrarti un semplice esempio, sono sicuro che sei d'accordo sul fatto che 2 + 2 = 4, giusto?</p><p>Bene, anche JavaScript la pensa allo stesso modo:</p><pre><code class="language-js">console.log(2 + 2);

// Risultato: 4
</code></pre><p>Ma cosa succede se cerchi di aggiungere delle lettere a un numero, come mostrato qui sotto?</p><pre><code class="language-js">console.log(2 + "ABC");
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">2ABC
</code></pre><p>Aggiungere lettere e numeri insieme farà sì che JavaScript concateni o unisca i valori.</p><p>In questa sezione, imparerai i tipi di dato base che JavaScript conosce:</p><ul><li>String (Stringa)</li><li>Number (Numero)</li><li>Boolean (Booleano)</li><li>Null</li><li>Undefined</li></ul><p>Vedrai anche come i vari tipi di dato si comportano con gli operatori come &nbsp;<code>+</code>, mostrato nell'esempio qui sopra.</p><p>Iniziamo con le stringhe.</p><h3 id="7-1-stringhe"><strong>7.1 - Stringhe</strong></h3><p>Una stringa è semplicemente un tipo di dato definito da una serie di caratteri.</p><p>Hai visto un esempio di stringa precedentemente quando hai chiamato la funzione <code>console.log()</code> per stampare un messaggio:</p><pre><code class="language-js">let message = "Hello, Sunshine!";
console.log(message); // Hello, Sunshine!
</code></pre><p>Una stringa deve essere racchiusa tra apici. Puoi usare apici singoli o doppi, ma devono corrispondere.</p><p>Otterrai un errore quando usi apici differenti come in questo caso:</p><pre><code class="language-js">let message = "Hello'; 
// Invalid or unexpected token (token non valido o inatteso)
</code></pre><p>Puoi unire due o più stringhe in una con il simbolo di addizione <code>+</code>. Non dimenticare di aggiungere uno spazio dopo la stringa iniziale oppure avrai una stringa non divisa da spazi!</p><pre><code class="language-js">let message = "Hello " + "and " + "Goodbye!";
console.log(message);

// Risultato: Hello and Goodbye!
</code></pre><p>Quando stampi il valore di una variabile, puoi anche aggiungere direttamente stringhe nella funzione <code>console.log()</code> in questo modo:</p><pre><code class="language-js">let message = "Ciao, Dave!";

console.log("Il messaggio è: " + message);

// Risultato: Il messaggio è: Ciao, Dave!
</code></pre><p>Questo è particolarmente utile quando hai più stringhe da stampare con una sola istruzione console.log, così:</p><pre><code class="language-js">let name = "John";
let topic = "JavaScript";

console.log(name + " sta imparando " + topic + " oggi");

// Risultato: John sta imparando JavaScript oggi
</code></pre><p>Puoi anche usare il formato template di stringa, che ti consente di incorporare il contenuto di una variabile direttamente all'interno della stringa, in questo modo:</p><pre><code class="language-js">let name = "John";
let topic = "JavaScript";

console.log(`${name} sta imparando ${topic} oggi`);

// Risultato: John sta imparando JavaScript oggi
</code></pre><p>Per utilizzare il formato template di stringa, è necessario utilizzare il carattere backtick (<code>`</code>) per racchiudere la stringa anziché le virgolette.</p><p>La variabile è incorporata nella stringa utilizzando il simbolo del dollaro e le parentesi graffe, così: <code>${variabile}</code>.</p><p>In questo modo, JavaScript sa che stai facendo riferimento a una variabile all'interno della stringa.</p><p>Quando si hanno più stringhe da stampare su una singola riga, il formato template di stringa è più conveniente perché non è necessario interrompere la stringa con virgolette e concatenazioni.</p><p>Le stringhe possono anche rappresentare numeri. Racchiudi i numeri tra virgolette come segue:</p><pre><code class="language-js">let score = "10" + "30";
console.log(score);

// Risultato: 1030
</code></pre><p>Quando unisci due numeri in formato stringa con il simbolo <code>+</code>, JavaScript unirà i due numeri invece che eseguire l'operazione aritmetica dell'addizione.</p><p>Ecco come funzionano le stringhe in JavaScript. Ora vediamo i numeri.</p><!--kg-card-begin: markdown--><p><a name="7-2-numeri-interi-e-con-virgola-mobile"></a></p>
<h3 id="72numeriinterieconvirgolamobile">7.2 - Numeri (interi e con virgola mobile)</h3>
<!--kg-card-end: markdown--><p>Il tipo di dato Number rappresenta diversi tipi di numero, che, in JavaScript possono essere:</p><ul><li>Interi (integer)</li><li>Con virgola mobile (float)</li></ul><p>Un intero è un numero senza parte decimale e frazioni. Di seguito due esempi di interi, &nbsp;<code>x</code> e <code>y</code>:</p><pre><code class="language-js">let x = 1;
let y = 2;

console.log(x + y);

// Risultato: 3
</code></pre><p>I numeri con virgola mobile, d'altro canto, rappresentano numeri con cifre decimali, come questi:</p><pre><code class="language-js">let f = 1.2;
let z = 2.35;

console.log(f + z);

// Risultato: 3.55
</code></pre><p>Per creare un numero con virgola mobile, devi scrivere il numero usando il separatore <code>.</code> per definire la parte decimale.</p><p>Con i tipi number, puoi eseguire operazioni aritmetiche come addizione <code>+</code>, sottrazione <code>-</code>, divisione <code>/</code> e moltiplicazione <code>*</code> , proprio come se stessi usando una calcolatrice.</p><h3 id="7-3-booleani"><strong>7.3 - Booleani</strong></h3><p>Il booleano è un tipo che rappresenta i valori &nbsp;vero (<code>true</code> ) e falso (<code>false</code>).</p><p>Puoi pensare a un booleano come a un interruttore della luce che può trovarsi solo in una delle due posizioni: acceso o spento.</p><p>Così è con i valori booleani nei linguaggi di programmazione. Vengono utilizzati quando JavaScript deve prendere una decisione: andare a sinistra o a destra? Giusto o sbagliato?<br>Ecco come creare valori booleani in JavaScript:</p><pre><code class="language-js">let on = true;
let off = false;
</code></pre><p>Questo tipo di dati è usato frequentemente quando devi prendere una decisione usando un controllo di flusso. Vedrai come i valori booleani sono molto utili per lo sviluppo di un programma più tardi nel <a href="#9-operatori">capitolo 9</a>.</p><h3 id="7-4-undefined"><strong>7.4 - Undefined</strong></h3><p>Undefined è un tipo di dato usato per rappresentare una variabile alla quale non è stato assegnato ancora alcun valore.</p><p>Ogni volta che dichiari una variabile senza assegnarle un valore, il valore <code>undefined</code> le viene assegnato. Per esempio:</p><pre><code class="language-js">let first_name;

console.log(first_name); // undefined
</code></pre><p>Puoi anche assegnare &nbsp;<code>undefined</code> esplicitamente a una variabile in questo modo:</p><pre><code class="language-js">let last_name = undefined;
</code></pre><p>In genere questo non è raccomandato in quanto JavaScript dispone di un altro valore, detto <code>null</code>, che viene usato per contrassegnare una variabile che non ha valore.</p><h3 id="7-5-null"><strong>7.5 - Null</strong></h3><p>Il valore <code>null</code> è un tipo speciale di dato che rappresenta un valore vuoto o sconosciuto. Ecco come assegni null a una variabile:</p><pre><code class="language-js">let first_name = null;
</code></pre><p>Il codice qui sopra indica che il valore di <code>first_name</code> è vuoto o sconosciuto.</p><p>A questo punto, potresti pensare, qual è la differenza tra <code>undefined</code> e <code>null</code>? Sembra che abbiano uno scopo simile.</p><p>Hai ragione. Sia <code>undefined</code> che <code>null</code> sono valori che non rappresentano nulla e altri linguaggi di programmazione di solito ne hanno solo uno, ovvero <code>null</code>.</p><p>In JavaScript, il valore <code>undefined</code> è riservato come valore predefinito quando viene dichiarata una variabile, mentre <code>null</code> significa che assegni intenzionalmente un valore "vuoto" per la variabile.</p><p>Questa leggera differenza sarà evidenziata in seguito quando imparerai a conoscere le funzioni nel <a href="#13-funzioni">capitolo 13</a>.</p><p>Per ora, tieni presente che JavaScript tratta <code>undefined</code> come valore vuoto "predefinito" e <code>null</code> come valore vuoto "intenzionale".</p><h2 id="8-conversione-di-tipo-e-coercizione-di-tipo"><strong>8 - Conversione di tipo e coercizione di tipo</strong></h2><p>A volte, potresti voler convertire un tipo di dato in un altro in modo che il programma funzioni come previsto.</p><p>Ad esempio, supponi di dover convertire una stringa in un numero intero in modo da poter eseguire un'addizione tra numeri.</p><p>Se hai uno dei numeri come stringa, JavaScript li unisce invece di aggiungerli:</p><pre><code class="language-js">let x = "7";
let y = 5;

console.log(x + y); // 75
</code></pre><p>Per aggiungere i due numeri propriamente, devi convertire il valore della variabile <code>x</code> in un intero.</p><p>La modifica di un tipo di dato in un altro è anche nota come conversione di tipo (type casting). Ci sono tre funzioni che sono frequentemente usate per eseguire le conversioni di tipo:</p><ul><li><code>Number()</code></li><li><code>String()</code></li><li><code>Boolean()</code></li></ul><p>Come si evince dal loro nome (in inglese - n.d.t.) queste funzioni di conversione di tipo tentano di convertire un qualsiasi valore specificato all'interno delle parentesi nel tipo con lo stesso nome della funzione.</p><p>Per convertire una stringa in un intero puoi usare la funzione <code>int()</code>:</p><pre><code class="language-js">let x = "7";
let y = 5;

// Converte x in un intero
x = Number(x);

console.log(x + y); // 12
</code></pre><p>La funzione &nbsp;<code>String()</code> converte un valore di un altro tipo in stringa. Se chiami <code>String(true)</code>, otterrai il valore di ritorno 'true'.</p><p>Passare un valore dello stesso tipo a queste funzioni non ha effetto e si otterrà lo stesso valore in ritorno.</p><h3 id="8-1-coercizione-di-tipo"><strong>8.1 - Coercizione di tipo</strong></h3><p>In JavaScript, la coercizione di tipo è un processo in cui un valore di un tipo viene implicitamente convertito in un altro tipo.</p><p>Questo viene fatto automaticamente da JavaScript in modo che il tuo codice non causi un errore. Ma come vedrai in questa sezione, la coercizione di tipo può effettivamente causare un comportamento indesiderato nel programma.</p><p>Consideriamo cosa succede quando esegui un'addizione tra un numero e una stringa in JavaScript:</p><pre><code class="language-js">console.log(1 + "1");
</code></pre><p>Come hai visto in precedenza, JavaScript considererà il numero come una stringa e unirà i due valori come "11" invece di sommarli (1 + 1 = 2)</p><p>Devi sapere che altri linguaggi di programmazione non rispondono allo stesso modo.</p><p>Linguaggi come Ruby o Python risponderanno interrompendo il programma e fornendo un errore come feedback. Risponderanno con qualcosa del tipo "Impossibile eseguire l'addizione tra un numero e una stringa".</p><p>Ma JavaScript lo vedrà e dirà: "Non posso eseguire l'operazione che hai richiesto <strong>così com'è</strong>, ma posso farlo se il numero 1 viene convertito in una stringa, <strong>quindi lo farò</strong>."</p><p>E questa è esattamente la coercizione di tipo. JavaScript rileva che non sa come eseguire il tuo codice, ma non interrompe il programma e risponde con un errore.</p><p>Viceversa, cambierà il tipo di dato di uno dei valori senza dirtelo.</p><p>Sebbene la coercizione di tipo non causi errori, il risultato è in realtà qualcosa che non vuoi neanche tu.</p><!--kg-card-begin: markdown--><h4 id="811regoledellacoercizioneditipo">8.1.1 - Regole della coercizione di tipo</h4>
<!--kg-card-end: markdown--><p>Le regole della coercizione di tipo non sono mai state dichiarate chiaramente da nessuna parte, ma ho trovato alcune regole provando io stesso vari pezzi di codice stupidi.</p><p>Sembra che JavaScript converta per prima cosa i tipi di dati in stringa quando trova diversi tipi di dato:</p><pre><code class="language-js">1 + "1" // "11"
[1 ,2] + "1" // "1,21"
true + "1" // "true1"
</code></pre><p>Ma l'ordine dei valori ha importanza quando hai un oggetto. Se l'oggetto viene prima sarà sempre ritornato un <code>1</code> numerico:</p><pre><code class="language-js">{ a: 1 } + "1" // 1
"1" + { a: 1 } // "1[object Object]"
true + { a: 1 } // "true[object Object]"
{ a: 1 } + 1 // 1
</code></pre><p>JavaScript può calcolare tra tipi booleani e numerici in quanto i valori booleani sono <code>true</code> e <code>false</code> che implicitamente corrispondono ai valori numerici di <code>1</code> e <code>0</code>:</p><pre><code class="language-js">true + 1 // 1+1 = 2
false + 1 // 0+1 = 1
[1,2] + 1 // "1,21"
</code></pre><p>La coercizione di tipo viene sempre effettuata <strong>implicitamente</strong>. Quando assegni il valore in fase di dichiarazione della variabile, il tipo della variabile non verrà mai modificato al di fuori dell'operazione:</p><pre><code class="language-js">let myNumber = 1;
console.log(myNumber + "1"); // stampa 11
console.log(myNumber); // stampa sempre il numero 1 e non la stringa
</code></pre><p>Puoi provare a cercare qualche altro caso di tua iniziativa, ma spero che tu abbia compreso cos'è la coercizione di tipo e come funziona adesso.</p><!--kg-card-begin: markdown--><p><a name="8-1-2-perche-dovresti-evitare-la-coercizione-di-tipo"></a></p>
<h4 id="812perchdovrestievitarelacoercizioneditipo">8.1.2 - Perché dovresti evitare la coercizione di tipo</h4>
<!--kg-card-end: markdown--><p>Gli sviluppatori JavaScript sono generalmente divisi in due fazioni quando si parla di coercizione di tipo:</p><ul><li>Quelli che pensano che sia una funzionalità</li><li>Quelli che pensano che sia un bug</li></ul><p>Se me lo chiedi, ti consiglierei di evitare sempre di usare la coercizione di tipo nel tuo codice.</p><p>Il motivo è che non ho mai trovato un problema in cui è richiesta la coercizione di tipo per la soluzione, e quando devo convertire un tipo in un altro, è sempre meglio farlo in modo esplicito:</p><pre><code class="language-js">let price = "50";
let tax = 5;

let totalPrice = Number(price) + Number(tax);

console.log(totalPrice);
</code></pre><p>L'uso di funzioni di conversione di tipo esplicite come <code>Number()</code> e <code>String()</code> renderà il tuo codice chiaro e trasparente. Non è necessario indovinare il tipo di dati corretto richiesto nel programma.</p><p>La coercizione di tipo è una delle caratteristiche uniche di JavaScript che può confondere i principianti, quindi è bene chiarirlo presto.</p><p>Successivamente impareremo gli operatori JavaScript.</p><h2 id="9-operatori"><strong>9 - Operatori</strong></h2><p>Come suggerisce il nome, gli operatori sono simboli che puoi utilizzare per eseguire operazioni sui tuoi dati.</p><p>Hai visto alcuni esempi di utilizzo dell'operatore più <code>+</code> per unire più stringhe e sommare due numeri insieme. Naturalmente, JavaScript ha più di un operatore, come scoprirai in questo capitolo.</p><p>Poiché in precedenza hai appreso i tipi di dati e la conversione di tipo, imparare gli operatori dovrebbe essere relativamente semplice.</p><h3 id="9-1-operatori-aritmetici"><strong>9.1 - Operatori Aritmetici</strong></h3><p>Gli operatori aritmetici sono usati per eseguire operazioni matematiche come addizioni e sottrazioni.</p><p>Questi operatori sono frequentemente usati con tipi di dato numerico. Ecco un esempio:</p><pre><code class="language-js">console.log(10 - 3); // 7
console.log(2 + 4); // 6
</code></pre><p>Ci sono in totale 8 operatori aritmetici in JavaScript:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>NOME</th>
<th>ESEMPIO OPERAZIONE</th>
<th>SIGNIFICATO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Addizione</td>
<td><code>x + y</code></td>
<td>Ritorna la somma dei due operandi</td>
</tr>
<tr>
<td>Sottrazione</td>
<td><code>x - y</code></td>
<td>Ritorna la differenza tra i due operandi</td>
</tr>
<tr>
<td>Moltiplicazione</td>
<td><code>x * y</code></td>
<td>Ritorna il prodotto dei due operandi</td>
</tr>
<tr>
<td>Elevamento a potenza</td>
<td><code>x ** y</code></td>
<td>Ritorna il valore dell'operando di sinistra elevato alla potenza dell'operando di destra</td>
</tr>
<tr>
<td>Divisione</td>
<td><code>x / y</code></td>
<td>Ritorna il valore dell'operando di sinistra diviso per l'operando di destra</td>
</tr>
<tr>
<td>Resto</td>
<td><code>x % y</code></td>
<td>Ritorna il resto del valore della divisione tra l'operando di sinistra e l'operando di destra</td>
</tr>
<tr>
<td>Incremento</td>
<td><code>x++</code></td>
<td>Ritorna l'operando più uno</td>
</tr>
<tr>
<td>Decremento</td>
<td><code>x--</code></td>
<td>Ritorna l'operando meno uno</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Questi operatori sono piuttosto semplici, quindi puoi provarli da solo.</p><p>Come hai visto nella sezione precedente, l'operatore <code>+</code> può essere utilizzato anche sui dati di tipo <code>String</code> per unire più stringhe in una sola:</p><pre><code class="language-js">let message = "Ciao " + "umano!";
console.log(message); // Ciao umano!
</code></pre><p>Quando aggiungi un numero e una stringa, JavaScript eseguirà una coercizione di tipo e tratterà il valore numerico come un valore stringa:</p><pre><code class="language-js">let sum = "Ciao " + 89;
console.log(sum); // Ciao 89
</code></pre><p>L'utilizzo di qualsiasi altro operatore aritmetico con le stringhe farà sì che JavaScript restituisca un valore <code><a href="https://it.wikipedia.org/wiki/NaN">NaN</a></code>.</p><h3 id="9-2-operatori-di-assegnazione"><strong>9.2 - Operatori di assegnazione</strong></h3><p>L'operatore successivo da apprendere è l'operatore di assegnazione, rappresentato dal segno di uguale <code>=</code>.</p><p>In JavaScript, l'operatore di assegnazione viene utilizzato per assegnare dati o un valore a una variabile.</p><p>Hai già visto alcuni esempi di utilizzo dell'operatore di assegnazione, quindi ecco un promemoria:</p><pre><code class="language-js">// Assegna il valore stringa 'Hello' alla variabile 'message'
let message = "Hello";

// Assegna il valore booleano true alla variabile 'on'
let on = true;
</code></pre><p>Potresti aver notato che il segno uguale ha un significato leggermente diverso in programmazione che in matematica, e hai ragione!</p><p>L'operatore di assegnazione non viene utilizzato per confrontare se un numero è uguale a un altro numero nella programmazione.</p><p>Se vuoi fare questo tipo di confronto, devi usare l'operatore "uguale a" <code>==</code>.</p><p>Gli operatori di assegnazione possono anche essere combinati con operatori aritmetici, in modo da poter aggiungere o sottrarre valori dall'operando di sinistra.</p><p>Vedi la tabella seguente per i tipi di operatore di assegnazione:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>NOME</th>
<th>ESEMPIO OPERAZIONE</th>
<th>SIGNIFICATO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Assegnazione</td>
<td><code>x = y</code></td>
<td><code>x = y</code></td>
</tr>
<tr>
<td>Addizione e Assegnazione</td>
<td><code>x += y</code></td>
<td><code>x = x + y</code></td>
</tr>
<tr>
<td>Sottrazione e assegnazione</td>
<td><code>x -= y</code></td>
<td><code>x = x - y</code></td>
</tr>
<tr>
<td>Moltiplicazione e Assegnazione</td>
<td><code>x *= y</code></td>
<td><code>x = x * y</code></td>
</tr>
<tr>
<td>Divisione e Assegnazione</td>
<td><code>x /= y</code></td>
<td><code>x = x / y</code></td>
</tr>
<tr>
<td>Resto e Assegnazione</td>
<td><code>x %= y</code></td>
<td><code>x = x % y</code></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Ora esaminiamo gli operatori di confronto.</p><h3 id="9-3-operatori-di-confronto"><strong>9.3 - Operatori di confronto</strong></h3><p>Gli operatori di confronto vengono utilizzati per confrontare due valori. Gli operatori in questa categoria restituiranno valori booleani: vero (<code>true</code>) o falso (<code>false</code>).</p><p>La tabella seguente mostra tutti gli operatori di confronto disponibili in JavaScript:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>NOME</th>
<th>ESEMPIO OPERAZIONE</th>
<th>SIGNIFICATO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Uguale</td>
<td><code>x == y</code></td>
<td>Ritorna <code>true</code> se gli operandi sono uguali</td>
</tr>
<tr>
<td>Non uguale</td>
<td><code>x != y</code></td>
<td>Ritorna <code>true</code> se gli operandi non sono uguali</td>
</tr>
<tr>
<td>Strettamente uguale</td>
<td><code>x === y</code></td>
<td>Ritorna <code>true</code> se gli operandi sono uguali e sono dello stesso tipo</td>
</tr>
<tr>
<td>Strettamente non uguale</td>
<td><code>x !== y</code></td>
<td>Ritorna <code>true</code> se gli operandi non sono uguali e sono di tipi diversi</td>
</tr>
<tr>
<td>Maggiore di</td>
<td><code>x &gt; y</code></td>
<td>Ritorna <code>true</code> se l'operando di sinistra è maggiore di quello di destra</td>
</tr>
<tr>
<td>Maggiore o uguale</td>
<td><code>x &gt;= y</code></td>
<td>Ritorna <code>true</code> se l'operando di sinistra è maggiore o uguale a quello di destra</td>
</tr>
<tr>
<td>Minore di</td>
<td><code>x &lt; y</code></td>
<td>Ritorna <code>true</code> se l'operando di sinistra è minore di quello di destra</td>
</tr>
<tr>
<td>Minore o uguale</td>
<td><code>x &gt;= y</code></td>
<td>Ritorna <code>true</code> se l'operando di sinistra è minore o uguale a quello di destra</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Ecco alcuni esempi di utilizzo di questi operatori:</p><pre><code class="language-js">console.log(9 == 9); // true

console.log(9 != 20); // true

console.log(2 &gt; 10); // false

console.log(2 &lt; 10); // true

console.log(5 &gt;= 10); // false

console.log(10 &lt;= 10); // true
</code></pre><p>Anche gli operatori di confronto possono essere usati per confrontare stringhe in questo modo:</p><pre><code class="language-js">console.log("ABC" == "ABC"); // true

console.log("ABC" == "abc"); // false

console.log("Z" == "A"); // false
</code></pre><p>I confronti tra stringhe fanno distinzione tra maiuscole e minuscole, come mostrato nell'esempio precedente.</p><p>JavaScript ha anche due versioni di ciascun operatore di confronto: <em>loose</em> e <em>strict</em> (rigoroso).</p><p>In modalità <em>strict</em>, JavaScript confronterà i tipi senza eseguire una coercizione di tipo.</p><p>È necessario aggiungere un altro simbolo uguale <code>=</code> all'operatore come segue</p><pre><code class="language-js">console.log("9" == 9); // true
console.log("9" === 9); // false

console.log(true == 1); // true
console.log(true === 1); // false
</code></pre><p>Dovresti usare gli operatori di confronto rigorosi a meno che tu non abbia una ragione specifica per non farlo.</p><h3 id="9-4-operatori-logici"><strong>9.4 - Operatori logici</strong></h3><p>Sono usati per verificare se una o più espressioni vengono valutate come vere (<code>true</code>) o false (<code>false</code>).</p><p>JavaScript ha tre operatori logici:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>NOME</th>
<th>ESEMPIO OPERAZIONE</th>
<th>SIGNIFICATO</th>
</tr>
</thead>
<tbody>
<tr>
<td>Logico E</td>
<td><code>x &amp;&amp; y</code></td>
<td>Ritorna <code>true</code> se tutti gli operandi sono <code>true</code>, <code>false</code> altrimenti</td>
</tr>
<tr>
<td>Logico O</td>
<td><code>x || y</code></td>
<td>Ritorna <code>true</code> se uno degli operandi è <code>true</code>, <code>false</code> altrimenti</td>
</tr>
<tr>
<td>Logico NON</td>
<td><code>!</code></td>
<td>Ribalta il risultato, ritorna <code>true</code> se <code>false</code> e viceversa</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Questi operatori possono ritornare solo valori booleani. Per esempio puoi determinare se 7 sia maggiore di 2 e 5 sia maggiore di 4:</p><pre><code class="language-js">console.log(7 &gt; 2 &amp;&amp; 5 &gt; 4); // true
</code></pre><p>Questi operatori logici seguono le leggi della logica matematica:</p><ol><li><code>&amp;&amp;</code> operatore E - se una qualunque espressione ritorna <code>false</code>, il risultato è <code>false</code></li><li><code>||</code> operatore O - se una qualunque espressione ritorna <code>true</code>, il risultato è <code>true</code></li><li><code>!</code> operatore NON - nega l'espressione, ritornando l'opposto.</li></ol><p>Facciamo un piccolo esercizio. Cerca di eseguire queste istruzioni sul tuo computer. Sei in grado di indovinare i risultati?</p><pre><code class="language-js">console.log(true &amp;&amp; false);

console.log(false || false);

console.log(!true);
</code></pre><p>Questi operatori logici tornano utili quando devi verificare che uno specifico requisito sia soddisfatto nel tuo codice.</p><h3 id="9-5-operatore-typeof"><strong>9.5 - Operatore <code>typeof</code></strong></h3><p>JavaScript ti consente di verificare il tipo di dato usando l'operatore <code>typeof</code>. Per usarlo devi chiamarlo prima di specificare l'oggetto della verifica:</p><pre><code class="language-js">let x = 5;
console.log(typeof x) //  'number'

console.log(typeof "Nathan") // 'string'

console.log(typeof true) // 'boolean'
</code></pre><p>L'operatore <code>typeof</code> restituisce il tipo di dato sotto forma di stringa. Il tipo 'number' rappresenta sia i tipi interi che con virgola mobile (float), 'string' e 'boolean' &nbsp;rappresentano i rispettivi tipi.</p><h3 id="9-6-esercizio-nr-3"><strong>9.6 - Esercizio nr. 3</strong></h3><p>Cerca di indovinare i risultati per queste operazioni:</p><pre><code class="language-js">console.log(19 % 3);
console.log(10 == 3);
console.log(10 !== "10");
console.log(2 &lt; "10");
console.log("5" &gt; 2);
console.log((false &amp;&amp; true) || false);</code></pre><pre><code class="language-js">console.log(19 % 3);
console.log(10 == 3);
console.log(10 !== "10");
console.log(2 &lt; "10");
console.log("5" &gt; 2);
console.log((false &amp;&amp; true) || false);
</code></pre><h2 id="10-array"><strong>10 - Array</strong></h2><p>Un array è un tipo di dato oggetto che può essere usato per contenere più di un valore. Un array può essere un elenco di stringhe, numeri, booleani, oggetti oppure un misto di tutti questi.</p><p>Per creare un array, devi usare le parentesi quadre <code>[]</code> e separare gli elementi usando una virgola.</p><p>Ecco come creare un elenco di stringhe:</p><pre><code class="language-js">let birds = ['Owl', 'Eagle', 'Parrot', 'Falcon'];
</code></pre><p>Puoi pensare a un array come a un elenco di elementi, ciascuno memorizzato in uno scomparto di un armadietto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/07/10-array-as-a-locker-1.png" class="kg-image" alt="Array as a locker illustration" width="600" height="400" loading="lazy"></figure><p>Puoi anche dichiarare un array vuoto, senza elementi:</p><pre><code class="language-js">let birds = [];
</code></pre><p>Un array può anche contenere elementi di tipo diverso:</p><pre><code class="language-js">let mixedArray = ['Bird', true, 10, 5.17]
</code></pre><p>L'array qui sopra contiene una stringa, un booleano, un intero e un numero con virgola mobile.</p><h3 id="10-1-posizione-dell-indice"><strong>10.1 - Posizione dell'indice</strong></h3><p>JavaScript ricorda la posizione degli elementi all'interno di un array. La posizione di un elemento è anche chiamata indice numerico.</p><p>Tornando all'esempio dell'armadietto, puoi pensare ai numeri di indice come ai numeri degli scomparti dell'armadietto. Il numero di indice inizia da 0 come segue:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/07/10-array-index-analogy.png" class="kg-image" alt="Array index numbers as locker numbers" width="600" height="400" loading="lazy"></figure><p>Per accedere o modificare un elemento di un array, devi aggiungere al nome della variabile che rappresenta l'array la notazione <code>[x]</code> dove <code>x</code> è il numero di indice dell'elemento. Ecco un esempio:</p><pre><code class="language-js">// Accede al primo elemento dell'array
myArray[0];

// Accede al secondo elemento dell'array
myArray[1];
</code></pre><p>Supponi tu voglia stampare la stringa 'Owl' dall'array <code>birds</code>. Ecco come puoi fare:</p><pre><code class="language-js">let birds = ['Owl', 'Eagle', 'Parrot', 'Falcon'];

console.log(birds[0]); // Owl
</code></pre><p>Ecco qua. È necessario digitare il nome dell'array, seguito dal numero di indice racchiuso tra parentesi quadre.</p><p>È inoltre possibile assegnare un nuovo valore a un elemento con indice specifico utilizzando l'operatore di assegnazione.</p><p>Sostituiamo 'Parrot' con 'Vulture':</p><pre><code class="language-js">let birds = ['Owl', 'Eagle', 'Parrot', 'Falcon'];
birds[2] = 'Vulture';

console.log(birds);
// ['Owl', 'Eagle', 'Vulture', 'Falcon']
</code></pre><p>Visto che l'indice dell'array inizia da 0, il valore 'Parrot' è conservato alla posizione di indice 2, non 3.</p><h3 id="10-2-metodi-speciali-per-la-manipolazione-di-array"><strong>10 - 2 Metodi speciali per la manipolazione di array</strong></h3><p>Poiché l'array è un oggetto, è possibile chiamare i metodi forniti da JavaScript per manipolare i valori dell'array.</p><p>Ad esempio, puoi utilizzare il metodo <code>push()</code> per aggiungere un elemento alla fine dell'array:</p><pre><code class="language-js">let birds = ['Owl', 'Eagle'];

birds.push('Sparrow');

console.log(birds);
// ['Owl', 'Eagle', 'Sparrow']
</code></pre><p>Un altro metodo chiamato <code>pop()</code> può essere usato per eliminare l'elemento alla fine dell'array:</p><pre><code class="language-js">let birds = ['Owl', 'Eagle', 'Sparrow'];

birds.pop();

console.log(birds);
// ['Owl', 'Eagle']
</code></pre><p>Il metodo <code>unshift()</code> si può usare per inserire un elemento all'inizio dell'array &nbsp;(posizione di indice 0):</p><pre><code class="language-js">let fishes = ['Salmon', 'Goldfish', 'Tuna'];

fishes.unshift('Sardine');

console.log(fishes);
// ['Sardine', 'Salmon', 'Goldfish', 'Tuna']
</code></pre><p>Di contro il metodo <code>shift()</code> può essere usato per rimuovere l'elemento all'inizio dell'array (posizione di indice 0):</p><pre><code class="language-js">let fishes = ['Salmon', 'Goldfish', 'Tuna'];

fishes.shift();

console.log(fishes);
// ['Goldfish', 'Tuna']
</code></pre><p>Il metodo <code>indexOf()</code> può essere usato per trovare e ritornare la posizione di indice di un elemento in un array.</p><p>Questo metodo ritornerà <code>-1</code> quando l'elemento non viene trovato nell'array:</p><pre><code class="language-js">let fishes = ['Salmon', 'Goldfish', 'Tuna'];

let pos = fishes.indexOf('Tuna');

console.log(pos); // 2
</code></pre><p>Per ottenere la dimensione di un array puoi accedere alla sua proprietà <code>length</code>:</p><pre><code class="language-js">let fishes = ['Salmon', 'Goldfish', 'Tuna'];

console.log(fishes.length); // 3
</code></pre><p>Nota che non aggiungiamo parentesi accanto a <code>length</code> qui sopra. Questo perché <code>length</code> è una proprietà dell'oggetto array e non un metodo.</p><p>Impareremo di più sugli oggetti prossimamente.</p><h3 id="10-3-esercizio-nr-4"><strong>10.3 - Esercizio nr. &nbsp;4</strong></h3><p>Crea un array denominato <code>colori</code> che includa i colori "rosso", "verde" e "blu".</p><p>Poi aggiungi il colore "nero" dopo l'ultimo indice dell'array. Quindi stampa l'array.</p><p>Successivamente, rimuovi il valore "rosso" e scambia la posizione di "verde" e "blu". Stampa nuovamente l'array.</p><p>Infine, aggiungi il colore "giallo" all'inizio dell'array, quindi stampalo.</p><p>Il risultato dovrà essere il seguente:</p><pre><code class="language-txt">[ 'rosso', 'verde', 'blu', 'nero' ]
[ 'blu', 'verde', 'nero' ]
[ 'giallo', 'blu', 'verde', 'nero' ]
</code></pre><p>Devi modificare l'array originale usando i metodi illustrati in questo capitolo.</p><!--kg-card-begin: markdown--><p><a name="11-flussi-di-controllo-condizionali"></a></p>
<h2 id="11flussidicontrollocondizionali">11 - Flussi di controllo (condizionali)</h2>
<!--kg-card-end: markdown--><p>Fino a ora, il codice JavaScript che hai scritto viene eseguito riga per riga dall'alto verso il basso. Ma cosa succede se si desidera eseguire alcune righe di codice solo quando viene soddisfatta una determinata condizione?</p><p>Un programma per computer di solito deve tenere conto di molte condizioni diverse che possono verificarsi durante l'esecuzione dello stesso.</p><p>Questo è simile a come un essere umano prende decisioni nella propria vita. Ad esempio, hai i soldi per permetterti una vacanza in Giappone? Se sì, vai. In caso contrario, risparmia ulteriormente!</p><p>È qui che entra in gioco il flusso di controllo. Il <strong>flusso di controllo</strong> è una funzionalità in un linguaggio di programmazione che ti consente di eseguire in modo selettivo codice specifico in base alle diverse condizioni che possono verificarsi.</p><p>L'utilizzo dei flussi di controllo ti consente di definire più percorsi che un programma può intraprendere in base alle condizioni presenti nello stesso.</p><p>Ci sono due tipi di flussi di controllo comunemente usati in JavaScript: condizionali e cicli (loop).<br>Questa sezione si concentrerà sulle istruzioni condizionali come:</p><ol><li>L'istruzione <code>if...else</code></li><li>L'istruzione <code>switch...case</code></li></ol><p>Imparerai le istruzioni per i cicli nella successiva sezione.</p><h3 id="11-1-istruzione-if-else"><strong>11.1 - Istruzione if...else</strong></h3><p>L'istruzione <code>if</code> ti consente di creare una parte di programma che viene eseguita solamente se viene soddisfatta una specifica condizione.</p><p>La sintassi è la seguente:</p><pre><code class="language-js">if (condizione) {
  // codice da eseguire se la condizione è soddisfatta
}
</code></pre><p>Vediamo un esempio. Supponiamo che tu voglia andare in vacanza, per cui ti servono 5000 dollari.</p><p>Usando l'istruzione <code>if</code>, ecco come verificare se hai abbastanza denaro:</p><pre><code class="language-js">let balance = 7000;

if (balance &gt; 5000) {
  console.log("Hai sufficiente denaro per questo viaggio. Andiamo!");
}
</code></pre><p>Esegui il codice qui sopra una volta e vedrai la stringa stampata sul terminale.</p><p>Ora modifica il valore di <code>balance</code> a 3000 e non otterrai alcuna risposta.</p><p>Ciò accade perché il codice all'interno dell'istruzione <code>if</code> viene eseguito solo quando la condizione è vera.</p><p>Dopo l'istruzione <code>if</code>, puoi scrivere un'altra riga di codice sotto di essa come segue:</p><pre><code class="language-js">let balance = 7000;

if (balance &gt; 5000) {
  console.log("Hai sufficiente denaro per questo viaggio. Andiamo");
}
console.log("Fine!");
</code></pre><p>La seconda istruzione <code>console.log()</code> qui sopra verrà eseguita indipendentemente dal valore assegnato alla variabile <code>balance</code>.</p><p>Se vuoi che venga eseguita solo quando la condizione <code>if</code> è soddisfatta, metti anche questa riga all'interno delle parentesi graffe:</p><pre><code class="language-js">let balance = 7000;

if (balance &gt; 5000) {
  console.log("Hai sufficiente denaro per questo viaggio. Andiamo");
  console.log("Fine!");
}
</code></pre><p>Supponiamo ora di dover eseguire del codice solo quando la condizione dell'istruzione <code>if</code> <strong>non</strong> è soddisfatta.</p><p>È qui che entra in gioco l'istruzione <code>else</code>. L'istruzione <code>else</code> viene utilizzata per eseguire il codice solo quando l'istruzione <code>if</code> non è soddisfatta.</p><p>Ecco un esempio:</p><pre><code class="language-js">let balance = 7000;

if (balance &gt; 5000) {
  console.log("Hai sufficiente denaro per questo viaggio. Andiamo");
} else {
  console.log("Mi dispiace, non c'è denaro a sufficienza. Risparmia di più!");
}
console.log("Fine!");
</code></pre><p>Ora modifica il valore di <code>balance</code> in modo che sia inferiore a 5000 e attiverai il blocco <code>else</code> nell'esempio.</p><p>JavaScript ha anche l'istruzione <code>else if</code> che ti consente di scrivere un'altra condizione da verificare se la condizione dell'istruzione <code>if</code> non è soddisfatta.</p><p>Considera l'esempio seguente:</p><pre><code class="language-js">let balance = 7000;

if (balance &gt; 5000) {
  console.log("Hai sufficiente denaro per questo viaggio. Andiamo!");
} else if (balance &gt; 3000) {
  console.log("Hai denaro solo per una vacanza senza andare troppo lontano!");
} else {
  console.log("Mi dispiace, non c'è denaro a sufficienza. Risparmia di più!");
}
console.log("Fine!");
</code></pre><p>Quando il valore &nbsp;di <code>balance</code> è inferiore a 5000, l'istruzione <code>else if</code> verificherà se il valore è superiore a 3000. In tal caso, il programma procederà a consigliarti di fare una vacanza senza spendere troppi soldi per il viaggio.</p><p>Puoi scrivere tante istruzioni <code>else if</code> quante necessarie e ognuna verrà eseguita solo se l'istruzione precedente non viene soddisfatta.</p><p>Insieme, le istruzioni <code>if..else..else if</code> consentono di eseguire diversi blocchi di codice a seconda della condizione affrontata dal programma.</p><h3 id="11-2-istruzione-switch-case"><strong>11.2 - Istruzione switch...case</strong></h3><p>L'istruzione <code>switch</code> fa parte della sintassi principale di JavaScript che consente di controllare il flusso di esecuzione del codice.</p><p>È spesso pensata come un'alternativa all'istruzione <code>if..else</code> in quanto ti dà un codice più leggibile, specialmente quando hai molte condizioni diverse da valutare.</p><p>Ecco un esempio di un'istruzione <code>switch</code> funzionante. Spiegherò il codice qui sotto:</p><pre><code class="language-js">let age = 15;
switch (age) {
  case 10:
    console.log("Hai 10 anni");
    break;
  case 20:
    console.log("Hai 20 anni");
    break;
  default:
    console.log("Non hai nè 10 nè 20 anni");
}
</code></pre><p>Innanzitutto, è necessario passare tra parentesi un'espressione che deve essere valutata dall'istruzione <code>switch</code>. Nell'esempio, la variabile <code>age</code> viene passata come argomento per la valutazione.</p><p>Quindi, devi scrivere i valori <code>case</code> che l'istruzione <code>switch</code> cercherà di far corrispondere alla tua espressione. Il valore per <code>case</code> è immediatamente seguito da due punti (<code>:</code>) per contrassegnare l'inizio del blocco case:</p><pre><code class="language-js">case "apple":
</code></pre><p>Tieni presente il tipo di dati del valore per <code>case</code> che si desidera far corrispondere all'espressione. Se vuoi abbinare una stringa, devi inserire un valore di tipo <code>string</code>. Le istruzioni <strong>switch non eseguiranno la coercizione di tipo</strong> quando hai un valore di tipo <code>number</code> come argomento ma metti un tipo <code>string</code> per <code>case</code>:</p><pre><code class="language-js">switch (1) {
  case "1":
    console.log("Hello World!");
    break;
}
</code></pre><p>Il valore di tipo <code>number</code> non corrisponde al valore per <code>case</code>, di tipo <code>string</code>, quindi JavaScript non stamperà nulla nella console.</p><p>Lo stesso accade anche per i valori booleani. Il numero 1 non sarà forzato come <code>true</code> e il numero 0 non sarà forzato come <code>false</code>:</p><pre><code class="language-js">switch (0) {
  case true:
    console.log("Hello True!");
    break;
  case false:
    console.log("Bonjour False!");
    break;
  default:
    console.log("No matching case");
}
</code></pre><!--kg-card-begin: markdown--><p><a name="11-3-corpo-dell-istruzione-switch-case"></a></p>
<h3 id="113corpodellistruzioneswitchcase">11.3 - Corpo dell'istruzione switch...case</h3>
<!--kg-card-end: markdown--><p>Il corpo dell'istruzione <code>switch</code> è composto da tre parole chiave:</p><ul><li><code>case</code> per iniziare un blocco di codice case</li><li><code>break</code> per impedire all'istruzione <code>switch</code> di eseguire le successive istruzioni <code>case</code></li><li><code>default</code> per eseguire una parte di codice qualora non venga trovata alcuna corrispondenza di <code>case</code> per il valore di <code>switch</code>.</li></ul><p>Quando la tua espressione trova un <code>case</code> corrispondente, JavaScript eseguirà il codice che segue l'istruzione <code>case</code> finché non trova la parola chiave <code>break</code>. Se ometti la parola chiave <code>break</code>, l'esecuzione del codice continuerà al blocco successivo.</p><p>Dai un'occhiata al seguente esempio:</p><pre><code class="language-js">switch (0) {
  case 1:
    console.log("Il valore è uno");
  case 0:
    console.log("Il valore è zero");
  default:
    console.log("Nessuna corrispondenza");
}
</code></pre><p>Quando esegui il codice qui sopra, JavaScript stamperà:</p><pre><code class="language-shell">&gt; "Il valore è zero"
&gt; "Nessuna corrispondenza"
</code></pre><p>Questo perché senza la parola chiave <code>break</code>, <code>switch</code> continuerà a valutare l'espressione rispetto ai casi rimanenti anche quando è stato già trovato un caso corrispondente.</p><p>La tua valutazione switch può corrispondere a più di un caso, quindi la parola chiave <code>break</code> viene comunemente utilizzata per uscire dal processo una volta trovata una corrispondenza.</p><p>Infine, puoi anche inserire espressioni come valori di <code>case</code>:</p><pre><code class="language-js">switch (20) {
  case 10 + 10:
    console.log("value is twenty");
    break;
}
</code></pre><p>Devi tuttavia tenere presente che il valore per un blocco <code>case</code> deve <strong>corrispondere esattamente</strong> all'argomento di <code>switch</code>.</p><p>Uno degli errori più comuni quando si utilizza l'istruzione <code>switch</code> è che si pensa che il valore di <code>case</code> venga valutato come vero o falso.</p><p>I seguenti blocchi <code>case</code> non funzioneranno nelle istruzioni <code>switch</code>:</p><pre><code class="language-js">let age = 5;

switch (age) {
  case age &lt; 10:
    console.log("Il valore è minore di 10");
    break;
  case age &lt; 20:
    console.log("Il valore è minore di 20");
    break;
  default:
    console.log("Il valore è maggiore o uguale a 20");
}
</code></pre><p>Devi ricordarti delle differenze rispetto a come <code>if</code> e <code>case</code> eseguono la valutazione della condizione di verifica:</p><ul><li>Il blocco <code>if</code> verrà eseguito quando la condizione di verifica viene soddisfatta (<strong>valutata come <code>true</code></strong>)</li><li>Il blocco <code>case</code> verrà eseguito quando la condizione di verifica <strong>corrisponde esattamente</strong> a quella data come argomento a &nbsp;<code>switch</code> </li></ul><!--kg-card-begin: markdown--><p><a name="11-4-casi-d-uso-dell-istruzione-switch-case"></a></p>
<h3 id="114casidusodellistruzioneswitchcase">11.4 - Casi d'uso dell'istruzione switch...case</h3>
<!--kg-card-end: markdown--><p>La regola empirica da considerare per scegliere tra <code>if</code> e <code>switch</code> è questa:</p><blockquote><em>Usi<em> <code>switch</code> </em>solo quando il codice risulta complicato da scrivere usando <code>if</code></em></blockquote><p>Ad esempio, supponiamo di voler scrivere il nome di un giorno della settimana in base al numero del giorno della settimana.</p><p>Ecco come puoi scriverlo:</p><pre><code class="language-js">let weekdayNumber = 1;

if (weekdayNumber === 0) {
  console.log("Domenica");
} else if (weekdayNumber === 1) {
  console.log("Lunedì");
} else if (weekdayNumber === 2) {
  console.log("Martedì");
} else if (weekdayNumber === 3) {
  console.log("Mercoledì");
} else if (weekdayNumber === 4) {
  console.log("Giovedì");
} else if (weekdayNumber === 5) {
  console.log("Venerdì");
} else if (weekdayNumber === 6) {
  console.log("Sabato");
} else {
  console.log("Numero di giorno non valido");
}
</code></pre><p>Non posso sapere tu cosa ne pensi, ma il codice qui sopra sembra decisamente complicato per me! Anche se non vi è nulla di sbagliato in quel codice, puoi abbellirlo usando <code>switch</code>:</p><pre><code class="language-js">let weekdayNumber = 1;

switch (weekdayNumber) {
  case 0:
    console.log("Domenica");
    break;
  case 1:
    console.log("Lunedì");
    break;
  case 2:
    console.log("Martedì");
    break;
  case 3:
    console.log("Mercoledì");
    break;
  case 4:
    console.log("Giovedì");
    break;
  case 5:
    console.log("Venerdì");
    break;
  case 6:
    console.log("Sabato");
    break;
  default:
    console.log("Il numero del giorno non è valido");
}
</code></pre><p>Quando hai molte condizioni da valutare per lo stesso blocco, puoi probabilmente combinare più condizioni <code>if</code> usando gli operatori logici <strong>E<strong> (<code>&amp;&amp;</code>)</strong></strong> oppure <strong><strong>O</strong> <strong>(<code>||</code>)</strong></strong>:</p><pre><code class="language-js">let myFood = "Banana";

if (myFood === "Banana" || myFood === "Mela") {
  console.log("Mangia frutta ogni giorno per mantenerti sano.");
}

if (myFood === "Torta al cioccolato"
  console.log("Goditi un dolce regalo.");
}
</code></pre><p>È possibile sostituire il codice precedente utilizzando l'istruzione <code>switch</code>. La chiave è che devi impilare più <code>case</code> come fosse uno, &nbsp;in questo modo:</p><pre><code class="language-js">let myFood = "Banana";

switch (myFood) {
  case "Banana":
  case "Mela":
    console.log("Mangia frutta ogni giorno per mantenerti sano.");
    break;
  case "Chocolate Cake":
    console.log("Goditi un dolce regalo.");
    break;
}
</code></pre><p>Sfortunatamente, <code>switch</code> non può sostituire più condizioni <code>if</code> che usano l'operatore <code>&amp;&amp;</code> visto il modo nel quale il processo di valutazione di <code>case</code> funziona. Devi usare un'istruzione <code>if</code> in quel caso.</p><h3 id="11-5-esercizio-nr-5"><strong>11.5 - Esercizio nr. 5</strong></h3><p>Una scuola elementare fornisce diversi premi in base al giudizio conseguito da uno studente:</p><ul><li>Gli studenti che hanno ricevuto una A avranno del cioccolato</li><li>Gli studenti che hanno ricevuto una B avranno un biscotto</li><li>Gli studenti che hanno ricevuto una C avranno una caramella</li><li>Per tutti gli altri giudizi stampa "Nessun premio da dare."</li></ul><p>Crea una variabile chiamata <code>giudizio</code> che conserverà la valutazione data allo studente.</p><p>Esempio dei possibili risultati a seconda del valore di <code>giudizio</code>:</p><pre><code class="language-txt">Hai ottenuto una A, eccoti del cioccolato!
Hai ottenuto una B, eccoti un biscotto!
Hai ottenuto una C, c'è spazio per migliorare, eccoti una caramella!
Nessun premio da dare

</code></pre><p>Puoi usare sia istruzioni &nbsp;<code>if...else</code> che <code>switch...case</code>.</p><!--kg-card-begin: markdown--><p><a name="12-flussi-di-controllo-cicli"></a></p>
<h2 id="12flussidicontrollocicli">12 - Flussi di controllo (cicli)</h2>
<!--kg-card-end: markdown--><p>Quando si programma un'applicazione in JavaScript, è spesso necessario scrivere una parte di codice che deve essere eseguita ripetutamente.</p><p>Diciamo che vuoi scrivere un programma che stampi i numeri da 1 a 10 nella console. Puoi farlo chiamando <code>console.log</code> 10 volte in questo modo:</p><pre><code class="language-js">console.log(1);
console.log(2);
console.log(3);
console.log(4);
console.log(5);

// e così via...
</code></pre><p>Funziona, ma c'è un modo migliore per scrivere questo tipo di attività ripetitiva.</p><p>Un'<strong>istruzione di ciclo (loop)</strong> è un'altra categoria di istruzione di flusso di controllo utilizzata per eseguire un blocco di codice più volte fintanto che viene soddisfatta una determinata condizione.</p><p>Esistono due istruzioni di ciclo utilizzate in JavaScript:</p><ul><li>L'istruzione <code>for</code></li><li>L'istruzione <code>while</code></li></ul><p>Impariamo come utilizzare queste istruzioni nella pratica.</p><h3 id="12-1-istruzione-for"><strong>12.1 - Istruzione for</strong></h3><p>Invece di ripetere te stesso 10 volte per stampare i numeri da 1 a 10, puoi usare l'istruzione <code>for</code> e scrivere solo una singola riga di codice come segue:</p><pre><code class="language-js">for (let x = 0; x &lt; 10; x++) {
  console.log(x);
}
</code></pre><p>Ecco qua! L'istruzione <code>for</code> è seguita da parentesi <code>()</code> all'interno delle quali ci sono 3 espressioni:</p><ul><li>L'espressione di <strong>inizializzazione</strong>, in cui si dichiari una variabile da utilizzare come origine della condizione del ciclo. Rappresentata come <code>x = 0</code> nell'esempio.</li><li>L'espressione di <strong>condizione</strong>, in cui la variabile nell'inizializzazione verrà valutata per una condizione specifica. Rappresentata come <code>x &lt; 10</code> nell'esempio.</li><li>L'espressione <strong>aritmetica</strong>, in cui il valore della variabile viene incrementato o decrementato alla fine di ogni ciclo.</li></ul><p>Queste espressioni sono separate da un punto e virgola (<code>;</code>).</p><p>Dopo le espressioni, le parentesi graffe <code>{}</code> verranno utilizzate per creare un blocco di codice che verrà eseguito da JavaScript fintanto che l'espressione della <strong>condizione</strong> restituisce <code>true</code>.</p><p>Puoi identificare a cosa corrispondono le espressioni prestando attenzione al punto e virgola (<code>;</code>) che termina l'istruzione.</p><pre><code class="language-js">for ( [inizializzazione]; [condizione]; [espressione aritmetica]) {
  // Fintanto che la condizione ritorna true,
  // Questo blocco verrà eseguito ripetutamente
}
</code></pre><p>L'espressione aritmetica può rappresentare un incremento (<code>++</code>) o un decremento (<code>--</code>) . Viene valutata ogni volta che l'esecuzione del blocco di codice all'interno delle parentesi graffe termina:</p><pre><code class="language-js">for (let x = 10; x &gt;= 1; x--) {
  console.log(x);
}
</code></pre><p>Puoi anche usare gli operatori scorciatoia aritmetici come <code>+=</code> e <code>-=</code> come mostrato qui sotto:</p><pre><code class="language-js">// Istruzione for con espressione scorciatoia aritmetica
for (let x = 1; x &lt; 20; x += 3) {
  console.log(x);
}
</code></pre><p>Qui, il valore di <code>x</code> sarà incrementato di 3 ogni volta che il ciclo viene eseguito.</p><p>Una volta terminato il ciclo, &nbsp;JavaScript continuerà a eseguire il codice che segue scritto al di fuori del corpo di <code>for</code>:</p><pre><code class="language-js">for (let x = 1; x &lt; 2; x++) {
  console.log(x);
}
console.log("Il ciclo for è terminato");
console.log("Continua l'esecuzione del codice");
</code></pre><h3 id="12-2-quando-usare-un-ciclo-for"><strong>12.2 - Quando usare un ciclo for</strong></h3><p>Il ciclo <code>for</code> è utile <strong>quando sai quante volte</strong> devi eseguire un'attività ripetitiva.</p><p>Ad esempio, supponiamo che tu stia scrivendo un programma per lanciare una moneta. Devi trovare quante volte esce testa quando la moneta viene lanciata 10 volte. Puoi farlo usando il metodo <code>Math.random</code>:</p><ul><li>Quando il numero è inferiore a 0,5 è necessario incrementare il contatore della variabile <code>tails</code> (croce).</li><li>Quando il numero è pari o superiore a 0,5, è necessario incrementare il contatore della variabile <code>heads</code> (testa)</li></ul><pre><code class="language-js">let heads = 0;
let tails = 0;
for (x = 1; x &lt;= 10; x++) {
  if (Math.random() &lt; 0.5) {
    tails++;
  } else {
    heads++;
  }
}

console.log("La moneta è stata lanciata 10 volte");
console.log(`Numero di volte in cui è uscito testa: ${heads}`);
console.log(`Numero di volte in cui è uscito croce: ${tails}`);
</code></pre><p>L'esempio qui sopra mostra dove il ciclo <code>for</code> offre l'approccio più efficace.</p><p>Ora vediamo un esercizio alternativo di lancio della moneta in cui il ciclo <code>for</code> non è efficace:</p><p><strong>Scopri quante volte devi lanciare una moneta finché non esce testa.</strong></p><p>Questa volta non sai <strong>quante volte</strong> devi lanciare la moneta. Qui è dove devi usare l'istruzione di ciclo <code>while</code>, che imparerai nella prossima sezione.</p><h3 id="12-3-istruzione-while"><strong>12.3 - Istruzione while</strong></h3><p>L'istruzione <code>while</code> o ciclo <code>while</code> viene utilizzato per eseguire un blocco di codice fintanto che la condizione restituisce <code>true</code>.</p><p>Puoi definire la condizione e l'istruzione per il ciclo come segue:</p><pre><code class="language-js">while (condizione) {
  istruzione;
}
</code></pre><p>Proprio come il ciclo <code>for</code>, il ciclo <code>while</code> viene utilizzato per eseguire ripetutamente un pezzo di codice finché la condizione indicata risulta vera.</p><p>Nell'esempio seguente, il blocco di istruzioni verrà eseguito fino a quando l'espressione della condizione non restituirà <code>false</code>:</p><pre><code class="language-js">let i = 0;

while (i &lt; 6) {
  console.log(`Il valore di i = ${i}`);
  i++;
}
</code></pre><p>Qui, il ciclo <code>while</code> stamperà ripetutamente il valore di <code>i</code> finché <code>i</code> è minore di 6. In ogni iterazione, il valore di <code>i</code> viene incrementato di 1 finché non raggiunge 6 e il ciclo termina.</p><p>Tieni presente che devi includere un pezzo di codice che prima o poi trasformi la condizione di valutazione in <code>false</code> o il ciclo while verrà eseguito per sempre. L'esempio seguente causerà un ciclo infinito:</p><pre><code class="language-js">let i = 0;

while (i &lt; 6) {
  console.log(`Il valore di i = ${i}`);
}
</code></pre><p>Visto che il valore di <code>i</code> non cambia mai, il ciclo <code>while</code> continuerà per sempre!</p><h3 id="12-4-quando-usare-un-ciclo-while"><strong>12.4 - Quando usare un ciclo while</strong></h3><p>Visto che entrambi <code>while</code> e <code>for</code> possono essere usati per eseguire ripetutamente un pezzo di codice, quando dovresti usare un ciclo <code>while</code> invece di <code>for</code>?</p><p>Un modo semplice per sapere quando dovresti usare <code>while</code> è quando <strong>non sai quante volte</strong> devi eseguire il codice.</p><p>Tornando all'esempio del lancio della moneta, c'è un caso che è perfetto per un ciclo <code>while</code>:</p><p><strong>Scopri quante volte devi lanciare una moneta finché non esce testa.</strong></p><p>Devi anche <strong>mostrare quante volte</strong> lanci la moneta finché non esce testa:</p><pre><code class="language-js">let flips = 0;
let isHeads = false;

while (!isHeads) {
  flips++;
  isHeads = Math.random() &lt; 0.5;
}

console.log(`Ci sono voluti ${flips} lanci per ottenere testa.`);
</code></pre><p>Qui la condizione <code>isHead = Math.random() &lt; 0.5</code> simula il lancio di una moneta. Quando il risultato è <code>true</code>, vuol dire che si è ottenuto testa e il ciclo sarà terminato.</p><p>Visto che non sai quanto volte dovrai eseguire il ciclo prima che esca testa, devi usare un ciclo <code>while</code> invece che un ciclo <code>for</code>.</p><h3 id="12-5-esercizio-nr-6">12.5 - Esercizio nr. 6</h3><p>Scrivi un programma che stampi una mezza piramide usando gli asterischi <code>*</code> , il cui risultato è mostrato qui sotto:</p><pre><code class="language-txt">*
**
***
****
*****
</code></pre><p>Poi stampa una mezza piramide rovesciata, come segue:</p><pre><code class="language-txt">*****
****
***
**
*
</code></pre><h2 id="13-funzioni"><strong>13 - Funzioni</strong></h2><p>Una funzione è semplicemente una sezione (o un blocco) di codice scritto per eseguire un'attività specifica.</p><p>Ad esempio, la funzione di conversione di tipo <code>String()</code> viene utilizzata per convertire i dati di un altro tipo in una stringa.</p><p>Anche <code>console.log()</code> e vari metodi di array che abbiamo imparato nei capitoli precedenti sono funzioni. Ma poiché queste funzioni vengono invocate da un oggetto, vengono chiamate metodi.</p><p>Imparerai di più sui metodi più avanti nel <a href="#14-oggetti">capitolo 14</a>. Per ora, sappi solo che una funzione e un metodo sono essenzialmente la stessa cosa, tranne per il fatto che un metodo viene chiamato da un oggetto.</p><p>Oltre alle funzioni integrate fornite da JavaScript, puoi anche creare una tua funzione.</p><h3 id="13-1-come-creare-la-tua-funzione"><strong>13.1 - Come creare la tua funzione</strong></h3><p>La creazione di una funzione inizia con la digitazione della parola chiave <code>function</code> seguita dal nome della funzione, una coppia di parentesi tonde, quindi una coppia di parentesi graffe.</p><p>Ecco un esempio:</p><pre><code class="language-js">function greet() {
  // Qui il corpo della funzione
  console.log("Ciao!");
}
</code></pre><p>Per chiamare una funzione, devi specificarne il nome seguito dalle parentesi tonde:</p><pre><code class="language-js">greet(); // Ciao!
</code></pre><p>Il codice all'interno della funzione viene eseguito quando chiami la funzione.</p><h3 id="13-2-parametri-e-argomenti-della-funzione"><strong>13.2 - Parametri e argomenti della funzione</strong></h3><p>I parametri sono variabili utilizzate per accettare input forniti quando viene chiamata la funzione.</p><p>È possibile specificare i parametri nell'intestazione della funzione, all'interno delle parentesi tonde.</p><p>L'esempio seguente mostra una funzione che ha un parametro chiamato <code>name</code>:</p><pre><code class="language-js">function greet(name) {
  // corpo della funzione
}
</code></pre><p>Come userai il parametro <code>name</code> all'interno della funzione è una tua decisione.</p><p>Potresti usare il parametro all'interno di una funzione <code>print()</code>, in questo modo:</p><pre><code class="language-js">function greet(name) {
  console.log(`Ciao, ${name}!`);
  console.log("Bel tempo oggi, non è vero?");
}
</code></pre><p>Ora ogni volta che devi chiamare la funzione <code>greet()</code>, devi passare un valore per il parametro <code>name</code>.</p><p>Il valore che hai passato per il parametro viene detto argomento, ecco come fare:</p><pre><code class="language-js">greet("Peter");
</code></pre><p>La stringa 'Peter' all'interno delle parentesi quando chiami la funzione verrà passata come valore del parametro <code>name</code>.</p><p>Esegui il codice e otterrai questo risultato:</p><pre><code class="language-txt">Ciao, Peter!
Bel tempo oggi, non è vero?
</code></pre><p>Puoi avere più di un parametro quando definisci la funzione, ma devi separare ciascun parametro con un virgola, come segue:</p><pre><code class="language-js">function greet(name, weather) {
  console.log(`Ciao, ${name}!`);
  console.log(`Oggi è ${weather}, non è vero?`);
}

greet("Nathan", "piovoso");
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">Ciao, Nathan!
Oggi è piovoso, non è vero?
</code></pre><p>Quando specifichi due parametri nell'intestazione della funzione, è necessario passare due argomenti. Se chiami la funzione senza passare gli argomenti, il valore sarà <code>undefined</code>.</p><p>Nella sezione successiva imparerai come creare parametri con valori predefiniti, che ti consentono di chiamare la funzione senza doverle passare un argomento.</p><p>Per ora, spero che tu veda la comodità di avere parametri. Rendono le tue funzioni più adattabili e riutilizzabili ricevendo diversi valori per coprire una varietà di scenari che la funzione potrebbe rappresentare.</p><p>Come mostrato nell'esempio, i parametri <code>name</code> (nome) e <code>weather</code> (tempo) ti consentono di salutare molte persone diverse in condizioni meteorologiche diverse.</p><p>Che sia soleggiato, piovoso o nuvoloso, basta cambiare <code>name</code> e <code>weather</code> quando vuoi salutare un'altra persona.</p><h3 id="13-3-parametri-predefiniti"><strong>13.3 - Parametri predefiniti</strong></h3><p>Quando definisci una funzione, puoi impostare un valore predefinito per qualsiasi parametro in quella funzione.</p><p>Per esempio il parametro <code>name</code> nella funzione qui sotto è un parametro predefinito:</p><pre><code class="language-js">function greet(name = "Nathan") {
  console.log(`Ciao ${name}!`);
  console.log("Bel tempo oggi, non è vero?");
}
</code></pre><p>Qui il valore predefinito 'Nathan' verrà usato se nessun valore oppure <code>undefined</code> viene passato per il parametro <code>name</code>.</p><p>Puoi verificarlo chiamando la funzione <code>greet()</code> senza argomento, in questo modo:</p><pre><code class="language-js">greet();
greet("Jack");
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">Ciao, Nathan!
Bel tempo oggi, non è vero?

Ciao, Jack!
Bel tempo oggi, non è vero?
</code></pre><p>Qualunque funzione tu definisca, può avere un misto di parametri predefiniti e non predefiniti.</p><p>Ecco un'altro esempio di una funzione con un parametro predefinito (<code>name</code>) e uno non predefinito (<code>weather</code>):</p><pre><code class="language-js">function greet(weather, name = "Nathan") {
  console.log(`Ciao, ${name}!`);
  console.log(`Oggi è ${weather}, non è vero?`);
}

greet("soleggiato");
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">Ciao, Nathan!
Oggi è soleggiato, non è vero?
</code></pre><p>Nota che il parametro <code>weather</code> è stato posizionato davanti al parametro <code>name</code>. Questo è per comodità in modo che non sia necessario specificare il parametro predefinito.</p><p>Se inserisci il parametro non predefinito dopo il parametro predefinito, devi passare un valore al parametro <code>name</code> per arrivare al parametro <code>weather</code>.</p><p>Considera l'esempio seguente:</p><pre><code class="language-js">function greet(name = "Nathan", weather) {
  console.log(`Ciao, ${name}!`);
  console.log(`Oggi è ${weather}, non è vero?`);
}

greet(undefined, "sunny");
</code></pre><p>Per passare un argomento al parametro &nbsp;<code>weather</code> , devi prima passare <code>undefined</code> o un altro valore al parametro <code>name</code>.</p><p>Ecco perché è meglio specificare i parametri non definiti prima di quelli predefiniti.</p><h3 id="13-4-parametri-predefiniti-e-null"><strong>13.4 - Parametri predefiniti e null</strong></h3><p>Se ricordi, nella <a href="#7-5-null">sezione 7.5</a> abbiamo esplorato brevemente la differenza tra <code>undefined</code> come valore vuoto "predefinito" e <code>null</code> come valore vuoto "intenzionale".</p><p>Quando a una funzione si passa <code>undefined</code> per un parametro predefinito, verrà utilizzato il valore del parametro predefinito:</p><pre><code class="language-js">function greet(name = "John"){
  console.log(name);
}

greet(undefined); // John
</code></pre><p>Come puoi vedere, JavaScript stampa il valore del parametro predefinito "John" quando passi <code>undefined</code> alla funzione.</p><p>Ma quando passi <code>null</code> alla funzione, il parametro predefinito verrà ignorato:</p><pre><code class="language-js">function greet(name = "John"){
  console.log(name);
}

greet(null); // null
</code></pre><p>Questo è uno degli errori più comuni che commettono i principianti quando imparano JavaScript. Quando usi il valore <code>null</code>, JavaScript penserà che vuoi che quel valore sia vuoto, quindi non sostituisce il valore con il parametro predefinito.</p><p>Quando utilizzi <code>undefined</code>, JavaScript lo sostituirà con il parametro predefinito. Potresti riscontrare questo problema mentre lavori con il codice JavaScript nella tua carriera, quindi tienilo a mente.</p><h3 id="13-5-istruzione-return"><strong>13.5 - Istruzione return</strong></h3><p>Una funzione può anche avere un'istruzione <code>return</code> all'interno del blocco di codice. Un'istruzione <code>return</code> viene utilizzata per restituire un valore al chiamante.</p><p>Ad esempio, la seguente funzione restituisce la somma di due valori:</p><pre><code class="language-js">function sum(a, b) {
  return a + b;
}

let result = sum(3, 2);
console.log(result); // 5
</code></pre><p>Il valore restituito da una funzione può essere assegnato a una variabile per ulteriori operazioni. Puoi aggiungere l'istruzione <code>return</code> ovunque all'interno della funzione.</p><p>Quando JavaScript raggiunge l'istruzione <code>return</code>, salta l'ulteriore codice scritto all'interno del blocco funzione e torna al punto in cui chiami la funzione.</p><p>La seguente funzione ha due istruzioni return:</p><pre><code class="language-js">function checkAge(age) {
  if (age &gt; 18) {
    return "Puoi prendere la patente";
  }
  return "Non puoi ancora prendere la patente";
}

console.log(checkAge(20));
console.log(checkAge(15));
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">Puoi prendere la patente
Non puoi ancora prendere la patente</code></pre><p>Quando chiamiamo la funzione <code>checkAge()</code> la prima volta, il valore dell'argomento <code>age</code> (età) è maggiore di 18, quindi JavaScript esegue l'istruzione <code>return</code> all'interno del blocco <code>if</code>.</p><p>La seconda volta che abbiamo chiamato la funzione, la condizione <code>if</code> non è soddisfatta, quindi JavaScript esegue invece l'istruzione <code>return</code> sotto il blocco <code>if</code>.</p><p>Puoi anche interrompere l'esecuzione di una funzione e tornare al chiamante specificando l'istruzione <code>return</code> senza alcun valore:</p><pre><code class="language-js">function greet() {
  console.log("Ciao!");
  return;
  console.log("Arriverderci!!");
}

greet()
</code></pre><p><strong>Risultato</strong>:</p><pre><code class="language-txt">Ciao!
</code></pre><p>Qui, l'istruzione <code>return</code> viene invocata tra le chiamate delle funzioni <code>console.log()</code>.</p><p>JavaScript esegue la prima chiamata di <code>console.log()</code>, quindi salta il resto del codice. La stringa 'Arrivederci!' non viene stampata.</p><h3 id="13-6-ambito-di-una-variabile"><strong>13.6 - Ambito di una variabile</strong></h3><p>Ora che stai imparando le funzioni, è un buon momento per parlare dell'ambito di una variabile.</p><p>Una variabile dichiarata all'interno di una funzione è accessibile solo da quella funzione. Questo perché quella variabile ha un ambito locale.</p><p>D'altro canto, una variabile dichiarata al di fuori di qualsiasi blocco è nota come variabile globale a causa del suo ambito globale.</p><p>Questi due ambiti sono importanti perché quando provi ad accedere a una variabile locale al di fuori del suo ambito, riceverai un errore. Per esempio:</p><pre><code class="language-js">function greet() {
  let myString = "Hello World!";
}

greet();
console.log(myString);
</code></pre><p>Quando esegui il codice qui sopra JavaScript risponde con un errore, dicendo che la variabile <code>myString</code> non è definita:</p><pre><code class="language-txt">ReferenceError: myString is not defined
</code></pre><p>Questo perché la variabile <code>myString</code> è dichiarata all'interno della funzione <code>greet()</code>, quindi non puoi accedere a quella variabile al di fuori di essa. Non importa anche se hai chiamato quella funzione prima di accedere alla variabile.</p><p>Viceversa, è possibile accedere a una variabile globale da qualsiasi punto, anche all'interno di una funzione:</p><pre><code class="language-js">let myString = "Hello World!";

function greet() {
  console.log(myString);
}

greet(); // Hello World!
</code></pre><p>Qui, la funzione <code>greet()</code> è in grado di accedere alla variabile <code>myString</code> dichiarata al di fuori della funzione.</p><p>Tieni presente che questo vale solo per le variabili dichiarate usando <code>let</code> e <code>const</code>.</p><p>Puoi anche definire una variabile locale con lo stesso nome della variabile globale senza sovrascriverla.</p><p>Ecco un esempio:</p><pre><code class="language-js">let myString = "Hello World!";

function greet() {
  let myString = "Morning!";
  console.log(myString);
}

greet();  // Morning!
console.log(myString); // Hello World!
</code></pre><p>Quando chiami la funzione <code>greet()</code>, alla variabile locale chiamata <code>myString</code> è stata assegnata la stringa 'Morning!'.</p><p>Al di fuori della funzione, la variabile globale anch'essa chiamata <code>myString</code> esiste ancora e il valore non viene modificato.</p><p>JavaScript considera la variabile di ambito locale come una variabile diversa. Quando dichiari la stessa variabile all'interno di una funzione, qualsiasi codice all'interno della funzione farà sempre riferimento alla variabile locale.</p><p>In pratica, raramente è necessario dichiarare una variabile con lo stesso nome in ambiti diversi:</p><ul><li>Qualsiasi variabile dichiarata all'esterno di una funzione non dovrebbe essere utilizzata all'interno di una funzione senza passarla come parametro.</li><li>Una variabile dichiarata all'interno di una funzione non dovrebbe mai riferirsi al di fuori di tale funzione</li></ul><p>Tienilo a mente quando scrivi funzioni JavaScript.</p><h3 id="13-7-parametro-rest"><strong>13.7 - Parametro rest</strong></h3><p>Il parametro rest è un parametro che può accettare qualsiasi numero di dati come argomenti. Gli argomenti verranno memorizzati come un array.</p><p>È possibile definire un parametro rest nell'intestazione della funzione aggiungendo tre punti <code>...</code> prima del nome del parametro.</p><p>Ecco un esempio di creazione di una funzione che ha un argomento di lunghezza variabile:</p><pre><code class="language-js">function printArguments(...args){
    console.log(args);
}
</code></pre><p>Quando si chiama la funzione &nbsp;<code>printArguments()</code> qui sopra, puoi specificare tanti argomenti quanti ne vuoi:</p><pre><code class="language-js">function printArguments(...args){
    console.log(args);
}

printArguments("A", "B", "C"); 
// [ 'A', 'B', 'C' ]
printArguments(1, 2, 3, 4, 5);
// [ 1, 2, 3, 4, 5 ]
</code></pre><p>Tieni presente che una funzione può avere solo un parametro rest e il parametro rest deve essere l'ultimo parametro nella funzione.</p><p>Puoi utilizzare un parametro rest quando la tua funzione deve lavorare con un numero indefinito di argomenti.</p><h3 id="13-8-funzione-freccia"><strong>13.8 - Funzione freccia</strong></h3><p>La <strong>sintassi della funzione freccia</strong> consente di scrivere una funzione JavaScript con una sintassi più breve e concisa.</p><p>Quando è necessario creare una funzione, il metodo principale consiste nell'utilizzare la parola chiave <code>function</code> seguita dal nome della funzione come mostrato di seguito:</p><pre><code class="language-js">function greetings(name) {
  console.log(`Hello, ${name}!`);
}

greetings("John"); // Hello, John!
</code></pre><p>La sintassi della funzione freccia consente la creazione di una espressione funzione che produce lo stesso risultato del codice qui sopra.</p><p>Ecco la funzione <code>greetings()</code> riscritta usando la sintassi freccia:</p><pre><code class="language-js">const greetings = (name) =&gt; {
  console.log(`Hello, ${name}!`);
};

greetings("John"); // Hello, John!
</code></pre><p>Quando crei una funzione usando la sintassi freccia, devi assegnare l'espressione a una variabile in modo che la funzione abbia un nome.</p><p>Fondamentalmente, la sintassi della funzione freccia è la seguente:</p><pre><code class="language-js">const nomeFunzione = (param1, param2, ...) =&gt; {
  // corpo della funzione
}
</code></pre><p>Nella descrizione generica della funzione freccia qui sopra,</p><ul><li><code>nomeFunzione</code> è il nome della variabile alla quale viene assegnata la funzione. Puoi chiamare la funzione successivamente nel tuo codice con <code>nomeFunzione()</code>.</li><li><code>(param1, param2, ...)</code> sono i parametri della funzione. Puoi definire tanti parametri quanti sono necessari alla funzione.</li><li>di seguito la freccia <code>=&gt;</code> che indica l'inizio della funzione.</li></ul><p>Il codice qui sopra equivale a scrivere:</p><pre><code class="language-js">const nomeFunzione = function(param1, param2, ...) {
  // corpo della funzione
}
</code></pre><p>La sintassi della funzione freccia non aggiunge nuove capacità al linguaggio.</p><p>Viceversa offre un miglioramento nel modo nel quale scrivi una funzione in JavaScript.</p><p>Sulle prime potrebbe sembrare strano, se sei abituato a utilizzare la parola chiave <code>function</code>.</p><p>Ma quando inizi a usare la sintassi della freccia, vedrai che è molto comodo e più facile da scrivere.</p><!--kg-card-begin: markdown--><p><a name="13-9-funzioni-freccia-su-singola-riga-o-più-righe"></a></p>
<h3 id="139funzionifrecciasusingolarigaopirighe">13.9 - Funzioni freccia su singola riga o più righe</h3>
<!--kg-card-end: markdown--><p>La funzione freccia ti fornisce un modo per scrivere una funzione su riga singola in cui il lato destro della freccia <code>=&gt;</code> viene restituito al lato sinistro.</p><p>Quando usi la parola chiave <code>function</code>, devi usare le parentesi graffe <code>{}</code> e la parola chiave <code>return</code> come segue:</p><pre><code class="language-js">function plusTwo(num) {
  return num + 2;
}
</code></pre><p>Usando la funzione freccia, puoi omettere sia le parentesi graffe che la parola chiave <code>return</code>, creando una funzione su una sola riga, come segue:</p><pre><code class="language-js">const plusTwo = (num) =&gt; num + 2;
</code></pre><p>Senza le parentesi graffe, JavaScript valuta l'espressione alla destra della freccia e la ritorna al chiamante.</p><p>La sintassi della funzione freccia va bene anche per funzioni che non ritornano un valore, come mostrato qui sotto:</p><pre><code class="language-js">const greetings = () =&gt; console.log("Hello World!");
</code></pre><p>Quando usi la sintassi della funzione freccia, le parentesi graffe sono richieste solo quando il corpo della funzione è composto da più righe:</p><pre><code class="language-js">const greetings = () =&gt; {
  console.log("Hello World!");
  console.log("How are you?");
};
</code></pre><h3 id="13-10-funzione-freccia-senza-parentesi-tonde"><strong>13.10 Funzione freccia senza parentesi tonde</strong></h3><p>Le parentesi tonde <code>()</code> sono usate nelle funzioni &nbsp;JavaScript per contenere i parametri che può ricevere la funzione.</p><p>Quando usi la parola chiave <code>function</code> , le parentesi tonde sono richieste:</p><pre><code class="language-js">function plusThree(num) {
  return num + 3;
}
</code></pre><p>La funzione freccia, viceversa, consente di omettere le parentesi tonde quando la funzione ha <strong>esattamente un solo parametro</strong>.</p><p>Questo codice di esempio è una espressione di funzione freccia valida:</p><pre><code class="language-js">const plusThree = num =&gt; num + 3;
</code></pre><p>Come puoi vedere si possono eliminare la parentesi tonde e graffe, così come la parola chiave <code>return</code>.</p><p>Devi tuttavia usare la parentesi tonde quando si verificano le seguenti condizioni:</p><ul><li>la funzione non ha parametri</li><li>la funzione ha più di un parametro</li></ul><p>Quando non hai parametri, devi usare le parentesi tonde, in questo modo:</p><pre><code class="language-js">const greetings = () =&gt; console.log("Hello World!");
</code></pre><p>Lo stesso vale se hai più di un parametro.</p><p>La funzione che segue ha due parametri: <code>name</code> e <code>age</code>.</p><pre><code class="language-js">const greetings = (name, age) =&gt; console.log("Hello World!");
</code></pre><p>La sintassi della funzione freccia rende le parentesi tonde opzionali quando hai una funzione con un solo parametro.</p><h3 id="13-11-la-funzione-freccia-non-ha-associazione-con-arguments"><strong>13.11 - La funzione freccia non ha associazione con <code>arguments</code></strong></h3><p>Quando usi la parola chiave &nbsp;<code>function</code> per definire una funzione, puoi accedere agli argomenti che riceve usando la parola chiave <code>arguments</code>, così:</p><pre><code class="language-js">const printArgs = function () {
  console.log(arguments);
};

printArgs(1, 2, 3);
// [Arguments] { '0': 1, '1': 2, '2': 3 }
</code></pre><p>Nel codice qui sopra, la parola chiave <code>arguments</code> fa riferimento all'oggetto che conserva tutti gli argomenti passati alla funzione.</p><p>Al contrario, la funzione freccia non ha l'oggetto <code>arguments</code> e darà errore quando tenti di accedervi:</p><pre><code class="language-js">const printArgs = () =&gt; console.log(arguments);

printArgs(1, 2, 3);
//Uncaught ReferenceError: arguments is not defined 
//Errore di riferimento non gestito: arguments non è definito
</code></pre><p>Puoi usare la sintassi JavaScript spread per imitare l'associazione con <code>arguments</code> come segue:</p><pre><code class="language-js">const printArgs = (...arguments) =&gt; console.log(arguments);

printArgs(1, 2, 3);
// [1, 2, 3]
</code></pre><p>Utilizzando la sintassi spread, gli argomenti passati alla funzione freccia verranno memorizzati in un array.</p><p>Nota che se usi la sintassi spread hai bisogno delle parentesi tonde anche se stai passando solo un argomento alla funzione.</p><p>È possibile accedere agli argomenti ricevuti con la notazione dell'indice dell'array come <code>arguments[0]</code>, <code>arguments[1]</code> nell'esempio e così via.</p><h3 id="13-12-convertire-facilmente-una-funzione-normale-in-funzione-freccia"><strong>13.12 - Convertire facilmente una funzione normale in &nbsp;funzione freccia</strong></h3><p>Puoi seguire <strong>tre semplici passaggi</strong> per convertire una funzione normale in funzione freccia:</p><ol><li>Sostituisci la parola chiave <code>function</code> con una dichiarazione di variabile <code>let</code> o <code>const</code>.</li><li>Aggiungi il simbolo <code>=</code> dopo il nome della funzione e prima delle parentesi tonde.</li><li>Aggiungi il simbolo <code>=&gt;</code> dopo le parentesi tonde.</li></ol><p>Il codice qui sotto ti aiuterà a visualizzare i passaggi:</p><pre><code class="language-js">function plusTwo(num) {
  return num + 2;
}

// step 1: sostituisci function con let / const
const plusTwo(num) {
  return num + 2;
}

// step 2: aggiungi = dopo il nome della funzione
const plusTwo = (num) {
  return num + 2;
}

// step 3: aggiungi =&gt; dopo le parentesi tonde
const plusTwo = (num) =&gt; {
  return num + 2;
}
</code></pre><p>I tre passaggi precedenti sono sufficienti per convertire qualsiasi vecchia sintassi della funzione JavaScript nella nuova sintassi della funzione freccia.</p><p>Quando hai una funzione su riga singola, c'è un quarto passaggio facoltativo per rimuovere le parentesi graffe e la parola chiave <code>return</code> come segue:</p><pre><code class="language-js">// da così
const plusTwo = num =&gt; {
  return num + 2;
};

// a così
const plusTwo = num =&gt; num + 2;
</code></pre><p>Quando hai esattamente un solo parametro puoi anche rimuovere le parentesi tonde:</p><pre><code class="language-js">// da così
const plusTwo = (num) =&gt; num + 2;

// a così
const plusTwo = num =&gt; num + 2;
</code></pre><p>Tuttavia gli ultimi due passaggi sono opzionali. Solo i primi tre sono necessari per convertire qualunque funzione scritta con <code>function</code> e usare la sintassi della funzione freccia.</p><h3 id="13-13-esercizio-nr-7"><strong>13.13 Esercizio nr. 7</strong></h3><p>Scrivi una funzione chiamata <code>calcolaQuadrato()</code> che viene utilizzata per calcolare l'area e il perimetro di una forma quadrata.</p><p>La funzione accetta un solo parametro (<code>lato</code>), che rappresenta il lato del quadrato.</p><p>La formula per calcolare l'area è &nbsp;<code>lato * lato</code> e la formula per calcolare il perimetro è <code>4 * lato</code></p><p>Il risultato che mostra la dimensione del lato, l'area e il perimetro potrebbe essere come segue se l'argomento del parametro <code>lato</code> è 8:</p><pre><code class="language-txt">Il lato del quadrato è 8
L'area del quadrato è 64
Il perimetro del quadrato è 32
</code></pre><h2 id="14-oggetti"><strong>14 - Oggetti</strong></h2><p>Un oggetto è un tipo di dato speciale che consente di memorizzare più di un valore, proprio come un array.</p><p>La differenza tra un oggetto e un array è che un array memorizza i dati come un elenco di elementi, mentre un oggetto memorizza i dati nel formato di coppia <code>chiave:valore</code>.</p><p>Vediamo un esempio che illustra questa differenza. Supponi di voler memorizzare informazioni su un libro nel tuo programma.</p><p>Usare variabili normali, sarebbe simile a questo:</p><pre><code class="language-js">let titoloLibro = "JavaScript Introduction";
let autoreLibro = "Nathan Sebhastian";
</code></pre><p>Questo va bene ma non è certo il modo migliore per memorizzare valori in relazione tra loro.</p><p>Un altro modo di conservare il valore sarebbe usare un array:</p><pre><code class="language-js">let mioLibro = ["JavaScript Introduction", "Nathan Sebhastian"];
</code></pre><p>Questo è certamente meglio in quanto puoi raggruppare i dati correlati, ma non hai modo di aggiungere contesto al valore.</p><p>Ecco quando torna utile un oggetto. Puoi dichiarare un oggetto che rappresenta un singolo libro e conservare i dati nel formato <code>chiave:valore</code>:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};
</code></pre><p>Un oggetto viene dichiarato utilizzando le parentesi graffe <code>{}</code> e ogni elemento all'interno delle parentesi è scritto nel formato <code>chiave:valore</code>.</p><p>Un elemento di un oggetto è anche noto come proprietà, con la <em>chiave</em> che rappresenta il nome della proprietà e il <em>valore</em> il contenuto della proprietà.</p><p>Come un array, devi separare ogni elemento all'interno di un oggetto usando una virgola.</p><p>Puoi assegnare una stringa o numeri come chiave di un elemento e puoi assegnare qualsiasi tipo di dato come valore, inclusa una funzione:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
  descrizione: function () {
    console.log(`Titolo: ${this.titolo}`);
    console.log(`Autore: ${this.autore}`);
  },
};
</code></pre><p>Qui, la chiave <code>descrizione</code> è una funzione che stampa il valore di <code>titolo</code> e <code>autore</code> dall'oggetto.</p><p>La parola chiave <code>this</code> si riferisce al contesto del codice, che in questo caso è l'oggetto <code>mioLibro</code>.</p><p>Di solito, la chiave in un oggetto è qualcosa che fornisce più contesto al valore che contiene. Una chiave deve anche essere univoca, quindi non puoi usare la stessa chiave due volte nello stesso oggetto.</p><p>Ad esempio, se disponi di dati su un libro, puoi utilizzare chiavi come <code>titolo</code>, <code>autore</code> e <code>prezzo</code> per aiutarti a comprendere il contesto del valore memorizzato in ciascuna chiave.</p><h3 id="14-1-accedere-ai-valori"><strong>14.1 - Accedere ai valori</strong></h3><p>Per accedere ai valori di un oggetto puoi utilizzare la notazione punto (<code>.</code>) oppure le parentesi quadre <code>[]</code>.</p><p>Ecco un esempio di accesso alle proprietà di un oggetto usando la notazione punto:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};

console.log(mioLibro.titolo);
console.log(mioLibro.autore);
</code></pre><p>Ecco come usare le parentesi quadre per accedere alle stesse proprietà:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};

console.log(mioLibro["titolo"]);
console.log(mioLibro["autore"]);

</code></pre><p>Ricorda che devi racchiudere il nome della proprietà tra apici, come una stringa, altrimenti &nbsp;JavaScript penserà che stai passando una variabile all'interno delle parentesi quadre.</p><!--kg-card-begin: markdown--><p><a name="14-2-aggiungere-una-nuova-proprieta"></a></p>
<h3 id="142aggiungereunanuovapropriet">14.2 - Aggiungere una nuova proprietà</h3>
<!--kg-card-end: markdown--><p>Puoi aggiungere una nuova proprietà a un oggetto usando sia la notazione punto che le parentesi quadre, così:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};

// aggiunge la proprietà anno di pubblicazione
mioLibro.anno = 2023;

// aggiunge la proprietà editore
mioLibro["editore"] = "CodeWithNathan";

console.log(mioLibro);
</code></pre><p>Quando stampi l'oggetto, ecco il risultato:</p><pre><code class="language-txt">{
  titolo: 'JavaScript Introduction',
  autore: 'Nathan Sebhastian',
  anno: 2023,
  editore: 'CodeWithNathan'
}
</code></pre><p>Puoi aggiungere tante proprietà quante necessarie allo stesso oggetto.</p><!--kg-card-begin: markdown--><p><a name="14-3-modificare-una-proprieta"></a></p>
<h3 id="143modificareunapropriet">14.3 - Modificare una proprietà</h3>
<!--kg-card-end: markdown--><p>Per modificare una proprietà esistente, devi specificarla con la notazione punto o con le parentesi quadre, quindi aggiungere l'operatore di assegnazione e il nuovo valore, in questo modo:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};

// modifica il valore della proprietà autore
mioLibro.autore = "John Doe";

console.log(mioLibro);
</code></pre><p><strong>Risultato</strong>:</p><pre><code class="language-txt">{
  titolo: 'JavaScript Introduction',
  autore: 'John Doe'
}
</code></pre><p>Come puoi vedere, il &nbsp;valore della proprietà <code>autore</code> è stato modificato.</p><!--kg-card-begin: markdown--><p><a name="14-4-eliminare-una-proprieta"></a></p>
<h3 id="144eliminareunapropriet">14.4 - Eliminare una proprietà</h3>
<!--kg-card-end: markdown--><p>Per eliminare una proprietà da un oggetto devi usare <code>delete</code> in questo modo:</p><pre><code class="language-js">let mioLibro = {
  titolo: "JavaScript Introduction",
  autore: "Nathan Sebhastian",
};

delete mioLibro.autore;

console.log(mioLibro);
</code></pre><p><strong>Risultato<strong>:</strong></strong></p><pre><code class="language-txt">{ titolo: 'JavaScript Introduction' }
</code></pre><p>Quando cerchi di accedere alla proprietà cancellata (o a una proprietà che non esiste), otterrai il valore <code>undefined</code>.</p><!--kg-card-begin: markdown--><p><a name="14-5-verificare-se-esiste-una-proprieta"></a></p>
<h3 id="145verificareseesisteunapropriet">14.5 Verificare se esiste una proprietà</h3>
<!--kg-card-end: markdown--><p>Per verificare se una data proprietà esiste nel tuo oggetto puoi usare l'operatore <code>in</code>, così:</p><pre><code class="language-js">nomeProprietà in mioOggetto
</code></pre><p>L'operatore <code>in</code> ritorna <code>true</code> se <code>nomeProprietà</code> esiste nel tuo oggetto.</p><p>Di seguito un esempio:</p><pre><code class="language-js">let persona = {
  nomeProprio: "Nathan",
  cognome: "Sebhastian"
}

// verifica se esiste 'nomeProprio'
console.log('nomeProprio' in persona); // true

// verifica se esiste 'eta'
console.log('eta' in persona); // false
</code></pre><p>Ora sai come manipolare gli oggetti JavaScript.</p><h3 id="14-6-esercizio-nr-8"><strong>14.6 - Esercizio nr. 8</strong></h3><p>Crea un oggetto <code>persona</code> con le seguenti proprietà:</p><ul><li><code>nome</code> - nome della persona</li><li><code>eta</code> - età della persona</li><li><code>saluto()</code> - una funzione per salutare un'altra persona</li></ul><p>All'interno della funzione <code>saluto()</code> introduci la persona, specificando nome ed età.</p><p>Ecco un esempio del risultato:</p><pre><code class="language-txt">persona.saluto();

Ciao! Mi chiamo Alex e ho 22 anni.
</code></pre><h2 id="15-esercizio-finale-sviluppare-un-registratore-di-cassa"><strong>15 - Esercizio finale: sviluppare un registratore di cassa</strong></h2><p>Sviluppiamo un registratore di cassa che può aggiungere elementi a un carrello della spesa, calcolare il prezzo totale, gli sconti e accettare il pagamento in contanti.</p><p>Ipotizziamo che la moneta sia il dollaro (USD) così che non lo dovrai specificare nel programma.</p><p>Il registratore di cassa ha 3 elementi in vendita:</p><ul><li>Un Telefono per 300</li><li>Una Smart TV per 220</li><li>Una Console di Gioco per 150</li></ul><p>C'è il 10% di sconto quando il prezzo totale supera 400.</p><p>Il registratore di cassa dovrebbe avere un carrello della spesa all'inizio vuoto.</p><p>Il registratore di cassa dovrebbe fornire un metodo chiamato <code>aggiungiArticolo</code> che riceve il nome di un articolo come parametro. Quando chiamato, dovrebbe verificare se l'articolo risulta disponibile per la vendita. In questo caso l'articolo dovrebbe essere aggiunto al carrello della spesa. Se l'articolo non è disponibile, mostra un messaggio che dice che quell'articolo non viene venduto.</p><p>Il registratore di cassa dovrebbe fornire un metodo chiamato <code>calcolaPrezzoTotale</code> che somma il prezzo di tutti gli articoli nel carrello della spesa. Dovrebbe iterare sugli articoli presenti nel carrello e sommare i loro prezzi.</p><p>Il registratore di cassa dovrebbe fornire un metodo chiamato <code>pagamento</code> che ottiene l'importo ricevuto per il pagamento come parametro.</p><p>Dovrebbe poi calcolare il prezzo totale degli articoli nel carrello usando il metodo <code>calcolaPrezzoTotale</code>. Se il totale è maggiore di 400, deve applicare lo sconto del 10%.</p><p>Il metodo dovrebbe poi confrontare la somma ricevuta dall'utente per il pagamento con il totale dovuto e mostrare un messaggio appropriato:</p><ul><li>Se il totale pagato è uguale o maggiore del prezzo degli articoli dovrebbe mostrare un messaggio che ringrazia il cliente per l'acquisto. Se c'è del resto dovrebbe mostrarne l'ammontare.</li><li>Se il totale pagato è minore del prezzo dovuto, dovrebbe visualizzare un messaggio che indica che il cliente non ha abbastanza denaro per pagare gli articoli acquistati.</li><li>Il programma dovrebbe includere delle istruzioni <code>console.log()</code> appropriate per stampare dei messaggi quando vengono aggiunti articoli al carrello, per visualizzare il prezzo totale e per elaborare il pagamento.</li></ul><p>Il programma dovrebbe gestire situazioni nelle quali il cliente paga esattamente il dovuto, quando il pagamento è minore del dovuto e quando pagamento è maggiore del dovuto.</p><p>Per sviluppare il programma devi sfruttare quello che hai imparato sugli oggetti, gli array i flussi condizionali e i cicli.</p><p>Ti consiglio di provare prima a sviluppare da solo il programma. Se non sai come proseguire allora verifica la soluzione fornita alla fine dell'articolo. Buona fortuna!</p><h2 id="16-conclusione"><strong>16 - Conclusione</strong></h2><p>Congratulazioni per aver terminato la lettura di questo manuale! Abbiamo esaminato insieme molti concetti per imparare a programmare utilizzando JavaScript.</p><p>Spero che ti sia piaciuto leggerlo tanto quanto io mi sono divertito a scriverlo. Mi piacerebbe ricevere il tuo feedback, sapere cosa ti è piaciuto e cosa no, così posso migliorare il tutorial.</p><p>Se vuoi saperne di più su JavaScript, sto creando un corso che ti aiuta a utilizzare JavaScript per creare applicazioni web. È attualmente in un periodo di pre-ordinazione, quindi puoi ottenere il corso a un prezzo inferiore e supportare il mio lavoro nella creazione di altri tutorial. Puoi <a href="https://codewithnathan.com/js-course">ricevere informazioni qui</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/07/nathan-js-tutorial.jpg" class="kg-image" alt="The JavaScript Tutorial by Nathan Sebhastian" width="600" height="400" loading="lazy"></figure><h2 id="17-soluzioni"><strong>17 - Soluzioni</strong></h2><h3 id="esercizio-nr-1"><strong>Esercizio nr. 1</strong></h3><pre><code class="language-js">console.log("Il tuo nome dovrebbe essere qui");
console.log("La tua età dovrebbe essere qui");
console.log("La tua occupazione dovrebbe essere qui");
</code></pre><h3 id="esercizio-nr-2"><strong>Esercizio nr. 2</strong></h3><pre><code class="language-js">let nome = "Il tuo nome dovrebbe essere qui";
let eta = "La tua età dovrebbe essere qui";
let occupazione = "La tua occupazione dovrebbe essere qui";

console.log(nome);
console.log(eta);
console.log(occupazione);
</code></pre><h3 id="esercizio-nr-3"><strong>Esercizio nr. 3</strong></h3><pre><code class="language-txt">1
false
true
true
true
false
</code></pre><h3 id="esercizio-nr-4"><strong>Esercizio nr. 4</strong></h3><pre><code class="language-js">let colori = ["rosso", "verde", "blu"];

colori.push("nero");
console.log(colori);

colori.shift();
colori[0] = "blu";
colori[1] = "verde";
console.log(colori);

colori.unshift("giallo");
console.log(colori);
</code></pre><h3 id="esercizio-nr-5"><strong>Esercizio nr. 5</strong></h3><p>Usando l'istruzione <code>if...else</code> :</p><pre><code class="language-js">let giudizio = "D";

if (giudizio === "A") {
  console.log("Hai ottenuto una A, eccoti del cioccolato");
} else if (giudizio === "B") {
  console.log("Hai ottenuto una B, eccoti un biscotto!");
} else if (giudizio === "C") {
  console.log(
    "Hai ottenuto una C, c'è spazio per migliorare, eccoti una caramella!"
  );
} else {
  console.log("Nessun premio da dare");
}</code></pre><p>Usando l'istruzione <code>switch...case</code> </p><pre><code class="language-js">let giudizio = "C";
switch (giudizio) {
  case "A":
    console.log("Hai ottenuto una A, eccoti del cioccolato");   
    break;
  case "B":
    console.log("Hai ottenuto una B, eccoti un biscotto!");
    break;
  case "C":
    console.log(
      "Hai ottenuto una C, c'è spazio per migliorare, eccoti una caramella!"  
   );
    break;
  default:
    console.log("Nessun premio da dare");

}</code></pre><h3 id="esercizio-nr-6"><strong>Esercizio nr. 6</strong></h3><p>Modello della mezza piramide:</p><pre><code class="language-js">let pattern;

for (let i = 1; i &lt;= 5; i++) {
  pattern = "";
  for (let j = 1; j &lt;= i; j++) {
    pattern += "*";
  }
  console.log(pattern);
}
</code></pre><p>Modello della mezza piramide invertita:</p><pre><code class="language-js">for (let i = 4; i &gt;= 0; i--) {
  pattern = "";
  for (let j = 0; j &lt;= i; j++) {
    pattern += "*";
  }
  console.log(pattern);
}
</code></pre><h3 id="esercizio-nr-7"><strong>Esercizio nr. 7</strong></h3><pre><code class="language-js">function calcolaQuadrato(lato) {
  console.log(`Il lato del quadrato è ${lato}`);
  console.log(`L'area del quadrato è ${lato * lato}`);
  console.log(`Il perimetro del quadrato è ${4 * lato}`);
}

calcolaQuadrato(7);
</code></pre><h3 id="esercizio-nr-8"><strong>Esercizio nr. 8</strong></h3><pre><code class="language-js">const persona = {
  nome: "Alex",
  eta: 22,
  saluto: function () {
    console.log(
      `Ciao! Mi chiamo ${this.nome} e ho ${this.age} anni.`
    );
  },
};

persona.saluto();
</code></pre><h3 id="esercizio-finale"><strong>Esercizio finale</strong></h3><p>Crea un file chiamato <code>registratoreDiCassa.js</code> e inserisci il seguente codice:</p><pre><code class="language-js">const registratoreDiCassa = {
  articoliInVendita: [
    { nome: "Telefono", prezzo: 300 },
    { nome: "Smart TV", prezzo: 220 },
    { nome: "Console di Gioco", prezzo: 150 },
  ],
  carrelloSpesa: [],
  aggiungiArticolo: function (nome) {
    let articoloTrovato = this.articoliInVendita.find(function (articolo) {
      return articolo.nome === nome;
    });
    if (articoloTrovato) {
      this.carrelloSpesa.push(articoloTrovato);
      console.log(`Aggiunto ${nome} al tuo carrello della spesa`);
    } else {
      console.log(`Mi dispiace, non vendiamo ${nome} qui!`);
    }
  },
  calcolaPrezzoTotale: function () {
    let prezzoTotale = 0;
    this.carrelloSpesa.forEach(function (articoloAcquistato) {
      prezzoTotale += articoloAcquistato.prezzo;
    });
    return prezzoTotale;
  },
  pagamento: function (pagato) {
    let prezzoTotale = this.calcolaPrezzoTotale();
    if (prezzoTotale &gt; 400) {
      prezzoTotale -= prezzoTotale * 0.1;
      console.log(
        `Hai il 10% di sconto e il tuo prezzo da pagare è ${prezzoTotale}`
      );
    }
    if (pagato &gt;= prezzoTotale) {
      if (pagato - prezzoTotale &gt; 0) {
        console.log(`Ecco il tuo resto ${amount - prezzoTotale}`);
      }
      console.log(`Grazie per l'acquisto! Speriamo di averti di nuovo qui!`);
    } else {
      console.log(
        "Spiacenti, non non hai abbastanza denaro per acquistare gli articoli nel carrello"
      );
    }
  },
};</code></pre><p>Per verificare il programma, aggiungi le righe seguenti alla fine del file <code>registratoreDiCassa.js</code>:</p><pre><code class="language-js">registratoreDiCassa.aggiungiArticolo("Telefono");
registratoreDiCassa.aggiungiArticolo("Smart TV");
console.log(registratoreDiCassa.calcolaPrezzoTotale());
registratoreDiCassa.pagamento(700);
</code></pre><p>Quando esegui il programma con <code>node registratoreDiCassa.js</code> dovresti ottenere questo risultato:</p><pre><code class="language-txt">Aggiunto Telefono al tuo carrello della spesa
Aggiunto Smart TV al tuo carrello della spesa
520
Hai il 10% di sconto e il tuo prezzo da pagare è 468
Ecco il tuo resto 232
Grazie per l'acquisto! Speriamo di averti di nuovo qui!
</code></pre><p>Grazie per la lettura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ La Parola Chiave `this` in Javascript + 5 Regole Chiave di Binding Spiegate per Principianti di JS ]]>
                </title>
                <description>
                    <![CDATA[ La parola chiave di JavaScript this è uno degli aspetti del linguaggio più difficili da comprendere. Tuttavia è di importanza critica per la scrittura di codice JavaScript più avanzato. In JavaScript, la parola chiave this ci consente di:  * Riutilizzare funzioni in diversi contesti di esecuzione. Vale a dire ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/la-parola-chiave-this-in-javascript-5-regole-chiave-di-binding-spiegate-per-principianti-di-js/</link>
                <guid isPermaLink="false">6497384aa524800686f60037</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Thu, 06 Jul 2023 13:25:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/06/cover_freecodecamp.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/javascript-this-keyword-binding-rules/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The JavaScript `this` Keyword + 5 Key Binding Rules Explained for JS Beginners</a>
      </p><p>La parola chiave di JavaScript <code>this</code> è uno degli aspetti del linguaggio più difficili da comprendere. Tuttavia è di importanza critica per la scrittura di codice JavaScript più avanzato.</p><p>In JavaScript, la parola chiave <code>this</code> ci consente di:</p><ul><li>Riutilizzare funzioni in diversi contesti di esecuzione. Vale a dire che una funzione, una volta definita, può essere chiamata per oggetti diversi usando la parola chiave <code>this</code>.</li><li>Identificare l'oggetto nel contesto di esecuzione corrente quando chiamiamo un metodo.</li></ul><p>La parola chiave <code>this</code> è strettamente associata &nbsp;alle funzioni JavaScript. Quando si parla di <code>this</code>, la cosa fondamentale è capire dove viene chiamata una funzione, poiché non sappiamo a cosa si riferisca la parola chiave <code>this</code> fino a quando la funzione non viene invocata. </p><p>L'uso di &nbsp;<code>this</code> può essere categorizzato in cinque diversi aspetti di <code>binding</code> (associazione). In questo articolo, esamineremo tutti e cinque gli aspetti con degli esempi.</p><h1 id="innanzitutto-cos-il-binding"><strong>Innanzitutto, Cos'è il<strong><strong> Binding?</strong></strong></strong></h1><p>In JavaScript, un <em>ambiente lessicale</em> è il posto in cui viene fisicamente scritto il codice. Nell'esempio qui sotto, la variabile <code>name</code> dal punto di vista <em>lessicale </em>è all'interno della funzione <code>sayName()</code>.</p><pre><code class="language-js">function sayName() {
  let name = 'someName';
  console.log('Il nome è, ', name);
 }</code></pre><p>Un <em>contesto di esecuzione</em> fa riferimento al codice attualmente in esecuzione e tutto ciò che contribuisce a eseguirlo. Possono esserci molti ambienti lessicali a disposizione ma quello che è attualmente in esecuzione viene gestito dal <em><a href="https://it.wikipedia.org/wiki/Esecuzione_(informatica)#Premesse_e_contesto">contesto di esecuzione</a></em>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/10/lexical.gif" class="kg-image" alt="lexical" width="600" height="400" loading="lazy"><figcaption><em style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: italic; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 17.6px; vertical-align: baseline; color: var(--gray85);">Lexical Environment vs Execution Context</em></figcaption></figure><p>Ciascun contesto di esecuzione contiene un <em>record di ambiente. </em>Quando il motore JavaScript esegue il codice, variabili e nomi di funzioni vengono aggiunti al <em>record di ambiente</em>.</p><p>Questo fenomeno è noto in JavaScript come <code>binding</code>. Il <code>binding</code> aiuta l'associazione degli identificatori (variabili e nomi di funzioni) con la parola chiave <code>this</code> per costituire un <em>contesto di esecuzione</em>.</p><p>Non preoccuparti se trovi questo concetto difficile da capire adesso. Ne avrai una migliore comprensione mano a mano che procediamo.</p><h1 id="regola-1-come-funziona-il-binding-implicito-di-javascript"><strong>Regola #1: Come Funziona il Binding Implicito di JavaScript</strong></h1><p>Il binding implicito copre la maggior parte dei casi d'uso per quanto riguarda la parola chiave <code>this</code>.</p><p>Quando invochiamo un metodo di un oggetto, usiamo la notazione punto (.) per accedervi. Nel binding implicito, devi verificare l'oggetto adiacente al metodo in fase di invocazione. Questo determina a cosa viene associato <code>this</code>.</p><p>Esaminiamo un esempio per capire meglio.</p><pre><code class="language-js">let blog = {
    name: 'Tapas',
    address: 'freecodecamp',
    message: function() {
        console.log(`${this.name} ha un blog su ${this.address}`);
    }
};

blog.message();</code></pre><p>Qui <code>this</code> viene associato all'oggetto <code>blog</code>. Lo sappiamo perché chiamiamo il metodo <code>message()</code> sull'oggetto <code>blog</code>. Pertanto <code>this.name</code> sarà <em><em><em><em><em><em><em><em>Tapas</em></em></em></em></em></em></em> </em>e <code>this.address</code> sarà &nbsp;<em><em>freeCodeCamp</em></em> e tali valori verranno stampati nella console.</p><p>Vediamo un altro esempio per capire meglio questo concetto:</p><pre><code class="language-js"> function greeting(obj) {
      obj.logMessage = function() {
          console.log(`${this.name} ha ${this.age} anni!`);
      }
  };

  const tom = {
      name: 'Tom',
      age: 7
  };

  const jerry = {
      name: 'jerry',
      age: 3
  };

  greeting(tom);
  greeting(jerry);

  tom.logMessage ();
  jerry.logMessage ();
</code></pre><p>In questo esempio abbiamo due oggetti, &nbsp;<code>tom</code> e <code>jerry</code>. Abbiamo decorato (arricchito) questi oggetti con un metodo chiamato <code>logMessage()</code>.</p><p>Nota che quando invochiamo <code>tom.logMessage()</code>, il metodo viene chiamato sull'oggetto <code>tom</code>. Pertanto <code>this</code> è associato all'oggetto <code>tom</code> e i valori stampati saranno <em><em><em><em><em><em><em><em>tom</em></em></em></em> </em></em></em></em>e<em><em><em><em> </em></em>7<em><em><em><em><em><em> </em></em></em></em></em></em></em></em>(<code>this.name</code> equivale a <em><code>tom</code></em> e <code>this.age</code> in questo caso è &nbsp;7). Lo stesso vale quando viene invocato <code>jerry.logMessage()</code>.</p><h1 id="regola-2-come-funziona-in-javascript-il-binding-esplicito"><strong>Regola #2: Come Funziona In JavaScript il Binding Esplicito</strong></h1><p>Abbiamo visto che JavaScript crea un ambiente per eseguire il codice che scriviamo. Si occupa della creazione in memoria di variabili, funzioni, oggetti e così via nella <em>fase di creazione</em>. Successivamente esegue il codice nella <em>fase di esecuzione. </em>Questo ambiente speciale viene chiamato <em>contesto di esecuzione</em>.</p><p>Possono essercene molti di questi ambienti (contesti di esecuzione) in un'applicazione JavaScript. Ogni contesto di esecuzione opera indipendentemente dagli altri.</p><p>A volte, tuttavia, potremmo voler usare cose che si trovano in un altro contesto di esecuzione. Ecco quando entra in gioco il binding esplicito.</p><p>Nel binding esplicito chiamiamo una funzione con un oggetto quando la funzione è al di fuori del contesto di esecuzione di quell'oggetto.</p><p>Ci sono tre metodi molto speciali: &nbsp;<code>call()</code>, <code>apply()</code> e <code>bind()</code> che ci aiutano a ottenere il binding esplicito.</p><h2 id="come-funziona-il-metodo-call-di-javascript"><strong>Come Funziona il Metodo <code>call()</code> di JavaScript</strong></h2><p>Con il metodo <code>call()</code>, il contesto nel quale la funzione deve essere chiamata verrà passato come parametro a &nbsp;<code>call()</code>. Vediamo come funziona con un esempio:</p><pre><code class="language-js">let getName = function() {
     console.log(this.name);
 }
 
let user = {
   name: 'Tapas',
   address: 'Freecodecamp'  
 };

getName.call(user);</code></pre><p>Qui sopra il metodo <code>call()</code> viene invocato su una funzione chiamata <code>getName()</code>. La funzione <code>getName()</code> stampa semplicemente alla console il valore di <code>this.name</code>. Ma cosa rappresenta <code>this</code> qui? Questo dipende da cosa è stato passato al metodo <code>call()</code>.</p><p>In questo caso <code>this</code> sarà associato all'oggetto <code>user</code>, in quanto lo abbiamo passato come parametro al metodo <code>call()</code>. Pertanto <code>this.name</code> dovrebbe avere il valore associato alla proprietà <code>name</code> dell'oggetto <code>user</code>, vale a dire <em><em><em><em>Tapas</em></em></em></em>.</p><p>Nell'esempio qui sopra abbiamo passato solo un argomento a <code>call()</code>. Tuttavia &nbsp;possiamo passare molteplici argomenti a <code>call()</code>, in questo modo:</p><pre><code class="language-js">let getName = function(hobby1, hobby2) {
     console.log('A ' + this.name + ' piace ' + hobby1 + ' , ' + hobby2);
 }

let user = {
   name: 'Tapas',
   address: 'Bangalore'  
 };

let hobbies = ['Nuotare', 'Tenere un Blog'];
 
getName.call(user, hobbies[0], hobbies[1]);</code></pre><p>Qui abbiamo passato diversi argomenti al metodo <code>call()</code>. Il primo argomento deve essere il contesto dell'oggetto nel quale la funzione deve essere chiamata. Gli altri parametri potrebbero essere semplicemente valori da usare.</p><p>In questo caso sto passando <em>Nuotare </em>e<em> Tenere un Blog </em>come due parametri della funzione <code>getName()</code>.</p><p>Hai notato il punto dolente qui? Nel caso di <code>call()</code>, gli argomenti devono essere passati uno ad uno &nbsp;– il che non è un modo intelligente di fare le cose!. Ecco quando il nostro prossimo metodo, <code>apply()</code>, entra in &nbsp;gioco.</p><h2 id="come-funziona-il-metodo-apply-in-javascript"><strong>Come Funziona il Metodo <code>apply()</code> in JavaScript</strong></h2><p>Questo modo di passare argomenti al metodo <code>call()</code> può essere risolto usando un metodo alternativo chiamato <code>apply()</code>. Funziona esattamente come <code>call()</code>, ma ti consente di passare gli argomenti in modo più conveniente. Dai un'occhiata a questo codice:</p><pre><code class="language-js">let getName = function(hobby1, hobby2) {
     console.log('A ' + this.name + ' piace ' + hobby1 + ' , ' + hobby2);
 }
 
let user = {
   name: 'Tapas',
   address: 'Bangalore'  
 };

let hobbies = ['Nuotare', 'Tenere un Blog'];
 
getName.apply(user, hobbies);</code></pre><p>Qui siamo in grado di passare un array di argomenti, il che è molto più conveniente rispetto al passarli ad uno ad uno.</p><p>Suggerimento: Quando hai solo uno o nessun valore di argomento da passare, usa <code>call()</code>. Quando hai diversi valori di argomento, usa <code>apply()</code>.</p><h2 id="come-funziona-il-metodo-bind-di-javascript"><strong>Come Funziona il Metodo <code>bind()</code> di JavaScript</strong></h2><p>Il metodo <code>bind()</code> è simile al metodo <code>call()</code>, con una differenza: diversamente da <code>call()</code>, che chiama la funzione direttamente, &nbsp;<code>bind()</code> ritorna una funzione completamente nuova che possiamo invocare.</p><pre><code class="language-js">let getName = function(hobby1, hobby2) {
     console.log('A ' + this.name + ' piace ' + hobby1 + ' , ' + hobby2);
 }

let user = {
   name: 'Tapas',
   address: 'Bangalore'  
 };

let hobbies = ['Nuotare', 'Tenere un Blog'];
let newFn = getName.bind(user, hobbies[0], hobbies[1]); 

newFn();</code></pre><p>Qui <code>getName.bind()</code> non chiama la funzione <code>getName()</code><em><em><em><em> </em></em></em></em>direttamente. Ritorna una nuova funzione, <code>newFn</code> che possiamo invocare come <code>newFn()</code>.</p><h1 id="rule-3-il-binding-new-di-javascript"><strong>Rule #3: Il Binding <code>new</code> di JavaScript</strong></h1><p>La parola chiave <code>new</code> è usata per creare un oggetto dalla funzione costruttore.</p><pre><code class="language-js">let Cartoon = function(name, character) {
     this.name = name;
     this.character = character;
     this.log = function() {
         console.log(this.name +  ' è un ' + this.character);
     }
 };</code></pre><p>Puoi creare oggetti usando la parola chiave <code>new</code> in questo modo:</p><pre><code class="language-js"> let tom = new Cartoon('Tom', 'Gatto');
 let jerry = new Cartoon('Jerry', 'Topo');</code></pre><p>Quando una funzione viene invocata con la parola chiave <code>new</code>, JavaScript crea un oggetto <code>this</code> interno (così: <code>this = {}</code>) nella funzione. Il <code>this</code> appena creato si associa all'oggetto in fase di creazione usando la parola chiave <code>new</code>.</p><p>Sembra complicato? Ok, esaminiamolo approfonditamente. Osserva questa riga:</p><pre><code class="language-js">let tom = new Cartoon('Tom', 'Gatto');</code></pre><p>Qui la funzione <code>Cartoon</code> viene invocata con la parola chiave <code>new</code> . Quindi il <code>this</code> creato internamente sarà associato al nuovo oggetto creato qui, che è <code>tom</code>.</p><h1 id="regola-4-binding-dell-oggetto-globale-di-javascript"><strong>Regola #4: Binding dell'Oggetto Globale di JavaScript </strong></h1><p>Quale pensi che sarà il risultato del codice qui sotto? A cosa è associato <code>this</code> qui?</p><pre><code class="language-js">let sayName = function(name) {
    console.log(this.name);
};

window.name = 'Tapas';
sayName();</code></pre><p>Se la parola chiave <code>this</code> non viene risolta con alcuno dei binding, <em>implicito</em>, <em>esplicito</em> o <code>new</code>, allora <code>this</code> viene associata all'oggetto globale <code>window()</code> .</p><p>Esiste un'eccezione, tuttavia, la modalità strict (<strong>strict mode</strong>) di JavaScript non consente questo binding predefinito.</p><pre><code class="language-js">"use strict";
function myFunction() {
  return this;
}</code></pre><p>Nell'esempio qui sopra, &nbsp;<code>this</code> è <code>undefined.</code></p><h1 id="regola-5-binding-di-un-evento-html-in-javascript"><strong>Regola #5: Binding di un Evento HTML in JavaScript</strong></h1><p>Nei gestori di eventi HTML, <code>this</code> viene associato all'elemento HTML che riceve l'evento.</p><pre><code class="language-html">&lt;button onclick="console.log(this)"&gt;Click Me!&lt;/button&gt;</code></pre><p>Questo è il risultato nella console del click sul pulsante:</p><pre><code class="language-shell">"&lt;button onclick='console.log(this)'&gt;Click Me!&lt;/button&gt;"</code></pre><p>Puoi cambiare lo stile del pulsante al click dell'utente usando la parola chiave <code>this</code>, in questo modo:</p><pre><code class="language-html">&lt;button onclick="this.style.color='teal'"&gt;Click Me!&lt;/button&gt;</code></pre><p>Tuttavia, fai attenzione quando chiami una funzione per gestire un clic del pulsante e usi <code>this</code> all'interno di quella funzione; ipotizziamo questo codice HTML.</p><pre><code class="language-html">&lt;button onclick="changeColor()"&gt;Click Me!&lt;/button&gt;</code></pre><p>e questo codice JavaScript:</p><pre><code class="language-js">function changeColor() {
  this.style.color='teal';
}</code></pre><p>Quanto sopra non funzionerà come atteso. Come abbiamo visto nella regola &nbsp;4, in questo caso <code>this</code> sarà associato all'oggetto globale (in modalità <strong>non</strong> strict), laddove non esiste un oggetto <code>style</code> con il quale impostare il colore.</p><h1 id="riepilogo"><strong>Riepilogo</strong></h1><p>Per riassumere,</p><ul><li>In caso di binding implicito, &nbsp;<code>this</code> viene associato all'oggetto adiacente all'operatore punto (.) quando si invoca il metodo.</li><li>In caso di binding esplicito, possiamo chiamare una funzione con un oggetto quando la funzione è al di fuori del contesto di esecuzione dell'oggetto stesso. I metodi <code>call()</code>, <code>apply()</code>, e <code>bind()</code> giocano un grosso ruolo qui.</li><li>Quando una funzione viene chiamata con la parola chiave <code>new</code>, la parola chiave <code>this</code> all'interno della funzione si associa al nuovo oggetto che si sta costruendo.</li><li>Quando la parola chiave &nbsp;<code>this</code> non è risolta con alcuna dei binding, implicito, esplicito o <code>new</code>, allora <code>this</code> viene associato all'oggetto globale <code>window()</code>. Nella modalità <em>strict</em> di JavaScript, <code>this</code> sarà <code>undefined</code>.</li><li>Nei gestori di evento HTML, &nbsp;<code>this</code> viene associato all'elemento HTML che riceve l'evento.</li></ul><p>C'è un ulteriore caso nel quale &nbsp;<code>this</code> si comporta in modo differente, vale a dire le <em>funzioni freccia E6. </em>Daremo uno sguardo a questo caso in un articolo successivo.</p><p>Spero che tu abbia trovato utile questo articolo. Ti potrebbero anche piacere:</p><ul><li><a href="https://blog.greenroots.info/javascript-hoisting-internals-ckbuavl6f00dllas14hl9ckq1">JavaScript Hoisting Internals</a></li><li><a href="https://blog.greenroots.info/understanding-javascript-execution-context-like-never-before-ckb8x246k00f56hs1nefzpysq">Understanding JavaScript Execution Context like never before</a></li><li><a href="https://blog.greenroots.info/javascript-scope-fundamentals-with-tom-and-jerry-ckcq723h4007vkxs18dxa97ae">JavaScript Scope Fundamentals with Tom and Jerry</a></li><li><a href="https://blog.greenroots.info/understanding-javascript-closure-with-example-ckd17fci5001iw5s1fju4f8r0">Understanding JavaScript Closure with example</a></li></ul><p>Se hai apprezzato questo articolo, condividilo in modo che altri lo possano leggere. Puoi menzionarmi su Twitter (<a href="https://twitter.com/tapasadhikary">@tapasadhikary</a>) nei tuoi commenti, oppure sentiti libero di seguirmi.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ [object, object] in JavaScript – Cosa Significa in JS ]]>
                </title>
                <description>
                    <![CDATA[ Lavorando con gli oggetti in JavaScript, potresti esserti imbattuto nell'output  [object, object]. Potrebbe sembrare irrilevante, ma non è necessariamente un  errore. [object, object] è la rappresentazione in formato stringa di un oggetto in JavaScript. Capirai meglio continuando a leggere questo articolo. Ci sono due situazioni principali in cui incontrerai ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/object-object-in-javascript-cosa-significa-in-js/</link>
                <guid isPermaLink="false">644164fe0b6bdd0668cda643</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dario Di Cillo ]]>
                </dc:creator>
                <pubDate>Fri, 21 Apr 2023 06:26:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/04/clement-helardot-95YRwf6CNw8-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/object-object-in-javascript-meaning-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">[object, object] in JavaScript – Meaning in JS</a>
      </p><p>Lavorando con gli oggetti in JavaScript, potresti esserti imbattuto nell'output <code>[object, object]</code>. Potrebbe sembrare irrilevante, ma non è necessariamente un &nbsp;errore.</p><p><code>[object, object]</code> è la rappresentazione in formato stringa di un oggetto in JavaScript. Capirai meglio continuando a leggere questo articolo.</p><p>Ci sono due situazioni principali in cui incontrerai un output del genere:</p><ul><li>Provando a mostrare un oggetto usando il metodo <code>alert()</code> (il più comune).</li><li>Usando il metodo <code>toString()</code> su un oggetto.</li></ul><p>Diamo un'occhiata a qualche esempio.</p><h2 id="cosa-accade-se-usi-alert-su-un-oggetto-in-javascript"><strong>Cosa accade se usi <code>alert()</code> su un oggetto in JavaScript?</strong></h2><p>In questa sezione vedrai cosa accade quando usi il metodo <code>alert()</code> per mostrare un oggetto in JavaScript. Ecco il codice di esempio:</p><pre><code class="language-javascript">const student = {
  name: "John",
  school: "freeCodeCamp",
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

let myEmptyObj = {};

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

let myEmptyObj = {};

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

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

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

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

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

let myEmptyObj = {};

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

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

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

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

let myEmptyObj = {};

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

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

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

let myEmptyObj = {};

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

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

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

      if (!inputElement.checkValidity()) {
        return false;
      } else {
        return true;
      }
    } 
</code></pre><p>Adesso usiamo questo metodo per validare diverse stringhe e vedere se sono URL validi.</p><pre><code>    var url = "invalidURL";
    console.log(isValidUrl(url));     //false
    
    var url = "htt//jsowl";
    console.log(isValidUrl(url));     //false
    
    var url = "www.jsowl.com";
    console.log(isValidUrl(url));     //false
    
    var url = "https://www.jsowl.com";
    console.log(isValidUrl(url));     //true
    
    var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
    console.log(isValidUrl(url));     //true
</code></pre><p>Ed ecco come puoi usare l'approccio input type per verificare se una stringa è un URL valido.</p><h2 id="come-verificare-se-una-stringa-un-url-valido-con-il-metodo-del-tag-di-ancoraggio"><strong>Come verificare se una stringa è un URL valido con il metodo del tag di ancoraggio</strong></h2><p>Questa sezione ti mostra come usare un <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement">HTMLAnchorElement</a> per controllare se una stringa JavaScript è un URL.</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> è consigliabile usare questo metodo quando vuoi assegnare un URL a un tag di ancoraggio e assicurarti che la stringa sia un URL valido.</p><p>L'interfaccia <code>HTMLAnchorElement</code> rappresenta degli elementi hyperlink. Fornisce proprietà e metodi speciali per manipolare il layout e la presentazione di tali elementi. Viene anche chiamata tag di ancoraggio.</p><p>Puoi assegnare un URL a un tag di ancoraggio usando l'attributo <code>href</code>. Nell'assegnazione,</p><ul><li>Se la stringa passata è un URL valido, viene assegnata al tag di ancoraggio</li><li>Se la stringa passata non è un URL valido, la <a href="https://www.jsowl.com/how-to-get-the-current-url-in-jquery/">posizione attuale del browser</a> viene assegnata al tag </li><li>Di default, il tag di ancoraggio avrà un URL vuoto (“”)</li></ul><p>Una volta che l'URL è assegnato, puoi estrarre una parte specifica dell'URL usando gli attributi spiegati di seguito.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Attributo</th>
<th>Utilizzo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>host</code></td>
<td>una stringa che rappresenta nome dell'host e porta</td>
</tr>
<tr>
<td><code>hostname</code></td>
<td>una stringa che rappresenta il nome dell'host</td>
</tr>
<tr>
<td><code>href</code></td>
<td>una stringa contenente un URL valido</td>
</tr>
<tr>
<td><code>origin</code></td>
<td>restituisce una stringa contenente origine, schema dominio e porta</td>
</tr>
<tr>
<td><code>port</code></td>
<td>una stringa che rappresenta la porta se specificata</td>
</tr>
<tr>
<td><code>protocol</code></td>
<td>una stringa che rappresenta il protocollo, incluso <code>:</code></td>
</tr>
<tr>
<td><code>pathname</code></td>
<td>una stringa che contiene il percorso URL dalla prima <code>/</code> senza query string</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Adesso vediamo come controllare se la stringa assegnata è un URL corretto.</p><p>Se lo è, viene assegnata al tag di ancoraggio. Altrimenti, gli sarà assegnata la posizione attuale del browser.</p><p>Quindi per vedere se l'URL è corretto, puoi controllare se l'<code>host</code> del tag di ancoraggio NON è uguale a quello della posizione attuale usando l'istruzione <code>a.host != window.location.host</code>.</p><p>Vediamo il codice.</p><p>Creiamo un funzione lambda e la assegniamo alla costante <code>isValidUrl</code>.</p><p>La funzione crea un tag di ancoraggio e gli assegna la stringa con l'URL. Dopodiché, verifica se l'attributo <code>host</code> dell'elemento è <code>null</code> o non definito.</p><p>Se non è null, verifica se l'attributo <code>host</code> NON è uguale alla posizione attuale del browser e restituisce <code>true</code> se non è uguale.</p><p>Questo perché se l'URL passato è valido, il tag di ancoraggio avrà un valore URL. Ma se l'URL non è valido, il tag di ancoraggio avrà la posizione attuale del browser. In questo caso, la funzione lambda restituisce <code>false</code>.</p><pre><code>const isValidUrl = urlString =&gt;{	
  	var a  = document.createElement('a');
   	a.href = urlString;
   	return (a.host &amp;&amp; a.host != window.location.host);
  }
</code></pre><p>Il codice seguente invoca la funzione lambda <code>isValidUrl()</code> con input differenti e stampa l'output sulla console.</p><pre><code class="language-js">  var url = "invalidURL";
  console.log("1.AnchorTag:  " +isValidUrl(url));    //false
  
  var url = "htt//jsowl";
  console.log("22.AnchorTag:  "+isValidUrl(url));    //false
  
  var url = "www.jsowl.com";  
  console.log("3.AnchorTag:  " +isValidUrl(url));    //false  
  
  var url = "https://www.jsowl.com";  
  console.log("4.AnchorTag:  " +isValidUrl(url));    //true 
  
  var url = "https://www.jsowl.com/remove-an-item-from-an-array-in-javascript/";
  console.log("5.AnchorTag:  " +isValidUrl(url));    //true 
</code></pre><p>Questo tutorial è disponibile in <a href="https://jsfiddle.net/jsowl/mvzqh4of/266/">questo</a> JSFiddle.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo articolo hai imparato come verificare se una stringa JavaScript è un URL usando diversi metodi e quando usare ogni metodo.</p><p>Se ti è piaciuto questo articolo, condividilo.</p><p>Puoi vedere i miei altri tutorial <a href="https://www.jsowl.com/">sul mio blog, JS Owl</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial JavaScript sulle Promise – Come Risolvere o Rifiutare le Promise in JS ]]>
                </title>
                <description>
                    <![CDATA[ Le Promise sono un concetto molto importante per le operazioni asincrone in JavaScript. Forse pensi che le promise non siano così facili da capire, apprendere e usare. E credimi non sei il solo! Le Promise sono impegnative per molti sviluppatori web, anche dopo anni passati a usarle. In questo articolo, ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-risolvere-o-rifiutare-le-promise-in-js/</link>
                <guid isPermaLink="false">640da9749896040622f6f8c5</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Paolo Pescosolido ]]>
                </dc:creator>
                <pubDate>Thu, 23 Mar 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/03/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-promise-tutorial-how-to-resolve-or-reject-promises-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Promise Tutorial – How to Resolve or Reject Promises in JS</a>
      </p><p>Le <strong>Promise </strong>sono un concetto molto importante per le operazioni asincrone in JavaScript. Forse pensi che le promise non siano così facili da capire, apprendere e usare. E credimi non sei il solo!</p><p>Le Promise sono impegnative per molti sviluppatori web, anche dopo anni passati a usarle.</p><p>In questo articolo, cercherò di cambiare questa percezione e condividere quello che ho imparato sulle Promise in JavaScript negli ultimi anni. Spero che ti sia utile.</p><h1 id="cos-una-promise-in-javascript"><strong>Cos'è una P<strong>romise in JavaScript?</strong></strong></h1><p>Una <strong>Promise </strong>è un'oggetto speciale in JavaScript. Produce un valore quando un'operazione asincrona viene completata con successo, o un errore se non è completata con successo a causa di un &nbsp;timeout, un errore di rete, e via dicendo.</p><p>Una chiamata riuscita è indicata dalla chiamata della funzione <code>resolve</code>, mentre gli errori sono indicati dalla chiamata della funzione <code>reject</code>.</p><p>Puoi creare una promise usando il costruttore Promise in questo modo:</p><pre><code class="language-js">let promise = new Promise(function(resolve, reject) {    
    // Esegui delle operazioni asincrone, quindi chiama resolve o reject
});</code></pre><p>Nella maggior parte dei casi, una promise si usa per un'operazione asincrona. Tuttavia, tecnicamente, puoi risolvere/rifiutare sia operazioni sincrone che asincrone.</p><h1 id="aspetta-un-momento-non-abbiamo-gi-le-funzioni-callback-per-le-operazioni-asincrone"><strong>Aspetta un momento<strong>,</strong> non abbiamo già le funzioni callback per le operazioni asincrone<strong>?</strong></strong></h1><p>Esatto! In JavaScript esistono le funzioni <strong>callback</strong>. Ma, una callback non è niente di speciale. È una normale funzione che produce un risultato al completamento di un'operazione asincrona.</p><p>La parola 'asincrona' significa che una cosa succede nel futuro, non adesso. Normalmente, le callback si usano solamente per operazioni di rete, o caricare/scaricare file, consultare una base di dati, o cose del genere.</p><p>Nonostante le callback siano utili, hanno anche un grande svantaggio. In alcuni casi, possiamo avere una callback dentro un'altra callback dentro un'altra callback, e così via. Dico davvero! Cerchiamo di capire questo "inferno di callback" con un esempio.</p><h2 id="come-evitare-l-inferno-di-callback-esempio-con-pizzahub"><strong>Come evitare l'Inferno di c<strong>allback – </strong>Esempio con <strong>PizzaHub </strong></strong></h2><p>Ordiniamo una pizza Margherita Veg🍕 da PizzaHub. Quando facciamo un ordine, PizzaHub individua automaticamente la nostra posizione geografica, trova una pizzeria nei dintorni e controlla se la pizza che vogliamo è disponibile.</p><p>Se è disponibile individua che tipo di bibita possiamo avere gratis con la pizza, e finalmente invia l'ordine.</p><p>Se l'ordine va a buon fine, riceviamo un messaggio di conferma.</p><p>Quindi, come possiamo scrivere un codice per queste operazioni usando le funzioni callback? Io ho pensato a qualcosa del genere:</p><pre><code class="language-js">function orderPizza(type, name) {
    
    // Chiedi a pizzahub di trovare un ristorante
    query(`/api/pizzahub/`, function(result, error){
       if (!error) {
           let shopId = result.shopId;
           
           // Contatta il ristorante e chiedi le pizze
           query(`/api/pizzahub/pizza/${shopid}`, function(result, error){
               if (!error) {
                   let pizzas = result.pizzas;
                   
                   // Controlla se la pizza è dsponibile
                   let myPizza = pizzas.find((pizza) =&gt; {
                       return (pizza.type===type &amp;&amp; pizza.name===name);
                   });
                   
                   // Controlla le bibite gratis
                   query(`/api/pizzahub/beverages/${myPizza.id}`, function(result, error){
                       if (!error) {
                           let beverage = result.id;
                           
                           // Prepara l'ordine
                           query(`/api/order`, {'type': type, 'name': name, 'beverage': beverage}, function(result, error){
                              if (!error) {
                                  console.log(`Your order of ${type} ${name} with ${beverage} has been placed`);
                              } else {
                                  console.log(`Bad luck, No Pizza for you today!`);
                              }
                           });

                       }
                   })
               }
           });
       } 
    });
}

// Chiama il metodo orderPizza
orderPizza('veg', 'margherita');</code></pre><p>Esaminiamo meglio la funzione <code>orderPizza</code>.</p><p>Chiama una API per ottenere l'id del ristorante più vicino. Dopodiché, riceve la lista delle pizze disponibili nel ristorante. Controlla che la pizza che vogliamo è fra le disponibili e fa un'altra richiesta all'API per cercare le bibite da abbinare alla pizza. E infine invia l'ordine.</p><p>Qui stiamo usando una callback per ogni richiesta inviata all'API. Questo ci porta a dover usare una callback dentro un'altra callback, dentro un'altra callback, e così via.</p><p>Andiamo verso quello che chiamiamo (molto pittorescamente) inferno di callback. E penso che non piaccia a nessuno. Inoltre forma una piramide di codice che è fonte di confusione ma anche di possibili errori.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/callback-hell.png" class="kg-image" alt="callback-hell" width="600" height="400" loading="lazy"><figcaption>Dimostrazione dell'inferno di callback e della piramide</figcaption></figure><p>Ci sono vari modi per uscire dall'inferno di callback (o per non entrare). &nbsp;Il modo più comune è appunto quello di usare una <code>Promise</code> o una funzione <code>async</code>. Tuttavia, per capire bene cosa sia una funzione <code>async</code>, hai bisogno prima di avere una conoscenza sufficiente delle promise.</p><p>Quindi iniziamo e tuffiamoci nelle promise.</p><h1 id="comprendere-gli-stati-delle-promise"><strong>Comprendere gli stati delle <strong>Prom</strong>ise</strong></h1><p>Riassumendo, una promise può essere creata con la sintassi del costruttore (constructor), in questo modo:</p><pre><code class="language-js">let promise = new Promise(function(resolve, reject) {
  // Codice da eseguire
});</code></pre><p>Il costruttore ha come argomento una funzione. Quest'ultima funzione si chiama <strong>funzione esecutrice </strong>(executor).</p><pre><code class="language-js">// Funzione esecutrice passata come argomento
// al costruttore della promise
function(resolve, reject) {
    // la logica va qui...
}</code></pre><p>La funzione esecutrice accetta due argomenti, <code>resolve</code> e <code>reject</code>. Queste sono le callback fornite dal linguaggio JavaScript stesso. La logica del tuo programma va inserita nel corpo della funzione esecutrice che viene eseguita automaticamente quando una nuova promise è creata con la parola chiave <code>new</code>.</p><p>Per essere effettiva, la funzione executor della promise deve chiamare una delle due callback, <code>resolve</code> o <code>reject</code>. Entreremo nei dettagli più avanti.</p><p>La funzione constructor <code>new Promise()</code> restituisce un oggetto <code>promise</code>. Siccome la funzione executor gestisce operazioni asincrone, l'oggetto <code>promise</code> deve avere la capacità di informare quando l'esecuzione ha inizio, quando viene completata (resolved) o quando restituisce un errore (rejected).</p><p>Un oggetto <code>promise</code> possiede le seguenti proprietà interne:</p><ol><li><code>state</code> – Questa proprietà può avere i seguenti valori:</li></ol><ul><li><code>pending</code>: il valore iniziale quando inizia l'esecuzione della funzione esecutrice (in sospeso).</li><li><code>fulfilled</code>: quando la promise è risolta.</li><li><code>rejected</code>: quando la promise è rifiutata.</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/states_1.png" class="kg-image" alt="states_1" width="600" height="400" loading="lazy"><figcaption>Stati di una promise</figcaption></figure><p>2. &nbsp;<code>result</code> – Questa proprietà può avere i seguenti valori:</p><ul><li><code>undefined</code>: il valore iniziale quando la proprietà <code>state</code> ha valore <code>pending</code>.</li><li><code>valore</code>: quando viene chiamata <code>resolve(valore)</code>.</li><li><code>errore</code>: quando viene chiamata <code>reject(errore)</code>.</li></ul><p>Queste proprietà interne, sono inaccessibili da un codice esterno, ma sono ispezionabili. Ovvero possiamo ispezionare il valore delle proprietà <code>state</code> e <code>result</code> con gli strumenti di debug, ma non possiamo accedervi direttamente tramite il programma.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/promise_state_inspect.png" class="kg-image" alt="promise_state_inspect" width="600" height="400" loading="lazy"><figcaption>Possiamo ispezionare le proprietà interne di una promise</figcaption></figure><p>Lo stato di una promise può essere <code>pending</code> (sospesa), <code>fulfilled</code> (soddisfatta) o <code>rejected</code> (respinta, rifiutata). Una promise risolta o rifiutata viene chiamata <code>settled</code> (conclusa).</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/states_2.png" class="kg-image" alt="states_2" width="600" height="400" loading="lazy"><figcaption>Una promise conclusa può essere sia soddisfatta che rifiutata</figcaption></figure><h3 id="come-si-risolve-o-si-rifiuta-una-promise"><strong>Come si risolve o si rifiuta una promise</strong></h3><p>Ecco un esempio di una promise risolta (stato <code>fulfilled</code>) immediatamente con il valore <code>I am done</code>.</p><pre><code class="language-js">let promise = new Promise(function(resolve, reject) {
    resolve("I am done");
});</code></pre><p>La seguente promise è rifiutata (stato <code>rejected</code>) con il messaggio di errore <code>Something is not right!</code>.</p><pre><code class="language-js">let promise = new Promise(function(resolve, reject) {
    reject(new Error('Something is not right!'));
});</code></pre><p>Una cosa importante da notare:</p><blockquote>La funzione executor di una Promise deve chiamare solo una volta <code>resolve</code> o <code>reject</code>. Una volta che lo stato passa da pending a fulfilled o da pending a rejected, è tutto. Qualsiasi ulteriore chiamata di <code>resolve</code> o <code>reject</code> viene ignorata.</blockquote><pre><code class="language-js">let promise = new Promise(function(resolve, reject) {
  resolve("I am surely going to get resolved!");

  reject(new Error('Will this be ignored?')); // ignorato
  resolve("Ignored?"); // ignorato
});</code></pre><p>Nell'esempio precedente, solo la prima chiamata di resolve avviene, mentre il resto viene ignorato.</p><h1 id="come-gestire-una-promise-una-volta-creata"><strong>Come gestire una Promise una volta creata</strong></h1><p>Una <code>Promise</code> utilizza una funzione executor per completare un'operazione (di solito asincrona). Una funzione che usa il risultato di una promise, dovrebbe essere avvertita quando la funzione executor ha terminato il suo lavoro chiamando resolve o reject.</p><p>I metodi <code>.then()</code>, <code>.catch()</code> e <code>.finally()</code>, servono per creare questo collegamento fra la funzione executor e la funzione che consuma la promise (consumer), in modo tale che possano essere sincronizzate quando la promise è risolta o rifiutata.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/consumer_executor.png" class="kg-image" alt="consumer_executor" width="600" height="400" loading="lazy"><figcaption>La funzione executor e la funzione consumer che usa il risultato della promise</figcaption></figure><h2 id="come-usare-il-metodo-then-"><strong>Come usare il metodo <strong><code>.then()</code></strong></strong></h2><p>Il metodo <code>.then()</code> dovrebbe essere chiamato sull'oggetto promise per gestire un risultato (resolve) o un errore (reject).</p><p>Il metodo accetta due funzioni come parametri. Normalmente, il metodo <code>.then()</code> viene chiamato dalla funzione consumer quando vuoi conoscere il risultato dell'esecuzione di una promise.</p><pre><code class="language-js">promise.then(
  (result) =&gt; { 
     console.log(result);
  },
  (error) =&gt; { 
     console.log(error);
  }
);</code></pre><p>Se ti interessa solo il risultato in caso di successo, puoi passare un solo argomento, in questo modo:</p><pre><code class="language-js">promise.then(
  (result) =&gt; { 
      console.log(result);
  }
);</code></pre><p>Se ti interessa solo il risultato in caso di errore, puoi passare <code>null</code> come primo argomento, in questo modo:</p><pre><code class="language-js">promise.then(
  null,
  (error) =&gt; { 
      console.log(error)
  }
);</code></pre><p>In ogni caso, puoi gestire meglio gli errori usando il metodo <code>.catch()</code> che vedremo in un minuto.</p><p>Vediamo un paio di esempi di come gestire i risultati e gli errori usando i metodi <code>.then</code> e <code>.catch</code>. Vediamo di rendere le cose un po' più divertenti con delle richieste asincrone reali. Useremo la <a href="https://pokeapi.co/">PokeAPI</a> per richiedere informazioni sui Pokémon e gestire i risultati con le promise e le funzioni resolve/reject.</p><p>Per prima cosa, creiamo una funzione generica che accetta un URL della PokeAPI come argomento e ritorna una promise. Se la richiesta alla API ha successo, restituiremo una promise risolta (resolved). In caso di errore, restituiremo una promise rifiutata (rejected).</p><p>D'ora in poi useremo questa funzione in vari esempi per ottenere una promise e lavorare con essa.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function getPromise(URL) {
  let promise = new Promise(function (resolve, reject) {
    let req = new XMLHttpRequest();
    req.open("GET", URL);
    req.onload = function () {
      if (req.status == 200) {
        resolve(req.response);
      } else {
        reject("There is an Error!");
      }
    };
    req.send();
  });
  return promise;
}</code></pre><figcaption>Metodo di utilità per ottenere una Promise</figcaption></figure><p>Esempio 1: ottieni informazioni su 50 Pokémon:</p><pre><code class="language-js">const ALL_POKEMONS_URL = 'https://pokeapi.co/api/v2/pokemon?limit=50';

// Abbiamo già parlato di questa funzione!
let promise = getPromise(ALL_POKEMONS_URL);

const consumer = () =&gt; {
    promise.then(
        (result) =&gt; {
            console.log({result}); // Registra il risultato di 50 Pokemons
        },
        (error) =&gt; {
            // Visto che l'URL è valido, questa funzione non sarà chiamata.
            console.log('We have encountered an Error!'); // Registra un errore
    });
}

consumer();</code></pre><p>Esempio 2: proviamo con URL non valido</p><pre><code class="language-js">const POKEMONS_BAD_URL = 'https://pokeapi.co/api/v2/pokemon-bad/';

// Questa promise sarà rifiutata perché l'URL è 404
let promise = getPromise(POKEMONS_BAD_URL);

const consumer = () =&gt; {
    promise.then(
        (result) =&gt; {
            // La promise non è risolta. Quindi, questa funzione
            // non sarà eseguita.
            console.log({result});
        },
        (error) =&gt; {
            // Una promise rifiutata eseguirà questa funzione
            console.log('We have encountered an Error!'); // Registra un errore
        }
    );
}

consumer();</code></pre><h2 id="come-usare-il-metodo-catch-"><strong>Come usare il metodo <strong><code>.catch()</code></strong></strong></h2><p>Puoi usare questo metodo per gestire gli errori in una promise. La sintassi di passare <code>null</code> come primo argomento di <code>.then()</code> non è esattamente un gran modo di gestire gli errori. Per questo abbiamo <code>.catch()</code> per eseguire lo stesso lavoro con una sintassi più pulita:</p><pre><code class="language-js">// Questa promise sarà rifiutata perché l'URL è 404
let promise = getPromise(POKEMONS_BAD_URL);

const consumer = () =&gt; {
    promise.catch(error =&gt; console.log(error));
}

consumer();</code></pre><p>Se lanciamo un errore come <code>new Error("Something wrong!")</code> invece di chiamare <code>reject</code> dalla funzione executor, sarà considerato comunque un rifiuto. Ovvero l'errore sarà intercettato dal metodo <code>.catch</code>.</p><p>Lo stesso succede per ogni eccezione <em><em>s</em>incrona </em>che avviene nella funzione executor o in una funzione di gestione.</p><p>Questo è un esempio in cui un errore viene trattato come un rifiuto e il metodo <code>.catch</code> viene chiamato:</p><pre><code class="language-js">new Promise((resolve, reject) =&gt; {
  throw new Error("Something is wrong!");// nessuna chiamata di reject
}).catch((error) =&gt; console.log(error)); </code></pre><h2 id="come-usare-il-metodo-finally-"><strong>Come usare il metodo <strong><code>.finally()</code></strong></strong></h2><p>Il metodo <code>.finally()</code> svolge operazioni di pulizia come interrompere un caricamento, chiudere una connessione attiva, e così via. Il metodo <code>finally()</code> viene chiamato a prescindere del fatto che una promise sia risolta o rifiutata. Passa il risultato o l'errore al gestore seguente, che a sua volta potrà chiamare <code>.then()</code> o <code>.catch()</code>.</p><p>Questo è un esempio che ti aiuterà a capire i tre metodi insieme:</p><pre><code class="language-js">let loading = true;
loading &amp;&amp; console.log('Loading...');

// Ottieni la promise
promise = getPromise(ALL_POKEMONS_URL);

promise.finally(() =&gt; {
    loading = false;
    console.log(`Promise Settled and loading is ${loading}`);
}).then((result) =&gt; {
    console.log({result});
}).catch((error) =&gt; {
    console.log(error)
});</code></pre><p>Per spiegare meglio:</p><ul><li>Il metodo <code>.finally()</code> cambia il valore di <code>loading</code> in <code>false</code>.</li><li>Se la promise è risolta, il metodo <code>.then()</code> viene chiamato. Se la promise è rifiutata con un errore, viene chiamato il metodo <code>.catch()</code>. Il metodo <code>.finally()</code> sarà chiamato comunque a prescindere che la promise sia risolta o rifiutata.</li></ul><h1 id="cos-la-catena-di-promise"><strong>Cos'è la catena di Promise<strong>?</strong></strong></h1><p>La chiamata <code>promise.then()</code> restituisce sempre una promise. Questa promise avrà la proprietà <code>state</code> con valore <code>pending</code> e <code>result</code> sarà <code>undefined</code>. Ci permette chiamare il metodo <code>.then</code> sulla nuova promise.</p><p>Quando il primo <code>.then</code> restituisce un valore, il seguente <code>.then</code> può ricevere questo valore. Il secondo <code>.then</code> &nbsp;può passarlo al terzo e così via. Tutto questo forma una catena di <code>.then</code> che trasmette le promise. Questo fenomeno viene chiamato <strong>promise chain</strong> (catena di promise).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-105.png" class="kg-image" alt="image-105" width="600" height="400" loading="lazy"><figcaption>Promise Chain</figcaption></figure><p>Ecco un esempio:</p><pre><code class="language-js">let promise = getPromise(ALL_POKEMONS_URL);

promise.then(result =&gt; {
    let onePokemon = JSON.parse(result).results[0].url;
    return onePokemon;
}).then(onePokemonURL =&gt; {
    console.log(onePokemonURL);
}).catch(error =&gt; {
    console.log('In the catch', error);
});</code></pre><p>Qui per prima cosa otteniamo una promise risolta e quindi estraiamo l'URL per raggiungere il primo Pokémon. Quindi restituiamo questo valore che viene passato come promise al seguente metodo .then(). E dunque il risultato:</p><pre><code class="language-shell">https://pokeapi.co/api/v2/pokemon/1/</code></pre><p>Il metodo <code>.then</code> può restituire:</p><ul><li>Un valore (già abbiamo visto questo caso)</li><li>Oppure una nuova promise.</li></ul><p>Inoltre può anche dare un errore.</p><p>Ecco un esempio in cui creiamo una catena di promise con vari metodi <code>.then</code> che restituiscono dei risultati e una nuova promise:</p><pre><code class="language-js">// Catena di promise con then e catch multipli
let promise = getPromise(ALL_POKEMONS_URL);

promise.then(result =&gt; {
    let onePokemon = JSON.parse(result).results[0].url;
    return onePokemon;
}).then(onePokemonURL =&gt; {
    console.log(onePokemonURL);
    return getPromise(onePokemonURL);
}).then(pokemon =&gt; {
    console.log(JSON.parse(pokemon));
}).catch(error =&gt; {
    console.log('In the catch', error);
});</code></pre><p>Nel primo <code>.then</code> estraiamo l'URL e restituiamo il suo valore. Questo URL viene passato al secondo <code>.then</code> che restituisce una nuova promise che prende l'URL come argomento.</p><p>Quest'ultima promise viene risolta e trasmessa nella catena dove otteniamo le informazioni sul Pokémon. Questo è il risultato:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-159.png" class="kg-image" alt="image-159" width="600" height="400" loading="lazy"><figcaption>Output della catena di promise</figcaption></figure><p>Nel caso in cui ci fosse un errore o una promise rifiutata, il metodo .catch nella catena verrebbe chiamato.</p><p>Un punto importante: chiamare <code>.then</code> più volte non forma una catena di promise. Potresti finire per introdurre un bug nel codice:</p><pre><code class="language-js">let promise = getPromise(ALL_POKEMONS_URL);

promise.then(result =&gt; {
    let onePokemon = JSON.parse(result).results[0].url;
    return onePokemon;
});
promise.then(onePokemonURL =&gt; {
    console.log(onePokemonURL);
    return getPromise(onePokemonURL);
});
promise.then(pokemon =&gt; {
    console.log(JSON.parse(pokemon));
});
</code></pre><p>Abbiamo chiamato il metodo <code>.then</code> tre volte sulla stessa promise, ma non abbiamo trasmesso la promise. Questo è diverso dalla catena di promise. Nell'ultimo esempio, Il risultato sarebbe un errore.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-160.png" class="kg-image" alt="image-160" width="600" height="400" loading="lazy"></figure><h1 id="come-gestire-promise-multiple"><strong>Come gestire promise multiple</strong></h1><p>Oltre ai gestori (.then, .catch e .finally), esistono sei metodi statici disponibili nella API Promise. I primi quattro metodi accettano un array di promise e le eseguono in parallelo.</p><ol><li>Promise.all</li><li>Promise.any</li><li>Promise.allSettled</li><li>Promise.race</li><li>Promise.resolve</li><li>Promise.reject</li></ol><p>Vediamoli uno a uno.</p><h2 id="il-metodo-promise-all-"><strong>Il metodo <strong>Promise.all()</strong></strong></h2><p><code>Promise.all([promise])</code> accetta una collezione (per esempio, un array) di promise come argomento e le esegue in parallelo.</p><p>Questo metodo aspetta fino a che tutte le promise siano risolte e ritorna un array con i loro risultati. Se una qualsiasi di queste promise viene rifiutata o non viene eseguita a causa di un errore, i risultati di tutte le altre vengono ignorati.</p><p>Creiamo tre promise per ottenere informazioni su tre Pokémon.</p><pre><code class="language-js">const BULBASAUR_POKEMONS_URL = 'https://pokeapi.co/api/v2/pokemon/bulbasaur';
const RATICATE_POKEMONS_URL = 'https://pokeapi.co/api/v2/pokemon/raticate';
const KAKUNA_POKEMONS_URL = 'https://pokeapi.co/api/v2/pokemon/kakuna';


let promise_1 = getPromise(BULBASAUR_POKEMONS_URL);
let promise_2 = getPromise(RATICATE_POKEMONS_URL);
let promise_3 = getPromise(KAKUNA_POKEMONS_URL);</code></pre><p>E usiamo il metodo Promise.all() passando un array di promise.</p><pre><code class="language-js">Promise.all([promise_1, promise_2, promise_3]).then(result =&gt; {
    console.log({result});
}).catch(error =&gt; {
    console.log('An Error Occured');
});</code></pre><p>Risultato:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-161.png" class="kg-image" alt="image-161" width="600" height="400" loading="lazy"></figure><p>Come puoi vedere, viene restituito il risultato di tutte le promise. Il tempo di esecuzione di tutte le promise è uguale al tempo massimo di esecuzione della promise più "lenta".</p><h2 id="il-metodo-promise-any-"><strong>Il metodo<strong> Promise.any()</strong></strong></h2><p><code>Promise.any([promise])</code> - Simile al metodo <code>all()</code>, anche <code>.any()</code> accetta un array di promise da eseguire in parallelo. Però questo metodo non aspetta che tutte le promise siano risolte. Termina quando una qualsiasi delle promise è conclusa.</p><pre><code class="language-javascript"> Promise.any([promise_1, promise_2, promise_3]).then(result =&gt; {
     console.log(JSON.parse(result));
 }).catch(error =&gt; {
     console.log('An Error Occured');
 });</code></pre><p>Il risultato sarà il risultato di una delle promise risolte:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-162.png" class="kg-image" alt="image-162" width="600" height="400" loading="lazy"></figure><h2 id="il-metodo-promise-allsettled-"><strong>Il metodo<strong> Promise.allSettled()</strong></strong></h2><p><code>Promise.allSettled([promise])</code> - Questo metodo aspetta che tutte le promise siano concluse (risolte o rifiutate) e ritorna i loro risultati come un array di oggetti. I risultati conterranno la stato (fulfilled/rejected) e il valore, se lo stato è fulfilled. Nel caso in cui lo stato sia rejected, ritornerà la ragione dell'errore.</p><p>Ecco un esempio di tutte promise con stato fulfilled:</p><pre><code class="language-js">Promise.allSettled([promise_1, promise_2, promise_3]).then(result =&gt; {
    console.log({result});
}).catch(error =&gt; {
    console.log('There is an Error!');
});</code></pre><p>Risultato:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-163.png" class="kg-image" alt="image-163" width="600" height="400" loading="lazy"></figure><p>Se qualcuna delle promise fosse rifiutata, per esempio la promise_1,</p><pre><code class="language-javascript">let promise_1 = getPromise(POKEMONS_BAD_URL);</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-164.png" class="kg-image" alt="image-164" width="600" height="400" loading="lazy"></figure><h2 id="il-metodo-promise-race-"><strong>Il<strong> </strong>metodo <strong>Promise.race()</strong></strong></h2><p><code>Promise.race([promises])</code> – Aspetta la prima promise (la più veloce) a essere conclusa, e ritorna il risultato/errore di conseguenza.</p><pre><code class="language-js">Promise.race([promise_1, promise_2, promise_3]).then(result =&gt; {
    console.log(JSON.parse(result));
}).catch(error =&gt; {
    console.log('An Error Occured');
});</code></pre><p>Il risultato sarà la promise che viene risolta più rapidamente:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/11/image-165.png" class="kg-image" alt="image-165" width="600" height="400" loading="lazy"></figure><h2 id="i-metodi-promise-resolve-reject"><strong>I metodi<strong> Promise.resolve/reject</strong></strong></h2><p><code>Promise.resolve(value)</code> – Risolve una promise con il valore passato come argomento. È equivalente al seguente codice:</p><pre><code class="language-js">let promise = new Promise(resolve =&gt; resolve(value));</code></pre><p><code>Promise.reject(error)</code> – Rifiuta una promise con l'errore passato come argomento. È equivalente al seguente codice:</p><pre><code class="language-js">let promise = new Promise((resolve, reject) =&gt; reject(error));</code></pre><h1 id="possiamo-riscrivere-l-esempio-di-pizzahub-con-le-promise"><strong>Possiamo riscrivere l'esempio di <strong>PizzaHub </strong>con le </strong>promise<strong><strong>?</strong></strong></h1><p>Certo che sì, facciamolo. Supponiamo che il metodo <code>query</code> ritorni una promise. Nella vita reale, questo metodo potrebbe comunicare con un database e restituire i risultati. In questo caso, restituisce un risultato predeterminato, ma va bene per il nostro esempio.</p><pre><code class="language-js">function query(endpoint) {
  if (endpoint === `/api/pizzahub/`) {
    return new Promise((resolve, reject) =&gt; {
      resolve({'shopId': '123'});
    })
  } else if (endpoint.indexOf('/api/pizzahub/pizza/') &gt;=0) {
    return new Promise((resolve, reject) =&gt; {
      resolve({pizzas: [{'type': 'veg', 'name': 'margherita', 'id': '123'}]});
    })
  } else if (endpoint.indexOf('/api/pizzahub/beverages') &gt;=0) {
    return new Promise((resolve, reject) =&gt; {
      resolve({id: '10', 'type': 'veg', 'name': 'margherita', 'beverage': 'coke'});
    })
  } else if (endpoint === `/api/order`) {
    return new Promise((resolve, reject) =&gt; {
      resolve({'type': 'veg', 'name': 'margherita', 'beverage': 'coke'});
    })
  }
}</code></pre><p>Il prossimo passo è il refactoring del nostro inferno di callback. A questo scopo, per prima cosa, creeremo alcune funzioni logiche:</p><pre><code class="language-js">// Restituisce shop id
let getShopId = result =&gt; result.shopId;

// Restituisce una promise con la liste delle pizze del ristorante
let getPizzaList = shopId =&gt; {
  const url = `/api/pizzahub/pizza/${shopId}`;
  return query(url);
}

// Restituisce una promise con la pizza che corrisponde alle richieste del cliente
let getMyPizza = (result, type, name) =&gt; {
  let pizzas = result.pizzas;
  let myPizza = pizzas.find((pizza) =&gt; {
    return (pizza.type===type &amp;&amp; pizza.name===name);
  });
  const url = `/api/pizzahub/beverages/${myPizza.id}`;
  return query(url);
}

// Restituisce una promise dopo aver ordinato
let performOrder = result =&gt; {
  let beverage = result.id;
   return query(`/api/order`, {'type': result.type, 'name': result.name, 'beverage': result.beverage});
}

// Conferma l'ordine
let confirmOrder = result =&gt; {
    console.log(`Your order of ${result.type} ${result.name} with ${result.beverage} has been placed!`);
}</code></pre><p>Usiamo queste funzioni per creare le promise necessarie. Questo è il codice che dovresti paragonare con l'esempio dell'inferno di callback. È molto più bello ed elegante.</p><pre><code class="language-js">function orderPizza(type, name) {
  query(`/api/pizzahub/`)
  .then(result =&gt; getShopId(result))
  .then(shopId =&gt; getPizzaList(shopId))
  .then(result =&gt; getMyPizza(result, type, name))
  .then(result =&gt; performOrder(result))
  .then(result =&gt; confirmOrder(result))
  .catch(function(error){
    console.log(`Bad luck, No Pizza for you today!`);
  })
}</code></pre><p>E infine, chiamiamo il metodo orderPizza() passando il tipo e il nome della pizza, in questo modo:</p><pre><code class="language-js">orderPizza('veg', 'margherita');
</code></pre><h1 id="cosa-viene-dopo"><strong>Cosa viene dopo<strong>?</strong></strong></h1><p>Se sei arrivato fin qui e hai letto la maggior parte di questo articolo, congratulazioni! Dovresti avere un'idea più chiara sulle promise in JavaScript. Puoi trovare tutti gli esempi usati nell'articolo in questo <a href="https://github.com/atapas/js-promise-example">repository GitHub</a>.</p><p>Il prossimo passo, dovrebbe essere apprendere le funzioni <code>async</code> in JavaScript che semplificano ulteriormente le cose. Il concetto delle promise in JavaScript si apprende meglio scrivendo dei piccoli esempi e lavorando su di essi.</p><p>A prescindere dal framework o dalla libreria che usiamo (Angular, React, Vue, ecc.), le operazioni asincrone sono inevitabili. Questo vuol dire che dobbiamo capire le promise per lavorare meglio.</p><p>Inoltre, sono sicuro che l'uso del metodo <code>fetch</code> ti risulterà più facile adesso:</p><pre><code class="language-js">fetch('/api/user.json')
.then(function(response) {
    return response.json();
})
.then(function(json) {
    console.log(json); // {"name": "tapas", "blog": "freeCodeCamp"}
});</code></pre><ul><li>Il metodo <code>fetch</code> restituisce una promise. Quindi possiamo usare il metodo <code>.then</code>.</li><li>Il resto riguarda la catena di promise che abbiamo imparato in questo articolo.</li></ul><h1 id="prima-di-terminare-"><strong>Prima di terminare<strong>...</strong></strong></h1><p>Grazie per aver letto fin qui! Connettiamoci. Puoi taggarmi su <a href="https://twitter.com/tapasadhikary">Twitter (@tapasadhikary)</a> in un commento.</p><p>Potresti trovare interessanti 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></li><li><a href="https://blog.greenroots.info/javascript-equality-comparison-with-and-objectis-ckdpt2ryk01vel9s186ft8cwl">JavaScript: Equality comparison with ==, === and Object.is</a></li><li><a href="https://www.freecodecamp.org/news/javascript-this-keyword-binding-rules/">The JavaScript `this` Keyword + 5 Key Binding Rules Explained for JS Beginners</a></li><li><a href="https://www.freecodecamp.org/news/javascript-typeof-how-to-check-the-type-of-a-variable-or-object-in-js/">JavaScript TypeOf – How to Check the Type of a Variable or Object in JS</a></li></ul><p>È tutto per adesso. Ci vediamo presto con il mio prossimo articolo. Stammi bene.</p><hr> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
