浅拷贝
浅拷贝引用值是要相互影响的,因为它是栈内存之间的赋值,赋值的是地址,一个更改,其他的都要更改。
var obj = {
name :'abc',
age : 123,
sex : 'female',
card : ['visa','master']//存在一个引用值
}
var obj1 = {}
function clone(origin,target) {
var target = target || {};//防止没有提前新建一个空对象
for(var prop in origin){
target[prop] = origin[prop];
}
}
clone(obj,obj1);
深拷贝
深拷贝就是无论是原始值还是引用值,修改后彼此相互不影响。
遍历对象 for(var prop in obj)(for in也可以遍历数组(数组也是特殊类型的对象))
1,判断是不是原始值 typeof() object--->引用值
2,判断是数组还是对象 constructor,instanceof,toString
3,建立相应的数组或者对象
4,递归
var obj = {
name : "abc",
age : 123,
card : ['visa','master'],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
// name : obj.name,
// age : obj.age,
// card : [obj.card[0],obj.card[1]],
// wife : {
// name : "bcd",
// son : {
// }
// }
}
function deepClone(origin, target){
var target = target || {},
toStr = Object.prototype.toString,
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] = {};
// }
//上面的ifelse条件判断可以用下面的三目运算符代替:
target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}
deepClone(obj,obj1);