Ajax JavaScript CSS HTML 5 Gecko XUL

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.

© 2012 Xul.fr