La gestion des paramètres en JavaScript est une source fréquente de confusion, souvent débattue comme étant soit du passage par référence, soit du passage par valeur. La réalité est plus nuancée : JavaScript utilise un mécanisme qui combine des aspects des deux, selon le type de données impliqué.
Table des matières
- Comprendre le passage par valeur avec les types primitifs
- Comprendre le passage par référence avec les objets
- Réconcilier le passage par valeur et le passage par référence en JavaScript
Comprendre le passage par valeur avec les types primitifs
Les types de données primitifs de JavaScript — number
, string
, boolean
, null
, undefined
, bigint
, et symbol
— fonctionnent avec un passage par valeur. Lorsqu’un type primitif est passé à une fonction, une copie de sa valeur est créée et passée. Les modifications effectuées dans la fonction n’affectent que cette copie, laissant la variable originale inchangée.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // Sortie : 10
Dans cet exemple, modifier y
à l’intérieur de changeValue
ne modifie pas le x
original.
Comprendre le passage par référence avec les objets
Les objets en JavaScript (y compris les tableaux et les fonctions) se comportent différemment. Lorsqu’un objet est passé à une fonction, ce qui est passé est une référence — un pointeur vers l’emplacement mémoire de l’objet. Par conséquent, toutes les modifications apportées aux propriétés de l’objet *à l’intérieur* de la fonction affectent directement l’objet original.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // Sortie : [1, 2, 3, 4]
Ici, myArray
est modifié car la fonction modifie l’objet lui-même, et non une copie.
Cependant, une distinction cruciale existe : la réaffectation du paramètre à un *nouvel* objet à l’intérieur de la fonction ne modifie pas l’original.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // Affectation d'un nouvel objet
}
reassignObject(myObject);
console.log(myObject); // Sortie : { a: 1 }
À l’intérieur de reassignObject
, obj
pointe vers un objet différent ; le myObject
original reste inchangé.
Réconcilier le passage par valeur et le passage par référence en JavaScript
Le passage de paramètres en JavaScript n’est ni l’un ni l’autre de manière stricte. C’est un système dépendant du contexte :
- Types primitifs : Passage par valeur. Une copie de la valeur est passée ; les modifications internes n’affectent pas l’original.
- Objets : Passage par référence. Une référence à l’objet est passée ; les modifications apportées aux propriétés de l’objet affectent l’original. La réaffectation du paramètre à un nouvel objet à l’intérieur de la fonction laisse l’original intact.
Maîtriser cette distinction est crucial pour écrire du code JavaScript robuste et prévisible. Le comportement dépend entièrement du fait que vous travaillez avec des types primitifs ou des objets.