- 浅拷贝: 简单的赋值拷贝操作,产生重复释放问题
- 深拷贝: 在堆区重新申请空间,进行拷贝操作,防止重复释放问题
<script>
const people = {
name: '一只不太聪明的燕子',
age: 18,
address: {
city: 'Nanjing'
},
hobby: ["吃饭", "睡觉", "写bug", { play: ["排球", "羽毛球"] }]
}
/**
* 深拷贝
* @param {Object} obj 要拷贝的对象
*/
function deepClone(obj) {
if (typeof obj !== 'object' || obj === undefined) {
// 如果obj不是object类型或者为undefined,不做处理直接返回
return obj;
}
let result; // 声明一个返回结果
if (obj instanceof Array) { // 判断obj是数组还是对象
result = [];
} else {
result = {};
}
for (let key in obj) {
// 确保key 不是原型上的属性
if (obj.hasOwnProperty(key)) {
// 递归调用,一直往下挖,最终完成深拷贝
result[key] = deepClone(obj[key]);
}
}
return result; // 返回一份完全独立的拷贝
}
let people1 = deepClone(people);
people1.name = "李荣浩";
// 这里体现出深拷贝的意义
people1.hobby[2] = "写歌";
people1.hobby[3].play[0] = "唱歌";
console.log(people1);
console.log(people);
</script>
打印结果:
当然,实现深拷贝的方式有很多,想了解的话可以自行查阅资料,这里只是其中一种,如有错误欢迎指出!