我的理解是
对象的浅拷贝是一个改变时另一个也会改变,它只拷贝一层对象的属性
对象的深拷贝是一个改变时另一个不会改变,因为两个对象对应的地址不一样
下面记录一下深拷贝有哪些常用的方法
方法一:常用 递归拷贝
var obj={
"name":"gao",
"age":18,
"list":{
"title":"新闻"
}
}
function deepCopy(obj){
// 如果obj不是对象或数组,直接返回obj
if (typeof obj !== 'object' || obj === null) {
return obj;
}
// 创建一个新对象或数组
var copyObj = Array.isArray(obj) ? [] : {};
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);
方法二:简单但有缺点,这种方式不能复制函数和 undefined
,以及日期和正则表达式对象。
let obj1 = { a: 1, b: 2, c: function() {} };
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.a = 3;
console.log(obj1); // { a: 1, b: 2, c: [Function: c] }
console.log(obj2); // { a: 3, b: 2 }
还有一个就是Object.assign()
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
因为大部分时候我们对于后端返回的数据结构是不确定的,所以不适合用这个方法
第一级是深拷贝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 }
console.log(a) // { James: { age: 18 } }
以后各级是浅拷贝:
b.James.age = 20
console.log(b) // { James: { age: 20 } }
console.log(a) // { James: { age: 20 } }