淺層克赂匕帷:當(dāng)克隆引用值時(shí),兩個(gè)對象會共用一個(gè)引用地址毕贼,造成相互的干擾温赔,即我改,它也改鬼癣。
var obj = {
name : 'abc',
age : 18,
sex : 'male'
}
var obj1 = {}
function clone(origin,target){//原始值陶贼,目標(biāo)值
var target = target || {};//防止用戶不傳target ,我自己建立一個(gè)空對象
for( var prop in origin){
target[prop] = origin[prop];
}
return target;//然后返回這個(gè)對象
}
clone(obj,obj1);
深層克隆
深層克麓骸:克隆出來的對象和原來的對象是相互獨(dú)立的拜秧,互不影響。也就是對新對象的修改都不會反映到原對象中章郁。
1.首先來講解一下深度克隆的思路:
2.遍歷(for var prop in origin)
3.判斷是原始值還是引用值枉氮,判斷方法用typeof()
4.如果是引用值志衍,則繼續(xù)判斷是數(shù)組還是對象,判斷方法instanceof聊替、toString楼肪、constructor
5.建立相應(yīng)的數(shù)組或?qū)ο?br>
6.遞歸
var obj = {
name: 'abc',
age: 20,
card: ['visa','master'],
wife:{
name: 'bcd',
son:{
name: 'aaa'
}
}
};
var obj1 = {};
function deepClone(origin,target){
var target = target || {};
var toStr = Object.prototype.toString;
var arrStr = '[object Array]';
for(var prop in origin){
//判斷該屬性是自身的還是原型鏈上的
if (origin.hasOwnProperty(prop)){
//判斷出是引用值并且該值不為null
if (typeof (origin[prop]) == 'object' && origin[prop] !== 'null'){
//判斷該引用值是數(shù)組類型的,則創(chuàng)建一個(gè)新的空的數(shù)組
if (toStr.call(origin[prop]) == arrStr){
target[prop] = [];
}else{
target[prop] = {};
}
deepClone(origin[prop], target[prop]); //遞歸
}
else{
//因?yàn)槭窃贾等乔模灾苯淤x值就可以
target[prop] = origin[prop];
}
}
}
return target;
}
var targetObj = deepClone(obj,obj1);
console.log(obj,obj1);
targetObj['card'][0] = 'zhangsan';
console.log(obj,obj1);