首页 > 其他分享 >写一个我心目中的完美深拷贝

写一个我心目中的完美深拷贝

时间:2023-03-09 13:55:05浏览次数:33  
标签:map const 心目 完美 res 拷贝 o1 target

要求:

1. 实现传入参数的深拷贝,并返回拷贝后的对象。

2. 要考虑到日期、正则等特殊类型,还有ES6的新数据类型。

3. 要考虑循环引用情况。

思路:

基础数据类型的深拷贝,只要考虑一下是对象还是数组,递归即可。完美深拷贝难点在循环引用和特殊类型。

循环引用可以用一个Map解决。

特殊类型,万变逃不开它的构造函数,只要用构造函数初始化一个新对象,保证原型都是一样一样的。

特殊类型也可能有自定义属性,记得创建完跟普通类型一起扔进循环里递归。

还有es6新数据类型symbol,不能被普通枚举,要用自己的特殊方法getOwnPropertySymbols()。

代码:

const deepCopy = (target, map=new Map()) => {
    // 基础类型直接返回
    if (typeof target !== 'object' || target === null) return target;
    // 查询循环引用
    if (map.has(target)) return map.get(target);
    // 创建待返回对象, 并保持原型一致
    const res = new target.constructor(target);
    // 存map
    map.set(target, res);
    // 遍历属性并拷贝
    const keys = Object.getOwnPropertyNames(target);
    const symbols = Object.getOwnPropertySymbols(target);
    [...keys, ...symbols].forEach(item => {
        res[item] = deepCopy(target[item]);
    })
    return res;
    
}
// 测试 const o1 = { name: 'o', o: { name: o1.name, }, d: new Date(), q: [1,2], a: '11', f: function() {}, r: /\d+/ } o1.d.aaa = 1; console.log(o1); const o2 = deepCopy(o1); console.log(o2);

 

标签:map,const,心目,完美,res,拷贝,o1,target
From: https://www.cnblogs.com/nanimono/p/17198103.html

相关文章

  • js 简单的深拷贝
    本题是通过@郝晨光 的文章受到的启发,学习来的,大家有兴趣可以看一下,而且我觉得这种写法非常通俗易懂,工作中也足够去使用了。functionDeepClone(target){letresult......
  • ###安全运营的定义与核心目标
    转载公众号《微言晓意》,仅用于个人学习1、安全运营当下越来越流行的背景:安全运营变得越来越重要的原因,或者说是越来越需要安全运营的背景,主要包括四个方面:1)安全项目实施......
  • 资源拷贝插件
     Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。我们的配置文件,一般都放在:src/m......
  • [常用函数]深拷贝
    判断类型见:https://www.cnblogs.com/zhoulixue/p/17187385.html//深拷贝exportconstdeepclone=(source:any)=>{if(getType(source)==='Object'){re......
  • 如何做一个完美的api接口?
    如何做一个api接口?:我们知道API其实就是应用程序编程接口,可以把它理解为是一种通道,用来和不同软件系统间进行通信,本质上它是预先定义的函数:-api,接口 1 我们......
  • ENSP AR40报错之完美都删了怎么还有RC=-104
    报错如下:卸载了完美之后,运行了一段时间的ENSP,然后发现virtualbox报错RC=-104 解决方法:1、所有的ENSP相关组件全部卸载,清理注册表,并同时进入local下删除ENSP文件夹的......
  • JS 深拷贝与浅拷贝
    js我们常用赋值的方式进行复制。对常数项来说赋值后的两个变量没有关系,但是变量是对象的话,值会相互影响,这里存在深拷贝与浅拷贝的问题。对象的赋值默认是浅拷贝,A=B,两个值......
  • 5.多种方式实现深拷贝、对比优缺点
    前情提要深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;①递归方式比较全面的深......
  • 零拷贝
    1.什么是零拷贝零拷贝是指计算机在执行IO操作的时候,CPU不需要将数据从一个存储区复制到另一个存储区,进而减少上下文切换以及CPU拷贝的时间,这是一种IO操作优化技......
  • 【CentOS】scp免密码远程拷贝
    https://www.likecs.com/show-307003828.html基于公钥和私钥的信任办法使用root用户,在192.168.0.30和192.168.0.31之间复制文件可以先删除旧文件rm/root/.ssh/......