**JavaScript** (JS) è il linguaggio di scripting fondamentale del Web. Nato nel 1996 in Netscape (chiamato inizialmente LiveScript), è oggi standardizzato come **ECMAScript** (ES). ## Introduzione e Utilizzo JavaScript è un linguaggio interpretato, dinamico e debolmente tipizzato. Sebbene sia nato per i browser (Client-Side), oggi gira ovunque (Server con Node.js, Database come CouchDB, App Desktop con Electron). ### Vantaggi Lato Client * **Performance:** Riduce il carico sul server eseguendo calcoli sul dispositivo dell'utente. * **Interattività:** Risposta immediata agli eventi (click, input) senza ricaricare la pagina. ### Inserimento nella Pagina 1. **Esterno (Best Practice):** File separato `.js`. ```html ``` 2. **Embedded:** Blocco script nell'HTML. ```html ``` 3. **Inline (Sconsigliato):** Negli attributi HTML. ```html ``` ## Tipi di Dati e Variabili ### Tipi Primitivi JS ha 6 tipi di dati fondamentali: 1. **`number`**: Interi e decimali (`42`, `3.14`). Include valori speciali come `NaN` (Not a Number) e `Infinity`. 2. **`string`**: Testo tra apici singoli o doppi (`"Ciao"`, `'Mondo'`). 3. **`boolean`**: `true` o `false`. 4. **`undefined`**: Valore di una variabile dichiarata ma non inizializzata. 5. **`null`**: Assenza intenzionale di valore (è un oggetto per un bug storico). 6. **`symbol`** (Introdotto in ES6, per identificatori unici). ### Variabili e Scope * **`var`**: Scope di funzione (o globale). Soggetta a **Hoisting** (può essere usata prima della dichiarazione, risultando `undefined`). * **`let` / `const`** (ES6+): Scope di blocco (`{}`). `const` non può essere riassegnata. ```javascript var x = 10; if (true) { var x = 20; // Modifica la x globale! } console.log(x); // 20 let y = 10; if (true) { let y = 20; // Nuova variabile locale al blocco } console.log(y); // 10 ``` > [!WARNING] Hoisting > Con `var`, le dichiarazioni vengono "spostate" in cima alla funzione. > ```javascript > console.log(a); // undefined (non errore!) > var a = 5; > ``` ## Operatori e Uguaglianza ### Coercizione (Type Coercion) JS cerca di convertire automaticamente i tipi. ```javascript console.log(5 == "5"); // true (converte stringa in numero) console.log(0 == false); // true console.log("" == 0); // true ``` ### Uguaglianza Stretta (`===`) Confronta sia il valore che il tipo. **Usare sempre questo.** ```javascript console.log(5 === "5"); // false console.log(0 === false); // false ``` ### Operatori Logici e Ternario * **AND (`&&`)**: Ritorna il primo `falso` o l'ultimo valore. * **OR (`||`)**: Ritorna il primo `vero` o l'ultimo valore. * **Ternario (`? :`)**: `condizione ? vero : falso`. ## Oggetti Un oggetto è una collezione di coppie chiave-valore. ```javascript // Object Literal var persona = { nome: "Mario", eta: 30, saluta: function() { return "Ciao sono " + this.nome; } }; // Accesso proprietà console.log(persona.nome); // Dot notation console.log(persona["eta"]); // Bracket notation (utile per chiavi dinamiche) // Modifica dinamica persona.lavoro = "Developer"; // Aggiunge nuova proprietà delete persona.eta; // Rimuove proprietà ``` ## Funzioni Le funzioni sono "cittadini di prima classe" (possono essere passate come variabili). ### Dichiarazione ```javascript function somma(a, b) { return a + b; } ``` ### Funzione Anonima (Function Expression) ```javascript var quadrato = function(x) { return x * x; }; ``` ### Scope e Closure Le funzioni interne "vedono" le variabili della funzione esterna. ```javascript function esterno(x) { return function interno(y) { return x + y; // 'x' è ricordata (Closure) }; } var aggiungi5 = esterno(5); console.log(aggiungi5(10)); // 15 ``` ## Array Liste ordinate di valori (anche misti). ```javascript var lista = ["mela", "pera", 42]; lista.push("banana"); // Aggiunge in fondo lista.pop(); // Rimuove l'ultimo lista.length; // Lunghezza (3) // Iterazione for (var i = 0; i < lista.length; i++) { console.log(lista[i]); } ``` ## Oggetti Globali Utili * **`Math`**: `Math.random()`, `Math.floor()`, `Math.max()`. * **`Date`**: Gestione date (`new Date()`). * **`JSON`**: Parsing e serializzazione dati. ```javascript var str = JSON.stringify({a: 1}); // '{"a":1}' var obj = JSON.parse(str); // {a: 1} ``` * **`Window`**: L'oggetto globale del browser (contiene `document`, `alert`, `console`).