Mes 2 Cents.... Il est sans importance de savoir si Javascript transmet des paramètres par référence ou la valeur. Ce qui est vraiment important est d'affectation vs mutation.
J'ai écrit une plus longue explication plus détaillée ici (JavaScript Est un passage par référence ou par valeur de la langue?)
Lorsque vous passer quoi que ce soit (qu'il S'agisse d'un objet ou d'une primitive), tous le javascript n'est d'assigner une nouvelle variable tandis que l'intérieur de la fonction... tout comme avec le signe égal (=)
Comment ce paramètre se comporte à l'intérieur de la fonction est exactement le même que celui-ci se comporte si vous venez d'affecter une nouvelle variable à l'aide du signe égal.. Prendre ces exemples simples.
var myString = 'Test string 1';
// Assignment - A link to the same place as myString
var sameString = myString;
// If I change sameString, it will not modify myString,
// it just re-assigns it to a whole new string
sameString = 'New string';
console.log(myString); // logs 'Test string 1';
console.log(sameString); // logs 'New string';
Si je devais passer myString comme paramètre à une fonction, il se comporte comme si j'simplement assigné à une nouvelle variable. Maintenant, laissez-nous faire la même chose, mais avec une fonction au lieu d'une simple affectation
function myFunc(sameString) {
// Re assignment.. again, it will not modify myString
sameString = 'New string';
}
var myString = 'Test string 1';
// This behaves the same as if we said sameString = myString
myFunc(myString);
console.log(myString); // Again, logs 'Test string 1';
La seule raison pour laquelle vous pouvez modifier les objets lorsque vous les transmettre à une fonction est parce que vous n'êtes pas réaffectation des... au Lieu de cela, les objets peuvent être modifiés ou muté.... Encore une fois, il fonctionne de la même manière.
var myObject = { name: 'Joe'; }
// Assignment - We simply link to the same object
var sameObject = myObject;
// This time, we can mutate it. So a change to myObject affects sameObject and visa versa
myObject.name = 'Jack';
console.log(sameObject.name); // Logs 'Jack'
sameObject.name = 'Jill';
console.log(myObject.name); // Logs 'Jill'
// If we re-assign it, the link is lost
sameObject = { name: 'Howard' };
console.log(myObject.name); // Logs 'Jill'
Si je devais passer myObject comme paramètre à une fonction, il se comporte comme si j'simplement assigné à une nouvelle variable. Encore une fois, la même chose avec exactement le même comportement, mais avec une fonction.
function myFunc(sameObject) {
// We mutate the object, so the myObject gets the change too... just like before.
sameObject.name = 'Jill';
// But, if we re-assign it, the link is lost
sameObject = { name: 'Howard' };
}
var myObject = { name: 'Joe'; }
// This behaves the same as if we said sameObject = myObject;
myFunc(myObject);
console.log(myObject.name); // Logs 'Jill'
Chaque fois que vous passez une variable à une fonction, vous êtes "Affectation" quel que soit le nom du paramètre est, tout comme si vous avez utilisé le signe égal ( = ).
Rappelez-vous toujours que le signe égal (=) des moyens d'affectation.
Et le passage d'un paramètre à une fonction aussi des moyens d'affectation.
Ils sont les mêmes et les 2 variables sont connectés exactement de la même manière.
La seule fois que la modification d'une variable affecte une variable différente, c'est quand l'objet sous-jacent est muté.
Il est inutile de faire une distinction entre les objets et les primitives, car il fonctionne de la même manière exacte comme si vous n'aviez pas une fonction et juste utilisé le signe égal pour affecter à une nouvelle variable.