由于引用数据类型的数据是存储在堆空间中,在栈空间中存储的是是数据的引用地址。对象的浅拷贝就是将栈空间中的地址复制一份,两个地址指向的同一个数据浅拷贝可以使用Object.assign()来实现 深拷贝可以使用JSON.stringify()先转换为json的串复制,然后再通过JSON.parse()转换回来
深拷贝实践
数组中包含对象
var obj1 = {
uname: "张三",
age: 21,
school: { name: "教育", address: "北京" },
hobby: ["学习", "跑步", "吃饭"]
}
var obj2 = {}
for (var k in obj1) {
if (obj1[k] instanceof Object) {
//复杂数据类型
obj2[k] = {} //先开辟一块新空间
for (var m in obj1[k]) { //把旧数据copy到新空间
obj2[k][m] = obj1[k][m]
}
} else {
//简单数据类型
obj2[k] = obj1[k]
}
}
// console.log(obj2)
obj2.school.name = "清华大学"
console.log("obj2", obj2)
console.log("obj1", obj1)
数据中包含对象和数组
var obj1 = {
uname: "张三",
age: 21,
school: { name: "教育", address: "海淀", subSchool: { name: "分校", address: "顺义" } },
hobby: ["学习", "跑步", "吃饭"]
}
var obj2 = {}
for (k in obj1) {
if (obj1[k] instanceof Array) {
//数组
//1.创建新数组
obj2[k] = []
//2.拷贝数组里面的内容
for (var m in obj1[k]) {
obj2[k][m] = obj1[k][m]
}
} else if (obj1[k] instanceof Object) {
//对象
//1.创建一个新对象
obj2[k] = {}
//2.拷贝对象里面的内容
for (var n in obj1[k]) {
obj2[k][n] = obj1[k][n]
}
} else {
//简单数据类型
obj2[k] = obj1[k]
}
}
利用递归实现深拷贝
var obj1 = {
uname: "张三",
age: 21,
school: {
name: "教育",
address: "海淀",
subSchool: { name: "分校", address: "顺义" }
},
hobby: ["学习", "跑步", "吃饭"]
}
var obj2 = {}
deepCopy(obj2, obj1)
//定义
function deepCopy(obj2, obj1) {
for (k in obj1) {
if (obj1[k] instanceof Array) {
obj2[k] = []
deepCopy(obj2[k], obj1[k])
} else if (obj1[k] instanceof Object) {
obj2[k] = {}
deepCopy(obj2[k], obj1[k])
} else {
//简单数据类型
obj2[k] = obj1[k]
}
}
}