淺拷貝就只是複製物件的引用(堆和棧的關係,簡單型別undefined,null,boolean,number和string是存入堆,直接引用,object array 則是存入桟中,只用乙個指標來引用值),如果拷貝後的物件發生變化,原物件也會發生變化。
只有深拷貝才是真正地對物件的拷貝。
二.js自帶的深拷貝方法
var arr1 = [1, 2, [3, 4]], arr2 = arr1.slice();
console.log(arr1); //[1, 2, [3, 4]]
console.log(arr2); //[1, 2, [3, 4]]
arr2[0] = 2
arr2[2][1] = 5;
console.log(arr1); //[1, 2, [3, 5]]
console.log(arr2); //[2, 2, [3, 5]]
var obj1 = , obj2 = object.assign({}, obj1);
console.log(obj1) //
console.log(obj2) //
obj2.x = 2; //修改obj2.x
console.log(obj1) //
console.log(obj2) //
var obj1 =
};var obj2 = object.assign({}, obj1);
console.log(obj1) //}
console.log(obj2) //}
obj2.y.m = 2; //修改obj2.y.m
console.log(obj1) //}
console.log(obj2) //}
var obj1 = ,
a:undefined,
b:function(a,b),
c:symbol("foo")
};var obj2 = json.parse(json.stringify(obj1));
console.log(obj1) //, a: undefined, b: ƒ, c: symbol(foo)}
console.log(obj2) //}
obj2.y.m = 2; //修改obj2.y.m
console.log(obj1) //, a: undefined, b: ƒ, c: symbol(foo)}
console.log(obj2) //}
注:進行json.stringify()
序列化的過程中,undefined、任意的函式以及 symbol 值
,在序列化過程中會被忽略(出現在非陣列物件的屬性值中時)或者被轉換成 null(出現在陣列中時)。
由上面可知,js 提供的自有方法並不能徹底解決array、object的深拷貝問題,因此我們應該自己實現。
深拷貝函式最終版(支援基本資料型別、原型鏈、regexp、date型別)
function deepclone(obj, parent = null)
_parent = _parent.parent;
} if(obj && typeof obj === "object")else if(obj instanceof date)elseelse
for(let key in obj));
}else}}
}}else
return result;
}var arr=[1,2,3,4];
var arr1=deepclone(arr);
arr1[1]=999
console.log(arr)
console.log(arr1)
注:function型別的深拷貝: 深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...