js-克隆
淺克隆
- 淺克隆的對象的引用值是拷貝對象里的引用,這兩個對象里面的引用(如對象里的數組或者內嵌對象)指向的地方是一致的。
var obj = {
name:"chen",
age:18,
gender:"female",
card:['visa','cb'],
wife:{
name:'abc',
son:{
name:'hehe'
}
}
};
var obj1 = {
};
function clone(origin,target){
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
target[prop] = origin[prop];
}
}
return target;
}
clone(obj,obj1);
obj1.name = 'ge';
console.log(obj1.name);//ge
console.log(obj.name);//chen
obj1.card.push("abc");
console.log(obj.card);//['visa','cb','abc'];因為淺克隆的對象的引用值是拷貝對象里的引用,這兩個對象的card指向的地方是一致的。
深克隆
這兩個對象里的引用的獨立拷貝的,不指向同一個地方。
深克隆
- 思路方法:
- 遍歷對象
- 判斷是不是原始值 typeof() object, instanceof, toString(推薦), constructor
- 判斷是數組還是對象
- 建立相應的數組或對象
- 遞歸
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)){
if(origin[prop] !== null && typeof(origin[prop]) == 'object'){
// if(toStr.call(origin[prop]) == arrStr){
// target[prop] = [];
// }else{
// target[prop] = {};
// }
target[prop] = (toStr.call(origin[prop])==arrStr) ? [] : {};
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}
deepClone(obj,obj1);
obj1.card.push("abc");
console.log(obj.card);//['visa','cb'];這兩個對象里的引用的獨立拷貝的,不指向同一個地方。