JavaScript — Date, Set e Map

Oggetto Date · Collezioni uniche con Set · Coppie chiave-valore con Map · 2026 · Marco Consiglio
Volta Institute · Napoli
A.A. 2026
📅 Creare un oggetto Date
L'oggetto Date rappresenta un istante temporale (data e ora). Si crea sempre con la keyword new, a differenza di Math e String.
const adesso = new Date(); console.log(adesso); // → data e ora correnti, es. Wed Jul 29 2026 14:32:10 // Data specifica: anno, mese (0=gennaio!), giorno const compleanno = new Date(2026, 6, 15); console.log(compleanno); // → 15 luglio 2026 (il mese 6 = luglio, NON giugno!) // Da una stringa in formato ISO (consigliato, non ambiguo): const scadenza = new Date('2026-12-31');
⚠️ Il mese parte da 0, non da 1! new Date(2026, 0, 1) è il 1° gennaio 2026, non febbraio. È l'errore più comune e insidioso con l'oggetto Date — gennaio è il mese 0, dicembre è il mese 11.
🕐 Estrarre informazioni da una data
const oggi = new Date(); console.log(oggi.getFullYear()); // → 2026 console.log(oggi.getMonth()); // → 6 (luglio, perché parte da 0!) console.log(oggi.getDate()); // → 29 (giorno del mese) console.log(oggi.getDay()); // → 3 (giorno della settimana: 0=domenica, 3=mercoledì) console.log(oggi.getHours()); // → ore correnti (0-23)
💡 getMonth() restituisce 0-11, ma getDate() restituisce 1-31 (il giorno del mese è "normale"): solo il mese ha questa stranezza dello zero-based, non il giorno.
🖨️ Formattare una data in italiano
const oggi = new Date(); console.log(oggi.toLocaleDateString('it-IT')); // → 29/7/2026 console.log(oggi.toLocaleDateString('it-IT', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' })); // → mercoledì 29 luglio 2026
✅ toLocaleDateString() è il modo più affidabile per mostrare date leggibili agli utenti italiani, senza dover costruire manualmente la stringa con getDate/getMonth/getFullYear.
➕ Calcolare differenze tra date
const inizio = new Date('2026-01-01'); const fine = new Date('2026-07-29'); const differenzaMs = fine - inizio; // sottrarre date dà i millisecondi di differenza const giorni = Math.floor(differenzaMs / (1000 * 60 * 60 * 24)); console.log(giorni + ' giorni'); // → 209 giorni
💡 Sottrarre due oggetti Date restituisce la differenza in millisecondi: bisogna sempre dividere per 1000×60×60×24 per convertirla in giorni.
🎯 Set — una collezione che elimina i duplicati automaticamente
Un Set è una collezione di valori dove ogni valore può comparire una sola volta — se provi ad aggiungere un duplicato, viene semplicemente ignorato. È il modo più semplice per eliminare duplicati da un array.
const tagUnici = new Set(); tagUnici.add('html'); tagUnici.add('css'); tagUnici.add('html'); // duplicato: viene ignorato silenziosamente console.log(tagUnici); // → Set(2) {'html', 'css'} — solo 2 elementi, non 3 console.log(tagUnici.size); // → 2 (proprietà size, non length come gli array!) console.log(tagUnici.has('css')); // → true
⚠️ Un Set usa .size (non .length) per contare gli elementi, e .add() (non .push()) per aggiungerli — sintassi diversa da quella degli array, facile da confondere all'inizio.
🧹 Il trucco più usato: eliminare duplicati da un array
const numeriConDuplicati = [1, 2, 2, 3, 3, 3, 4]; const senzaDuplicati = [...new Set(numeriConDuplicati)]; console.log(senzaDuplicati); // → [1, 2, 3, 4]
✅ Questo pattern (creare un Set da un array, poi riconvertirlo in array con lo spread ...) è probabilmente l'uso più comune di Set in JavaScript reale — una riga per eliminare tutti i duplicati.
🗺️ Map — coppie chiave-valore, più flessibili di un Object
Un Map memorizza coppie chiave-valore, in modo simile a un oggetto { }, ma con differenze importanti: le chiavi di un Map possono essere di qualsiasi tipo (non solo stringhe), e un Map mantiene l'ordine di inserimento in modo affidabile.
const voti = new Map(); voti.set('Marco', 28); voti.set('Giulia', 30); console.log(voti.get('Giulia')); // → 30 console.log(voti.has('Marco')); // → true console.log(voti.size); // → 2 voti.delete('Marco'); console.log(voti.size); // → 1
💡 Map vs Object: con un Object le chiavi diventano sempre stringhe (anche se scrivi un numero); con un Map, una chiave numerica resta un numero, un oggetto resta un oggetto — utile quando la natura della chiave conta davvero.
🔁 Iterare su un Map
const voti = new Map([ ['Marco', 28], ['Giulia', 30] ]); for (const [nome, voto] of voti) { console.log(`${nome}: ${voto}`); } // → Marco: 28 // → Giulia: 30
✅ Il ciclo for...of su un Map restituisce direttamente coppie [chiave, valore] già "spacchettabili" — più diretto rispetto a iterare su un Object con Object.entries().
⚖️ Quando usare Array, Set, Object o Map
StrutturaUsala quando...
ArrayHai una lista ordinata di elementi, anche ripetuti (es. elenco di ordini)
SetHai bisogno che ogni valore compaia una sola volta, senza duplicati (es. tag unici, ID visitati)
ObjectHai coppie chiave-valore semplici, con chiavi sempre stringhe, per rappresentare un'entità (es. un utente: {nome, email})
MapHai coppie chiave-valore ma le chiavi possono essere di tipo diverso da stringa, o l'ordine di inserimento è importante da preservare
💡 Nella pratica quotidiana, Object resta la scelta più comune per dati semplici; Set e Map si usano quando emerge un'esigenza specifica (unicità, chiavi non-stringa) che Array/Object non coprono bene.
🧪 Playground — prova Date, Set e Map dal vivo
Scrivi codice JavaScript (usa console.log()) e premi "Esegui".
Editor JS
// il risultato apparirà qui