Dati primitivi e dati di riferimento in JavaScript

In JavaScript, esistono due tipi di dati: i dati primitivi (primitive) e i dati di riferimento (reference). Comprendere le differenze tra questi due tipi è fondamentale per scrivere codice efficiente e comprenderne il comportamento. In questa pagina, esploreremo le caratteristiche dei dati primitivi e dei dati di riferimento, analizzando come vengono memorizzati e manipolati.

Dati primitivi in JavaScript

I dati primitivi sono i tipi di dati fondamentali in JavaScript. Sono immutabili, il che significa che, una volta creati, non possono essere modificati. I dati primitivi vengono memorizzati direttamente nello spazio di memoria assegnato alla variabile. I cinque tipi di dati primitivi in JavaScript sono:

  • Number: Rappresenta i numeri, sia interi che decimali. Ad esempio: let numero = 42;
  • String: Rappresenta una sequenza di caratteri, racchiusi tra apici singoli o doppi. Ad esempio: let nome = "Alice";
  • Boolean: Rappresenta un valore di verità, true o false. Ad esempio: let èStudente = true;
  • Null: Rappresenta un valore nullo o vuoto. Ad esempio: let risultato = null;
  • Undefined: Rappresenta una variabile non inizializzata. Ad esempio: let valore;
let numero = 10;
let messaggio = "Ciao!";
let esito = true;
let prezzo = null;
let descrizione;

Dati di riferimento in JavaScript

I dati di riferimento, a differenza dei dati primitivi, vengono memorizzati nello spazio di memoria separato dallo spazio assegnato alla variabile. La variabile conterrà un riferimento a quel luogo di memoria piuttosto che il valore effettivo. I dati di riferimento includono oggetti, array, funzioni e altri oggetti complessi definiti dall'utente.

Esempi di dati di riferimento:

let persona = { nome: "Marco", eta: 30 };
let colori = ["rosso", "verde", "blu"];

function saluta(nome) {
	console.log("Ciao, " + nome + "!");
}

Nell'esempio, la variabile persona contiene un riferimento a un oggetto con proprietà nome ed età, mentre colori contiene un riferimento a un array di colori. La variabile saluta contiene un riferimento a una funzione.

Passaggio per valore vs passaggio per riferimento

Una differenza fondamentale tra dati primitivi e dati di riferimento riguarda il passaggio di questi dati a funzioni o variabili. Quando passiamo un dato primitivo a una funzione o lo assegniamo a una variabile, viene passato per valore, ovvero viene creato un duplicato del dato. Modificando il dato all'interno della funzione o della variabile non influenzerà il valore originale.

D'altro canto, quando passiamo un dato di riferimento a una funzione o lo assegniamo a una variabile, viene passato per riferimento. In altre parole, la funzione o la variabile avrà un riferimento allo stesso oggetto in memoria. Modificando l'oggetto all'interno della funzione o della variabile influenzerà il valore originale.

Esempio di passaggio per valore e passaggio per riferimento:

// Passaggio per valore
let a = 5;
function raddoppia(numero) {
	numero = numero * 2;
	console.log(numero); // Stampa: 10
}
raddoppia(a);
console.log(a); // Stampa: 5 (non è stato modificato)

// Passaggio per riferimento
let persona = { nome: "Luca", eta: 25 };
function cambiaEta(p) {
	p.eta = 30;
}
cambiaEta(persona);
console.log(persona); // Stampa: { nome: "Luca", eta: 30 } (è stato modificato)

Quando utilizzare dati primitivi o dati di riferimento

È importante scegliere tra dati primitivi e dati di riferimento a seconda delle esigenze del nostro codice. I dati primitivi sono più efficienti in termini di memoria e possono essere copiati facilmente senza influenzare i dati originali. I dati di riferimento, d'altra parte, consentono di gestire strutture dati complesse e oggetti con proprietà e metodi.