上一节,我们了解了下深拷贝和浅拷贝的概念,只了解于此还不够,如果想要你面试加分,亲手写一个深拷贝的代码还是非常必要的,接下来就让我们看下如何去写。
在这里只做下粗略的封装,如果还有具体的细节没考虑到,可以添加奥!
现在就让我们来分析下:数据类型分为基本数据类型和引用数据类型:
- 基本数据类型我们在拷贝的时候直接返回那个值即可
- 引用数据类型,分为object 和function 不过我们拷贝的时候,肯定不会考虑函数,所以这种情况忽略,接下来我们就考虑下对象
对象:
- 普通的对象
- 数组
- 正则
- Date 日期
- ...
对于正则和日期,虽然也是对象数据类型,但是我们不需要去遍历,所以需要单独处理下,直接返回实例即可。如果是普通对象的和数组的话,我们就需要遍历下。这里需要考虑下拿到的值是否还是对象,所以此处我们用递归去做。
在此还需要注意的是,在判断是不是对象的时候,我们需要去考虑下null typeof null 的结果也是“object”。
var obj={
name:"li",
hobby:{
reads:"book"
}
}
function deepClone(obj){
if(obj===null){
return null;
}
/* 基本数据类型的值(不考虑function) */
if(typeof obj!="object") {
return obj;
}
if(obj instanceof RegExp){
return new RegExp(obj);
}
if(obj instanceof Date){
return new Date(obj);
}
let target= new obj.constructor();
for(var key in obj){
if(obj.hasOwnProperty(key)){
target[key]=deepClone(obj[key]);
}
}
return target;
};
var res=deepClone(obj);
res.hobby.reads="hehe";
console.log(res,obj);
认真仔细的看看,是不是也没那么难,一起加油吧,小伙伴,在成长的道路上,有你我相伴奥!