浅拷贝:
function clone(origin,target){
var target=target || {} //如果没有传target的话就自动传一个空对象进去
for(var key in origin){
target[key]=origin[key]
}
return target;
}
浅拷贝有个缺点,就是如果origin或者target的引用值(array、object)类型的值改变的话,一定会影响到另一个的值也跟着改变,然而深拷贝可以解决这个问题。
深拷贝:
//1.遍历对象 for(var key in obj)
//2.判断是不是原始值(null,string,undefined,boolean,number) typeof 'object',因为用typeof操作数组和null和对象都返回对象‘object’,这里先不考虑null,因为没意义
//3.不是原始值的话判断是数组还是对象 toString,instanceof,construct
//4.建立相应的数组或对象
//5.递归
function deepClone(origin,target){
var target=target || {} //如果没有传target的话就自动传一个空对象进去
for(var key in origin){
if(origin.hasOwnProperty(key)) { //判断是不是私有属性,不要原型链上的
if(typeof(origin[key])=='object'){ //如果是返回对象类型
if(origin[key]!=='null'&&Object.prototype.toString.call(origin[key])=='[object Array]'){ //如果是数组类型
target[key]=[]; //建立相应的数组
}else{ //否则是对象类型
target[key]={}; //建立相应的对象
}
deepClone(origin[key],target[key]) //递归
}else{ //如果是返回原始值类型
target[key]=origin[key]
}
}
}
return target;
}