Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 112
  • livello avanzato
Indice lezioni

Object, oggetti, riferimenti e tipi primitivi

Differenze tra tipi primitivi e oggetti in JavaScript, cos'è l'oggetto Object e come utilizzare la parola chiave 'new'.
Differenze tra tipi primitivi e oggetti in JavaScript, cos'è l'oggetto Object e come utilizzare la parola chiave 'new'.
Link copiato negli appunti

C'è una sostanziale differenza tra gli oggetti e i cinque tipi di dato primitivi di JavaScript nei confronti dell'assegnamento alle variabili:

  • I tipi di dato primitivi, come numeri e stringhe, sono tipi semplici il cui valore viene direttamente assegnato ad una variabile. Quindi in questo caso la variabile contiene effettivamente il valore assegnatole.
  • Gli oggetti sono strutture complesse e l'assegnamento di un oggetto ad una variabile non fa in modo che la variabile contenga effettivamente l'oggetto. Essa contiene in realtà un riferimento all'oggetto.

Vediamo l'implicazione di questa osservazione con un esempio. Consideriamo il seguente codice:

var x = 10;
var y = x;
y = y + 1;

In esso definiamo la variabile x assegnandole il valore 10, quindi definiamo y assegnadole il valore della variabile x e poi incrementiamo di uno il valore di y. Alla fine dell'esecuzione di questo codice otterremo x con il valore di 10 e y con il valore di 11. L'incremento di uno, effettuato su y, non ha influito sul valore della variabile x, dal momento che ciascuna variabile contiene effettivamente il valore assegnato loro.

Consideriamo un esempio analogo sugli oggetti:

var persona = {nome: "Mario", cognome: "Rossi"};
var altraPersona = persona;  
altraPersona.nome = "Giuseppe";

In questo caso se proviamo ad accedere alla proprietà nome dell'oggetto persona scopriremo che anch'essa ha ora il valore Giuseppe. In realtà entrambe le variabili persona e altraPersona contengono un riferimento allo stesso oggetto e pertanto ogni modifica effettuata alla variabile persona si riflette anche sulla variabile altraPersona.

Questo è un aspetto molto importante da tenere presente quando si lavora con gli oggetti, in particolar modo nel passaggio di valori agli argomenti delle funzioni.

Passaggio di variabili alle funzioni: per valore o per riferimento

Infatti il meccanismo del passaggio di valori alle funzioni adotta lo stesso approccio dell'assegnamento alle variabili. In pratica, parlando in termini tecnici, il passaggio di valori relativi a tipi di dato primitivi avviene sempre per valore mentre il passaggio di oggetti avviene sempre per riferimento.

Approfondiremo più avanti aspetti avanzati degli oggetti in JavaScript.

Object

Come abbiamo visto, il supporto di JavaScript per la creazione di oggetti è molto flessibile ed abbastanza immediato. Ma oltre a consentirci di definire ed utilizzare gli oggetti che servono alla nostra applicazione, JavaScript ci mette a disposizione diversi oggetti predefiniti che risultano molto comodi per le più comuni attività di programmazione.

Il primo di questi oggetti che prendiamo in considerazione è Object. Anche se a prima vista può sembrare strano avere un oggetto con questo nome, vedremo come esso sia fondamentale per tutti gli oggetti di JavaScript.

In pratica ogni oggetto, predefinito o meno che sia, è costruito su Object in base ad un meccanismo che approfondiremo più avanti. Questo fa sì che tutti gli oggetti JavaScript abbiano alcune caratteristiche comuni.

Negli esempi di creazione degli oggetti che abbiamo visto finora ci siamo basati sulla loro rappresentazione letterale:

var persona = { nome: "Mario", cognome: "Rossi"};

oppure

var persona = {}; 
persona.nome = "Mario";
persona.cognome = "Rossi";

Possiamo ottenere lo stesso risultato utilizzando direttamente l'oggetto Object:

var persona = new Object(); 
persona.nome = "Mario";
persona.cognome = "Rossi";

In questo caso utilizziamo l'operatore new per creare una nuova istanza di un oggetto vuoto.

Object e new

L'oggetto Object è anche in grado di generare istanze di oggetti a partire da una qualunque espressione JavaScript, come mostrato dal seguente codice:

var numero      = new Object(12);
var altroNumero = new Object(3*2);
var stringa     = new Object("test");
var persona     = new Object({nome: "Mario", cognome: "Rossi"});

A parte l'ultima istruzione che è equivalente alla creazione di un oggetto tramite la sua rappresentazione letterale, le prime tre istruzioni creano un oggetto a partire da un tipo di dato primitivo, come un numero o una stringa.

Il risultato ottenuto non è un semplice valore numerico o un valore di tipo stringa, ma oggetti specializzati nella manipolazione di valori numerici e stringhe. In particolare, per ogni tipo di dato primitivo, tranne null e undefined, esiste un corrispondente oggetto specializzato che mette a disposizione del programmatore specifiche proprietà e metodi.

ToString e ValueOf, metodi condivisi da tutti gli oggetti

Dal momento che tutti gli oggetti JavaScript sono basati su Object, essi condividono alcuni metodi, come ad esempio: toString() e valueOf().

Il primo metodo restituisce una versione in stringa dell'oggetto, come mostrato nel seguente esempio:

var x = new Object(32);
x.toString();            //restituisce "32"

Nel caso di oggetto non riconducibile ad un tipo di dato primitivo sarà restituita la stringa [object Object]:

var persona = new Object({nome: "Mario", cognome: "Rossi"});
persona.toString();		//restituisce "[object Object]"

Il metodo valueOf() restituisce il corrispondente valore del tipo di dato primitivo associato all'oggetto:

var x = new Object(32);
x.valueOf();             //restituisce 32

Nel caso di oggetto non associato ad un tipo di dato primitivo viene restituito l'oggetto stesso.

È da sottolineare come JavaScript chiami implicitamente questi metodi quando è necessario effettuare delle conversioni o quando in un'espressione è richiesto il valore primitivo dell'oggetto.

Ti consigliamo anche