首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

手写实现深度拷贝

那么,对一个对象进行拷贝,无非就是对对象的属性进行拷贝,按照拷贝处理的方式不同,可分为浅拷贝和深拷贝: 浅拷贝是只拷贝对象的第一层属性 深拷贝则是无限层次的拷贝对象的属性,只要属性值不是基本类型,就继续深度遍历进去...如果项目中有需要使用到深拷贝,那么就只能是自行实现,或者使用三方库。 实现拷贝 有人可能会觉得自己实现个深拷贝很简单,毕竟都已经知道浅拷贝拷贝一层,那深拷贝不就等效于浅拷贝 + 递归?...对象的属性结构,其实就是一颗树结构,递归方案的深拷贝,其实也就是以深度优先来遍历对象的属性树。 但遍历树结构数据,除了使用递归方案外,也可以使用循环来遍历,但是需要借助相应的数据结构。...这种场景上面的深拷贝方案就不适用了,这里参考 Object.assign 原理扩展实现 assignDeep,实现可将指定的原对象们,拷贝到已存在的目标对象上: // 递归版 function assignDeep...,可以去我另一篇文章查阅:扩展 Object.assign 实现拷贝

1K30
您找到你想要的搜索结果了吗?
是的
没有找到

JS 原生方法原理探究(九):如何手写实现拷贝和深拷贝

本文会介绍如何手写实现拷贝和深拷贝实现拷贝 什么是浅拷贝? 对原对象进行浅拷贝,会生成一个和它“一样”的新对象。...如何实现拷贝? JS 中常见的浅拷贝方法有 Object.assign()、... 展开运算符以及数组的 slice 方法。但是如果我们要自己实现一个浅拷贝,应该怎么做呢?...获取自身所有属性(无论是否可以枚举),第二种是使用 for……in + hasOwnProperty() 获取自身所有可枚举属性,第三种是使用 Object.keys() 一次性获取自身所有可枚举属性 实现拷贝...如何实现拷贝? 常见的实现拷贝的方式是 JSON.parse(JSON.stringify())。它可以应付一般的深拷贝场景,但是也存在着不少问题,这些问题基本都是出现在序列化的环节。...此外,我们也可以考虑使用 Lodash 提供的深拷贝方法。不过,如果要自己实现拷贝,应该怎么做呢?我们一步一步来看。

1.1K31

【面试题解】JavaScript的深浅拷贝,如何手写拷贝

---- 本系列面试题旨在学会相关知识点,从而轻松应对面试题的各种形式,本文讲解了 JavaScript 中拷贝的相关知识,以及如何手写深浅拷贝。...所以根据深拷贝和浅拷贝的功能,就可以满足上述两种要求。 值类型的拷贝 值类型其实没有深浅拷贝之分,亦可以说值类型都是深拷贝。...除了上面这一种,浅拷贝实现方式还有 Object.assign() , 展开运算符... , array.slice() array.concat()。...所以我们可以得出一个结论,只要对一个对象无限递归进行浅拷贝,最终的结果就是一个深拷贝。 递归浅拷贝 代码如下,要考虑到种种特殊情况。...JSON.parse(JSON.stringify()) 除了上面递归浅拷贝的方式来实现拷贝之外,还可以使用 JSON.parse(JSON.stringify()) 来达到相同的结果。

37520

实现拷贝与深拷贝

实现拷贝与深拷贝 Js包含基本数据类型与引用数据类型两种不同的数据类型的值,深拷贝与浅拷贝的概念只存在于引用数据类型。...对于引用类型,浅拷贝拷贝了指向这个对象堆内存的指针,是拷贝了对原对象引用,深拷贝拷贝了该对象的所有属性到一个新的对象,若是原对象的某属性依然引用了其他对象,那么需要将原对象引用的其他对象一并进行深拷贝...原生方法实现 原生方法实现拷贝,可以使用{...obj}与Object.assign({}, obj)等方式,{...obj}主要是使用了Spread操作符将对象表达式展开构造字面量对象的方式实现拷贝...原生方法实现拷贝,主要是使用JSON.parse()与JSON.stringify(),首先将对象序列化为JSON字符串,再将JSON字符串反序列化为对象,使用这种方式效率比较高,但是会有一些问题,对于循环引用的对象无法实现拷贝...aa: 1}} {a: {aa: 1}} origin.a.aa = 11; console.log(target, origin); // {a: {aa: 1}} {a: {aa: 11}} 递归实现

61420

拷贝、浅拷贝实现

结果: 一次构造 两次析构 编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。...所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。...test.cpp 结果: 构造一次 拷贝构造一次 析构两次 综上所述,浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝拷贝后的指针是指向不同内的指针...深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝拷贝一层,而深拷贝是层层拷贝。 深拷贝拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。...使 用 for in 、 Object.assign 、 扩 展 运 算 符 … Array.prototype.slice()、 Array.prototype.concat() 、递归等递归函数实现拷贝

74530

js数组深度拷贝 的四种实现方法

------------------------------------------------------------ var ary1=[1,2]; es5: //方法一:适用 单层 数组嵌套的深拷贝...var ary2 = ary1.concat(); //方法二:适用 多层 数组嵌套的深拷贝 var ary2 = JSON.parse(JSON.stringify(ary1));   //此方法适用于...Oject的深度拷贝,因为Array属于Oject类型,所以也适用于此处;   //需要注意的是:作为Oject的深度拷贝时,要复制的function会直接消失,所以这个方法只能用在单纯只有数据的对象。...es6: // 方法三:适用 单层 数组嵌套的深拷贝 var ary2 = [...ary1]; // 方法四:适用 单层 数组嵌套的深拷贝 var [...ary2] = ary1; //方法五:通过递归实现...多层 的深拷贝 function deepCopy(source){ if (typeof source !

56120

高频js手写题之实现数组扁平化、深拷贝、总线模式

看懂一道算法题很快,但我们必须将这道题的思路理清、手写出来。...三道js手写题的思路和代码实现数组扁平化演示效果将[1, 1, 2, [1, 2]] 变成 1, 1, 2, 1, 2第一种: 直接使用.flatconsole.log([1, [1,2],[1,[2]...'; result = JSON.parse(result); // JSON.parse()可以把JSON规则的字符串转换为JSONObject return result;}深浅拷贝拷贝实现明白浅拷贝的局限性...,参考 前端手写面试题详细解答深拷贝的思路:对于日期和正则的类型时, 进行处理 new一个新的对a: { val: a } 这种循环引用时, 使用以weakMap进行巧妙处理使用Reflect.ownKeys...cloneObj.arr.push(4)console.log('obj', obj)console.log('cloneObj', cloneObj)console.log(cloneObj.func)图片 实现了对象的循环应用的拷贝对于上述代码进行说明

34940

拷贝详解_深拷贝和浅拷贝如何实现

可参考:《用户态和内核态的区别》 2、零拷贝、浅拷贝、深拷贝 (1)零拷贝拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。...这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。   ...零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。...fr=aladdin 二、优化发展史 可参考:《原来 8 张图,就可以搞懂「零拷贝」了》 三、如何实现拷贝 1、mmap   mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据...内核态 -> 用户态)和 4 次拷贝(磁盘文件 DMA 拷贝到内核缓冲区,内核缓冲区 CPU 拷贝到用户缓冲区,用户缓冲区 CPU 拷贝到 Socket 缓冲区,Socket 缓冲区 DMA 拷贝到协议引擎

1.1K20

列表复制 之 直接赋值 浅拷贝深度拷贝的分析

列表复制 之 直接赋值 浅拷贝深度拷贝的分析 1.三者简述 a....直接赋值: 用等号 = ,其实就是对象的引用 b.浅拷贝: 用copy( ),拷贝父对象,但是不会拷贝内部子对象 c.深度拷贝: 用deepcopy,是采用的模块copy中的deepcopy方法,完全拷贝父对象和子对象...2.程序举例 现创建一个列表a,列表里的子对象也是列表,并进行赋值,浅拷贝,和 深度拷贝操作: ?...如图所示, b是赋值所得, c是浅拷贝所得, d是深度拷贝所得,注意在使用深度拷贝之前,先要调用copy模块: import copy 此时可以看到四者的值一样 2.1直接赋值和拷贝(浅或深)之间的区别...所以浅拷贝不能说是创建了一个完全独立的新的列表,而深度拷贝,可以看出,真的就是生成了一个完全不相关的新的列表d!不管a怎么变,d列表我自岿然不动

59010

如何实现拷贝

拷贝经常在各个框架使用,比如kafka,rocketmq,都起到了很好的作用,首先我们要知道零拷贝不是没有一次拷贝,是尽可能的减少拷贝。...我们先看看传统的数据拷贝 应用程序调用read函数,向操作系统发送IO操作进行上下文切换,用户态到内核态的切换 DMA控制器把数据从磁盘拷贝到内核缓冲区 cpu从内核缓冲区拷贝到用户缓冲区,进行上下文切换内核态到用户态...,他简单来说就是帮助cpu干活的小弟,实际上他是一块对的芯片,可以允许外部设备和内存寄存器直接进行io数据传输,其过程不需要cpu参加,使用DMA技术是为了让cpu空闲起来,做其他事情,提高效率 实现拷贝有三种方式...cpu从内核缓冲区拷贝到socket缓冲区 DMA在异步从socket缓冲区拷贝到网卡 sendfile函数返回,上下文切换 上面进行了3次数据拷贝,2次上下文切换 带有DMA拷贝功能的sendfile...2次上下文切换,全程没有cpu拷贝数据,真正实现了零拷贝,都是由DMA进行数据拷贝

55430
领券