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.
| Tweet |
|