在做項目的時候遇到了一個問題。對象的復制
例:object1 = object2;
發現了修改object1的時候,也會修改object2。
原因是--引用。這個概念是知道。結果在寫代碼的時候忘記了。代碼要多寫啊。
再熟悉下引用的概念:
變量保存的是對象的地址。所以在賦值的時候只會賦值地址。但是都指向同一個對象。
那么問題來了:子對象發生改變,父對象也會發生改變。這不是我想要的。
所以就借這個機會學習了下關于對象的拷貝的方法:
- 淺拷貝
function copy(fObj) {
var Son = {};
for (var i in fObj) {
Son[i] = fObj[i];
}
return Son;
}
這個方法有個缺點:
如果fObj的一個屬性上是對象或者數字,一樣只會復制地址。
子對象在發生改變的時候,依然會改變父對象。所以這個時候就出現深拷貝了。-
深拷貝
和淺拷貝的區別:在拷貝父對象的時候在檢查要拷貝的元素是不是對象。然后遞歸。function deepCopy(obj){
var sonObj= typeof(obj)=="object"?{}:[];
for(var i in obj){
if(typeof(obj[i])=="Object"){
sonObj[i] = deepCopy(obj[i]);
}else{
sonObj[i] = obj[i];
}
}
return sonObj;
}
總結:
深拷貝和淺拷貝的區別在于在拷貝對象前,有沒有判斷要拷貝的屬性是不是對象,如果是對象,就要進行遞歸,然后在來一次。
這是在寫項目的時候發現的。我也發現了一個小辦法。
可以這樣復制對象:
var obj1 = json.parse(json.stringify(obj2));
這個辦法是先把obj2轉化為字符串,然后在通過parse轉化為對象,在傳給obj1,這樣obj就互不干擾了。