手写深拷贝

发布时间 2023-10-14 22:24:18作者: KooTeam

深拷贝基本实现

 1 深拷贝基本实现
 2 function isObject(value){
 3     const valueType=typeof value
 4     return (value!==null)&&(valueType==='object'||valueType==='function')
 5 }
 6 function deepClone(originValue){
 7     //判断传入的originValue是否是一个对象类型
 8     if(!isObject(originValue)){
 9         return originValue
10     }
11     const newObject={}
12     for(const key in originValue){
13         newObject[key]=deepClone(originValue[key])
14     }
15     return newObject
16 }
17 
18 const obj={
19     name:'koo',
20     friend:{
21         name:'john'
22     }
23 }
24 
25 const newObj=deepClone(obj)
26 console.log(obj.friend===newObj.friend)

深拷贝比较完整版本

 1 function isObject(value){
 2     const valueType=typeof value
 3     return (value!==null)&&(valueType==='object'||valueType==='function')
 4 }
 5 const map=new Map()
 6 function deepClone(originValue,map=new WeakMap()){
 7     //判断是否是一个Set类型
 8     if(originValue instanceof Set){
 9         return new Set([...originValue])
10     }
11     //判断是否是一个Map类型
12     if(originValue instanceof Map){
13         return new Map([...originValue])
14     }
15     //判断如果是Symbol的value,那么创建一个新的Symbol
16     if(typeof originValue ==='symbol'){
17         return Symbol(originValue.description)
18     }
19     //判断如果是函数类型。那么直接使用同一个函数
20     if(typeof originValue ==='function'){
21         return originValue
22     }
23     //判断传入的originValue是否是一个对象类型
24     if(!isObject(originValue)){
25         return originValue
26     }
27     ////解结循环引用
28     if(map.has(originValue)){
29         return map.get(originValue)
30     }
31 
32     //判断传入的对象是数组,还是对象
33     const newObject=Array.isArray(originValue)?[]:{}
34     ////解结循环引用
35     map.set(originValue,newObject)
36 
37     for(const key in originValue){
38         newObject[key]=deepClone(originValue[key],map)
39     }
40     //对Symbol的key进行特殊的处理
41     const symbolKeys=Object.getOwnPropertySymbols(originValue)
42     for(const sKey of symbolKeys){
43         // const newSKey=Symbol(sKey.description)
44         // newObject[newSKey]=deepClone(originValue[sKey])
45         newObject[sKey]=deepClone(originValue[sKey],map)
46     }
47 
48     return newObject
49 }
50 
51 const s1=Symbol('aaa')
52 const s2=Symbol('bbb')
53 const obj={
54     name:'koo',
55     friend:{
56         name:'john'
57     },
58     arr:['abc','bac'],
59     foo:function(){},
60     [s1]:'aaa',
61     s2:s2,
62     set:new Set(['aaa','bbb','ccc']),
63     map:new Map([['aaa','abc'],['bbb','cba']])
64 }
65 //解结循环引用
66 obj.info=obj
67 
68 const newObj=deepClone(obj)
69 console.log(newObj)
70 console.log(obj.friend===newObj.friend)