J'ai donc ce morceau de code où j'essaie de muter un objet en le passant comme référence à une fonction:

var c = { why: 'older' };
var d;
d = c;
//passing by reference
function changeGreeting(obj) {
    obj.why = 'newer' ; // mutate         
}
changeGreeting(d)
console.log(c);
console.log(d);

Cela mute avec succès et produit comme prévu: entrez la description de l'image ici Aucun problème jusqu'à présent ..

Ensuite, j'ai le mauvais code jumeau qui se ressemble mais ne se comporte pas:

var c = { why: 'older' };
var d;
d = c;
//passing by reference, i wish..
function changeGreeting(obj) {
    obj = { why: 'newer' }; // trying to mutate..        
}
changeGreeting(d)
console.log(c);
console.log(d);

Je m'attendrais à ce que cela fonctionne de la même manière, mais cela ne fonctionne pas (il ne parvient pas à muter). entrez la description de l'image ici Vous cherchez une bonne explication claire pourquoi?

2
user9441213 13 avril 2018 à 14:04

3 réponses

Meilleure réponse

Ce code obj = { why: 'newer' }; ne mute pas, il assigne simplement à une variable locale obj à l'intérieur de votre fonction.

Pour muter l'objet, vous devez utiliser l'attribution de propriété.

En d'autres termes, obj pointe vers un objet (contient une référence à cet objet), vous pouvez donc le muter. En réaffectant la valeur à un autre objet, vous remplacez cette référence à l'objet d'origine par une référence à votre nouvel objet.

2
Bergi 13 avril 2018 à 12:03

Votre fonction se comporte essentiellement comme suit

function changeGreeting(obj) {
    var obj; // creates the local variable
    obj = d; // assign the arguments (objects are passed by reference)
    obj = { why: 'newer' }; // Creates new reference for local object        
}

En raison du comportement ci-dessus, les références pour c et d sont conservées et continuent de pointer vers le même emplacement mémoire avant l'appel de fonction.

Modifier

Le premier scénario se comporte comme suit

function changeGreeting(obj) {
    var obj; // creates the local variable
    obj = d; // assign the arguments (objects are passed by reference)
    obj.why = 'newer'; // Updates local variable obj which has same reference as "d" and "c" 
}
1
Nikhil Aggarwal 13 avril 2018 à 12:00

Quand tu fais obj = { why: 'newer' }; Vous modifiez la variable de portée de fonction obj en référence à un nouvel objet { why: 'newer' }.

0
Elgorath 13 avril 2018 à 11:12