因为原始类型的拷贝是传值,所以对于原始数据类型并没有深浅拷贝的区别。深拷贝是针对引用数据类型对象,数组和函数数的全拷贝,并且不会影响的原有数据单独存在。
深拷贝的使用场景:1、都是复杂对象,即对象的属性还是对象
如果要赋值对象的所有属性都不是引用类型的时候,可以使用浅拷贝,遍历并复制。
实现深拷贝的方法一:递归
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]
实现深拷贝的方法二:JSON对象的parse和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]
实现深拷贝的方法三:JQ的extend方法
$.extend( [deep ], target, object1 [, objectN ] )
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);//a:[0,1,[1,3],4],b:[0,1,[2,3],4]
理解借鉴地址:https://www.cnblogs.com/echolun/p/7889848.html