一文弄懂浅拷贝和深拷贝
目的:复制一个对象
浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。(修改拷贝对象中的应用类型属性值时,原对象也会随着变化)
深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。(修改拷贝对象中的应用类型属性值时,原对象不会随着变化)
JS实现
浅拷贝
function clone(origin,target){
var target = target || {
};
for(var key in origin){
target[key] = origin[key];//直接赋值每一项
}
return target;
}
深拷贝(递归实现)
function deepClone(origin,target){
var target = target || {
},
toStr = Object.prototype.toString,
//Object.prototype.toString.call(origin[key]):判断对象类型
arrType = '[object Array]';//数组类型
//遍历每一个属性
for(var key in origin){
//判断是否是prototype上的属性
if(origin.hasOwnProperty(key)){
//不是原型上的
if(typeof(origin[key]) === 'object' && origin[key] !== null){
//是引用类型
if(toStr.call(origin[key]) === arrType){
//是数组
target[key] = [];
}else{
//是对象
target[key] = {
};
}
//递归拷贝
deepClone(origin[key],target[key]);
}else{
//对应key赋值
target[key] = origin[key];
}
}
}
return target;
}