JavaScript Passer des arguments par référence ou valeur


Exemple

En JavaScript, tous les arguments sont passés par valeur. Lorsqu'une fonction assigne une nouvelle valeur à une variable d'argument, cette modification ne sera pas visible pour l'appelant:

var obj = {a: 2};
function myfunc(arg){
    arg = {a: 5}; // Note the assignment is to the parameter variable itself
}
myfunc(obj);
console.log(obj.a); // 2

Cependant, les modifications apportées aux propriétés (imbriquées) de tels arguments seront visibles par l'appelant:

var obj = {a: 2};
function myfunc(arg){
    arg.a = 5; // assignment to a property of the argument
}
myfunc(obj);
console.log(obj.a); // 5

Cela peut être considéré comme un appel par référence: même si une fonction ne peut pas changer l'objet de l'appelant en attribuant une nouvelle valeur à lui, il pourrait muter l'objet de l'appelant.

Comme les arguments de valeur primitive, tels que les nombres ou les chaînes de caractères, sont immuables, il est impossible pour une fonction de les muter:

var s = 'say';
function myfunc(arg){
    arg += ' hello'; // assignment to the parameter variable itself
}
myfunc(s);
console.log(s); // 'say'

Lorsqu'une fonction veut modifier un objet passé en argument, mais ne veut pas réellement modifier l'objet de l'appelant, la variable d'argument doit être réaffectée:

6
var obj = {a: 2, b: 3};
function myfunc(arg){
    arg = Object.assign({}, arg); // assignment to argument variable, shallow copy
    arg.a = 5;
}
myfunc(obj);
console.log(obj.a); // 2

En guise d'alternative à la mutation sur place d'un argument, les fonctions peuvent créer une nouvelle valeur, basée sur l'argument, et la renvoyer. L'appelant peut alors l'affecter, même à la variable d'origine transmise en argument:

var a = 2;
function myfunc(arg){
    arg++;
    return arg;
}
a = myfunc(a);
console.log(obj.a); // 3