浅拷贝不会把对象中的子对象(引用值)进行copy修改,只是操作最外层的属性
Object.prototype.num = 1;
var person1 = {
name: '李四',
sex: '男',
height:100,
age:15,
children:{
first:{
name: '张晓一',
age: 12
},
second:{
name: '张小二',
age: 9
},
third:{
name: '张小三',
age: 5
}
},
car:["奔驰","宝马"]
};
// 浅拷贝
function clone(origin,target){
var tar = target || {}; //判断是否为空 为空传个空对象
for(var key in origin){
//循环person1的时候把原型中的num也进行循环
//origin.hasOwnProperty(key)判断是否含有原型链中的值
if(origin.hasOwnProperty(key)){
tar[key] = origin[key]
}
}
return tar;
}
var person2 = clone(person1);
person2.name = "网二";
person2.children.first.name = "张小宝"
console.log("person1",person1)
console.log("person2",person2)
打印结果
深拷贝
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrType = '[object Array]';
for(var key in origin){
if(origin.hasOwnProperty(key)){
if(typeof(origin[key]) === 'object' && origin[key] !== null){
if(toStr.call(origin[key]) === arrType){
target[key] = []
}else{
target[key] = {}
}
deepClone(origin[key],target[key]);
}else{
target[key] = origin[key]
}
}
}
return target;
}
var person2 = deepClone(person1);
person2.name = "网二";
person2.children.first = {
name:"玩玩玩"
};
person2.car.push("大众")
console.log("person1",person1)
console.log("person2",person2)
不同点:浅拷贝只能拷贝外层的属性,内层的引用值只能同步拷贝,引用占用空间是一样的,不能对其进行单独的改变值。
深拷贝通过判断引用值得类型,使占用空间不同。