1 定義
深拷貝:拷貝一個對象時声畏,不僅把對象的引用進行復制,還把該對象引用的值也一起拷貝。這樣得到的深拷貝后的拷貝對象和源對象相互獨立憎兽。
淺拷貝:拷貝一個對象時,僅拷貝對象的引用吵冒,拷貝對象和源對象還是引用通一份實體纯命。兩者的改變相互影響。
2 js深拷貝
Object.assign()
只能實現(xiàn)對一維對象的深拷貝
var obj1={x:1,y:2};
var obj2=Object.assign({},obj1);
obj2.x=2;
console.log(obj1) //{x: 1, y: 2}
console.log(obj2) //{x: 2, y: 2}
對多維或一維更深的層次的對象只能進行淺拷貝
var obj1={
x:1,
y:{m:1}
};
var obj2=Object.assign({},obj1);
obj2.y.m=2;
console.log(obj1) //{x: 1, y: {m: 2}}
console.log(obj2) //{x: 2, y: {m: 2}}
JSON.parse(JSON.stringify(obj))
可實現(xiàn)多維對象的深拷貝痹栖,但會忽略undefined亿汞、任意的函數(shù)、symbol 值
var obj1 = {
x: 1,
y: {
m: 1
},
a:undefined,
b:function(a,b){
return a+b
},
c:Symbol("foo")
};
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ?, c: Symbol(foo)}
console.log(obj2) //{x: 1, y: {m: 1}}
obj2.y.m = 2; //修改obj2.y.m
console.log(obj1) //{x: 1, y: {m: 1}, a: undefined, b: ?, c: Symbol(foo)}
console.log(obj2) //{x: 2, y: {m: 2}}
進行JSON.stringify()序列化的過程中揪阿,undefined疗我、任意的函數(shù)以及 symbol 值,在序列化過程中會被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時)或者被轉換成 null(出現(xiàn)在數(shù)組中時)南捂。