1 定义
深拷贝:拷贝一个对象时,不仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样得到的深拷贝后的拷贝对象和源对象相互独立。
浅拷贝:拷贝一个对象时,仅拷贝对象的引用,拷贝对象和源对象还是引用通一份实体。两者的改变相互影响。
2 js深拷贝
Object.assign()
只能实现对一维对象的深拷贝
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))
可实现多维对象的深拷贝,但会忽略undefined、任意的函数、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、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。