浅拷贝:就是当被拷贝的对象的某个属性值为引用类型时,拷贝的对象会将被拷贝的对象的这个属性的引用的地址拷贝过来,这样当引用值里面的值变化时,无论是拷贝还是被拷贝的对象,其属性都会发生变化.
深拷贝:就是拷贝的对象将被拷贝的对象的引用的地址里面的值真正的拷贝过来,无论其中谁发生改变另外一个的值都不会发生改变.
也就是说,深浅拷贝的区别在于其属性值不为基本类型时,拷贝的地址的引用问题,浅拷贝时地址引用指向同一处,深拷贝时地址引用不是指向同一处.
function clone(target , origin){
var target = target || {};
for( var prop in origin){
target[prop] = origin[prop];
}
return target;
}
1.判断是不是原始值 typeof() object 当然null要做特殊处理
2.判断是数组还是对象,那如果是函数呢? instanceof toString constructor
3.建立相应的数组或对象
4.递归
function deepClone(target , origin){
var target = target || {},
toStr = Obejct.prototype.toString,
arrStr = "Object Array";
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
if(typeof(origin[prop]) == "Object" && origin[prop] !== null){
target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
deepClone(target[prop] , origin[prop]); //递归判断其属性是否为引用类型
}else{
target[prop] = origin[prop];
}
}
}
return target;
}