Modifying a copy of a JavaScript object is causing the original object to change

前端 未结 5 1488
野趣味
野趣味 2020-11-22 05:06

I am copying myObj to tempMyObj

var tempMyObj = myObj;

tempMyObj.entity is an array of objects. I am

5条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 05:41

    This might be very tricky, let me try to put this in a simple way. When you "copy" one variable to another variable in javascript, you are not actually copying its value from one to another, you are assigning to the copied variable, a reference to the original object. To actually make a copy, you need to create a new object use

    The tricky part is because there's a difference between assigning a new value to the copied variable and modify its value. When you assign a new value to the copy variable, you are getting rid of the reference and assigning the new value to the copy, however, if you only modify the value of the copy (without assigning a new value), you are modifying the copy and the original.

    Hope the example helps!

    let original = "Apple";
    let copy1 = copy2 = original;
    copy1 = "Banana";
    copy2 = "John";
    
    console.log("ASSIGNING a new value to a copied variable only changes the copy. The ogirinal variable doesn't change");
    console.log(original); // Apple
    console.log(copy1); // Banana
    console.log(copy2); // John 
    
    //----------------------------
    
    original = { "fruit" : "Apple" };
    copy1 = copy2 = original;
    copy1 = {"animal" : "Dog"};
    copy2 = "John";
    
    console.log("\n ASSIGNING a new value to a copied variable only changes the copy. The ogirinal variable doesn't change");
    console.log(original); //{ fruit: 'Apple' }
    console.log(copy1); // { animal: 'Dog' }
    console.log(copy2); // John */
    
    //----------------------------
    // HERE'S THE TRICK!!!!!!!
    
    original = { "fruit" : "Apple" };
    let real_copy = {};
    Object.assign(real_copy, original);
    copy1 = copy2 = original;
    copy1["fruit"] = "Banana"; // we're not assiging a new value to the variable, we're only MODIFYING it, so it changes the copy and the original!!!!
    copy2 = "John";
    
    
    console.log("\n MODIFY the variable without assigning a new value to it, also changes the original variable")
    console.log(original); //{ fruit: 'Banana' } <====== Ops!!!!!!
    console.log(copy1); // { fruit: 'Banana' }
    console.log(copy2); // John 
    console.log(real_copy); // { fruit: 'Apple' } <======== real copy!

提交回复
热议问题