深拷贝基本实现
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)
标签:return,deepClone,originValue,obj,newObject,const,手写,拷贝 From: https://www.cnblogs.com/KooTeam/p/17764861.html