Passaggio per riferimento in Javascript
Nel linguaggio javascript le variabili assegnate agli oggetti non contengono i dati effettivi, ma piuttosto un riferimento all'indirizzo di memoria in cui sono registrati i dati.
Un esempio pratico
Ad esempio, in javascript un array contiene i riferimenti agli indirizzi di memoria dei dati e non i dati stessi.
var myVar = new Array(0, 1, 2, 3, 4);
Pertanto, quando copio la variabile array, sto copiando i riferimenti agli indirizzi di memoria.
var myVar_copia = myVar;
Se modifico un elemento della nuova variabile il nuovo valore (9) viene registrato nell'indirizzo di memoria dell'aray.
myVar_copia[0] = 9;
La modifica si ripercuote anche sulla variabile myVar perché punta allo stesso indirizzo di memoria.
document.write(myVar[0]);
Sia nell'elemento myVar_copia[0] che nell'elemento myVar[0] è memorizzato il valore 9.
9
Questo accade perché entrambe le variabili myVar e myVar_copia fanno riferimento allo stesso indirizzo di memoria dell'oggetto array.
Esempio 2
In questo esempio definisco una classe Persone.
- function Persone(nome,cognome) {
- this.nome = nome;
- this.cognome = cognome;
- this.getNome = function() {
- return this.nome + " " + this.cognome;
- }
- }
Poi creo un oggetto tramite un'istanza e lo memorizzo nella variabile p
var p = new Persone("Andrea", "Minini");.
Quando copio l'oggetto p nella variabile q tramite l'istruzione var q=p sto copiando i riferimenti agli indirizzi di memoria dello stesso oggetto.
var q = p;
Quindi, qualsiasi modifica alla variabile q si ripercuote anche sulla variabile p.
Ad esempio, modifico il valore assegnato alla proprietà q.nome="Andrea2"
q.nome="Andrea2";
Il nuovo valore "Andrea2" viene memorizzato nell'indirizzo di memoria a cui puntano entrambe le variabili p e q.
Pertanto, il nuovo valore appare sia nella proprietà q.nome che in p.nome.
Nota. Lo stesso non accade con i dati primitivi (es. numeri, stringhe). Le variabili come stringhe e numeri vengono sempre passate per valore. In questi casi javascript memorizza il valore vero e proprio nell'indirizzo di memoria della variabile e non un riferimento a un indirizzo di memoria. Ad esempio se assegno una stringa a una variabile myVar e poi copio quest'ultima nella variabile myVar_copia, viene copiato il dato
var myVar="ABC";
var myVar_copia = myVar;
myVar_copia="DEF";
Nella variabile myVar_copia viene memorizzata la stringa "DEF" mentre nella variabile myVar contiuna a essere memorizzata la stringa "ABC". Lo stesso accade per i numeri e i valori booleani.E così via.