問題示例:
直接用=的方式把一個對象賦值給另一個對象,會導致修改新對象時,原對象也發生變化
var obj1 = {'age': '10','friends':{'Aymi':'12','Jack':'9'}};
var obj2 = obj1; //obj1賦值給新對象obj2
obj2.age = '20'; //修改obj2的age值
console.log(obj1.age); //'20' //obj1中的age值也改變了
問題原因:
JavaScript 中對象的賦值是默認引用賦值的(兩個對象指向相同的內存地址),所以修改另一個對象時,即修改了內存地址里的對象,其他關聯對象也會改變
解決方法:
- 轉換類型法:obj2=JSON.parse(JSON.stringify(obj1))
- es6之Object.assign()法:obj2=Object.assign({},obj1)
注:Object.assign()方法有不足之處,Object.assign()只是讓對象里第一層的數據沒有了關聯性(即修改obj2.age時obj1.age不會發生變化),但是對象內的對象則跟被復制的對象有着關聯性的(即當修改更深層的obj2.friends.Aymi的值時,原對象obj1.friends.Aymi也跟着發生了變化)
所以推薦使用obj2=JSON.parse(JSON.stringify(obj1))這種方法
更詳細介紹參考
https://www.cnblogs.com/c2016c/articles/9328725.html