深度克隆
浅拷贝和深度克隆:
举例子来说明:
浅拷贝:
var a=1;
var b=a;
a=2;
console.log(b)//此处输出1
这就是浅拷贝,对于基本数据类型,就是赋值操作,只存在浅拷贝,而对于引用数据类型来说浅拷贝往往不能满足我们的需求:
例如:
var obj={name:'jack',age:18}
var obj2=obj1
obj.name='rose'
console.log(obj2.name)//此处输出的是'rose'
这就是引用数据类型的浅拷贝,拷贝的对象与被拷贝的对象是相互牵制的,修改其中一个的属性另一个也会改变,因为他克隆的是引用地址值
所以,我们就需要深度克隆来实现让两个对象相互独立,不收影响
方法:
const obj={name:'jack'}
let obj2={}
Object.assign(obj2,obj1)
这是es6提出的一个方法,也只是实现一层的克隆,当属性的值还是对象或者数组的时候就无法实现了
所以我们需要自己封装一个深度克隆的方法:
function checkType(obj){
return Object.prototype.toString.call(obj).slice(8,-1)
}//检查数据类型的函数
function deepClone(obj){
let newObj=null;
let type=checkType(obj)
if(type==='Object'){
newObj={}
}else if(type==='Array'){
newObj=[]
}else{
return
}
for(let key in obj){
const value=obj[key]
if(checkType(value)==='object' || 'Array'){
newObj[key]= deepClone(value);
}else{
newObj[key]=value;
}
}
return newObj
}
常用的拷贝技术还有:
arr.concat(): 数组浅拷贝
arr.slice(): 数组浅拷贝
JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据