Peut-on passer des variables par référence en JavaScript?

Variables are passed by value, objects by reference. Arrays in JavaScript are objects

Nous allons vérifier chaque cas de figure...

Cas d'une variable simple

La fonction test() ajoute une chaîne à une chaîne donnée en paramètre.

function test(z)
{
   z = z + "suffixe";
}

var x = "démo";
test(x);
document.write(x);

On peut vérifier que la variable x n'est pas modifiée hors du contexte de la fonction.

La même chose se vérifierait avec un nombre.

Cas d'un objet String

var x = new String("démo");
test(x);
document.write(x);

Les objets simples comme String, Boolean, Number sont aussi passés par valeur.

Cas d'un objet Array

La fonction testa ajoute un élément à un tableau donné en paramètre.

function testa(a)
{
   a.push("ajouté");
}

x = new Array("un", "deux", "trois");
testa(x);
document.write(x);

On voit qu'un objet Array est passé par référence, puisque l'élément ajouté dans le corps de la fonction reste inclus dans le tableau après l'appel de la fonction.

Cela vaut-il aussi pour un tableau déclaré comme un litéral?

var y = [1, 2, 3];
testa(y);
document.write(y);

La réponse est oui.

En conclusion, si l'on veut passer une variable simple par référence, il faut l'inclure dans un tableau... Le code sera modifié comme ceci:

x = "démo";
x = [x];
testa(x);
x = x.join('');
document.write(x);

La fonction join() transforme le tableau en chaîne de caractères après l'appel de la fonction. Cela alourdi le code mais sans opérateur de déréférencement, et il n'y en a pas en JavaScript, cela reste le moyen le plus simple de passer une chaîne de caractères par référence.

Example complet pour passer une chaîne par référence

function testb(a)
{
  var x = a[0];
  x += "suffixe";
  a[0] = x;
}
 
x = "démo";
x = [x];
testb(x);
x = x[0];
document.write(x);

La chaîne, bien que modifiée dans la fonction, faisant partie d'un tableau, est modifiée dans le scope global. C'est plus compliqué, mais c'est possible.

Assignement dans une fonction

L'assignement dans une fonction, que ce soit pour un objet ou un tableau, n'a pas d'effet hors du scope de la fonction. C'est pourquoi on dit quelquefois que l'argument est passé par échange (call-sharing) plutôt que par référence.

var ta = [ "a", "b", "c"]
function testb(x) {
   x = ["zero"]
}
testb(ta)
document.write(ta)

Résultat

Donc si on veut initialiser un tableau ou un objet dans une fonction, il faut éffacer son contenu plutôt que l'assigner avec [] ou {}.

© 2012-2016 Xul.fr