这是一道较为经典的面试题了,算是一道考研基本功的算法题,希望你在看本文章之前已经对于递归这一思想有了了解。
先上代码
function deepCopy(item) {
let obj = null;
if (Array.isArray(item)) {
obj = [];
} else if (typeof item == "object") {
obj = {};
} else {
return item;
}
for (let key in item) {
obj[key] = deepCopy(item[key]);
}
return obj;
}
为什么要深拷贝?
先看看直接赋值遇到的问题:
这是因为引用类型的数据赋值给变量的其实是它在内存中的地址值,而你直接obj2 = obj1,就是把obj1这个对象的地址值给了obj2,所以obj2其实就是obj1。你改了obj2里的属性,就等于改了obj1里的。
解析
假设现在我们要把下面的 obj1 拷贝给一个变量 obj2
let obj1 = {
name:'mikaisa',
location:{
city:'苏州'
}
}
那么要实现深拷贝,那就要把目标对象里的每一个属性以及对应的值拿到,再添加到obj2身上,其中如果obj1身上有嵌套的对象比如obj1.location,那就要对这个location再次遍历,拿到里面的每一个属性以及对应的值,同样再赋值给obj2.location,最终的代码如下:
function deepCopy(item) {
//首先初始化一个obj用来返回,因为我们的深拷贝函数就是返回拷贝好的对象
let obj = null;
//如果传进来的是对象那就obj赋值为{},为数组就赋值为[],为基本类型直接把它return即可
if (Array.isArray(item)) {
obj = [];
} else if (typeof item == "object") {
obj = {};
} else {
return item;
}
/*
使用for in循环,递归调用deepCopy()
item[key]若为基本数据类型,则会直接被递归时的deepCopy()给return回来。
item[key]若为引用数据类型,则会再次进入for in循环递归调用deepCopy()
*/
for (let key in item) {
obj[key] = deepCopy(item[key]);
}
return obj;
}
来看看效果吧:
好了,以上就是本文的全部内容了,觉得不错的还请点赞收藏加关注呀!我是努力冲击大厂的小韩。
个人其他平台账号
知乎: Mikaisa,Mikaisa - 知乎
gitee码云: @mikaisazzz,MikaisaZzz-Gitee.com
CSDN: Mikaisa, Mikaisa_CSDN博客