首页 > 其他分享 >手写深拷贝

手写深拷贝

时间:2023-10-14 22:35:36浏览次数:23  
标签:return deepClone originValue obj newObject const 手写 拷贝

深拷贝基本实现

 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

相关文章

  • 手写节流、深拷贝函数实现
    防抖函数基本实现1functiondebounce(fn,delay){2lettimer=null3returnfunction(...args){4if(timer)clearTimeout(timer)5timer=setTimeout(()=>{6fn.apply(this,args)7},delay);8}9}防抖函数完正版......
  • BeanUtils.copyProperties这个方法是深拷贝浅拷贝,还是深复制浅复制?
    1、关于BeanUtils.copyProperties方法的拷贝类型,它是浅拷贝哦。这意味着在拷贝对象时,它只会复制对象的引用而不会复制对象的内容。所以,如果原始对象中的某个属性发生改变,拷贝后的对象中的相应属性也会随之改变。当然,如果你希望进行深拷贝或深复制,需要使用其他方法来实现哦`BeanUt......
  • Python - 深拷贝一个带有指向自身引用的列表,会报错么?紧接着用==比较,会报错么?
    问题描述深拷贝一个带有指向自身引用的列表:列表x中有指向自身的引用,因此x是一个无限嵌套的列表。importcopyx=[1]x.append(x)>>x[1,[...]]y=copy.deepcopy(x)>>y[1,[...]] 深拷贝不报错但是我们发现深度拷贝x到y后,程序并没有出现stackoverf......
  • 用 Java 徒手写一个抽奖系统,拿去用吧
    1、概述项目开发中经常会有抽奖这样的营销活动的需求,例如:积分大转盘、刮刮乐、老虎机等等多种形式,其实后台的实现方法是一样的,本文介绍一种常用的抽奖实现方法。整个抽奖过程包括以下几个方面:奖品奖品池抽奖算法奖品限制奖品发放2、奖品奖品包括奖品、奖品概率和限制、奖品记录。奖......
  • 浅谈深拷贝和浅拷贝
    深拷贝和浅拷贝深拷贝importcopylist1=[1,2,3,4,[5,6,7]]list2=copy.deepcopy(list1)print(list1)print(list2)[1,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[0]+=1print(list1)print(list2)[2,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[4]......
  • [完结16章]React18内核探秘:手写React高质量源码迈向高阶开发
    点击下载——[完结16章]React18内核探秘:手写React高质量源码迈向高阶开发  提取码:8epr手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是......
  • 关于C++拷贝控制
    通常来说,对于类内动态分配资源的类需要进行拷贝控制:要在拷贝构造函数、拷贝赋值运算符、析构函数中实现安全高效的操作来管理内存。但是资源管理并不是一个类需要定义自己的拷贝控制成员的唯一原因。C++Primer第5版中给出了一个Message类与Folder类的例子,分别表示电子邮件消息......
  • 手写PCA(主元分析法)计算点云法向量(详细注释) 【Matlab代码】
    原理PCA原理主元分析法PCA学习笔记点云法向量与点云平面拟合的关系(PCA)EstimatingSurfaceNormalsinaPointCloud3D【24】PCA点云法向量估计利用PCA计算点云的法线3D点云法向量估计(最小二乘拟合平面)为什么用PCA做点云法线估计?利用PCA求点云的法向量pca_demo.mclcclearclosea......
  • java本地文件多线程拷贝
    简单介绍:本地文件多线程拷贝是指通过多个线程同时进行文件复制操作。传统的文件复制操作往往是串行进行的,当需要复制单个大文件时,复制速度往往会比较慢。而采用多线程进行文件拷贝可以提高效率。通过同时创建多个线程,每个线程负责复制不同的文件或者不同的文件片段,可以充分利用计......
  • python拷贝文件
    在Python中拷贝文件可以使用shutil模块importshutil#源文件路径src_file='/path/to/source/file.txt'#目标文件路径dst_file='/path/to/destination/file.txt'#使用shutil模块的copy2函数进行拷贝shutil.copy2(src_file,dst_file) 在这个示例中,shutil.cop......