简单来说
对象的浅拷贝就是一个改变的时候另一个也改变 ,它只拷贝一层对象的属性
对象的深拷贝就是一个改变的时候另一个不改变,两个对象对应两个不同的地址
先写写浅拷贝:
var obj1={"name":"gao"};
var obj2 = obj1;
obj1.name ="wang";
console.log("obj1",obj1);
console.log("obj2",obj2);
可以看到obj1和obj2是一样的 同时更改obj1的时候obj2也是会跟着改变的,因为它们只拷贝了对象的属性
再写写深拷贝:
深拷贝的写法有很多,最基础的就是下面这种
var obj3 ={"age":18};
var obj4={};
obj4.age = obj3.age;
obj3.age=99999;
console.log("obj3",obj3)
console.log("obj4",obj4);
这时候就可以看到,在更改obj3的时候,obj4并没有变化,这就是最简单的深拷贝。
当然深拷贝还有其他的写法,比如——递归的方法
var obj={
"name":"gao",
"age":18,
"list":{
"title":"新闻"
}
}
obj.__proto__.say=function(){};
// 深拷贝函数 -- 创建 新对象 循环赋值
// 如果属性值 是对象 创建 新对象 循环赋值
function deepCopy(obj){
var copyObj={};
for(var key in obj){
if(obj.hasOwnProperty(key) == true ){
if(obj[key] instanceof Object ){
copyObj[key]= deepCopy(obj[key])
}else{
copyObj[key]=obj[key]
}
}
}
return copyObj;
}
var o2= deepCopy(obj)
obj.list.title="娱乐"
console.log(obj);
console.log(o2);
还有转字符串的方法
var obj={
"name":"gao",
"age":18,
"list":{
"title":{
"a":"b"
}
},
"run":function(){
}
}
obj.__proto__.say=function(){};
// JSON.stringify 没有原型链
var obj2 = JSON.parse( JSON.stringify(obj) );
obj.name ="wang";
obj.age ="wang";
obj.list.title.a ="ssss";
console.log(obj);
console.log(obj2);