文章编号:11561时间:2024-10-01人气:
浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值,而引用数据类型只拷贝了一层属性,再深层的还是无法进行拷贝。如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象
深拷贝则不同,对于复杂引用数据类型,将一个对象从内存中完整地拷贝出来一份给目标对象,并从堆内存中开辟一个全新的空间存放新对象,且新对象的修改并不会改变原对象,这两个对象是相互独立、不受影响的,彻底实现了内存上的分离
实现深拷贝,一般两种方式方式:
使用(());
手动实现
(())版本()是最简单的深拷贝方法,其实就是把一个对象序列化成为JSON的字符串,并将对象里面的内容转换成字符串,最后再用()的方法将JSON字符串生成一个新的对象
constobj={name:nordon,info:{age:18}};//一行代码实现深拷贝constcopyObj=((obj));虽然使用(())实现深拷贝非常简单、便捷,但是其却存在一些API层面的特点:
拷贝的对象的值中如果有函数、undefined、symbol这三种类型,经过序列化之后的字符串中这个键值对会消失
undefined、任意的函数以及symbol作为对象属性值时()跳过(忽略)对它们进行序列化
转换值如果有toJSON()函数,该函数返回什么值,序列化结果就是什么值,并且忽略其他属性的值
拷贝Date引用类型会变成字符串
无法拷贝不可枚举的属性
无法拷贝对象的原型链
拷贝RegExp引用类型会变成空对象
对象中含有NaN、Infinity以及-Infinity,JSON序列化的结果会变成null
无法拷贝包含循环引用的对象(对象之间相互引用,形成无限循环),会抛出错误
手动实现由于(())实现深拷贝存在一定的不足,在业务开发中建议慎重使用,因此我们需要自己手动实现一版深拷贝
手动实现过程中需要解决的问题,也就是补齐(())不足的一个过程,上述已经阐述其不足,接下来直接上代码:
细节在代码中已注释
//判断是不是引用类型constisComplexDataType=(obj)=>{return(typeofobj===object||typeofobj===function)&&obj!==null}constdeepClone=function(obj,hash=newWeakMap()){//日期对象直接返回一个新的日期对象if(===Date)returnnewDate(obj);//正则对象直接返回一个新的正则对象if(===RegExp)returnnewRegExp(obj);//如果循环引用了就用weakMap来解决if((obj))(obj);letallDesc=(obj);//遍历传入参数所有键的特性letcloneObj=((obj),allDesc);//继承原型链(obj,cloneObj);for((obj)){cloneObj[key]=isComplexDataType(obj[key])&&typeofobj[key]!==function?deepClone(obj[key],hash):obj[key];}returncloneObj;};在实际开发中有着丰富的应用场景,尽管你可能已经熟悉了它的基本用法,但其实它隐藏着更多实用特性。 这些特性往往在不经意间发挥作用,值得深入理解。 如果你觉得这个话题略显枯燥,让我们通过几个有趣的场景来探索。 例如,深拷贝时,的deepCopy功能(如`((obj/arr))`)在处理引用类型数据时至关重要,它能确保新生成的对象与原对象在内存上独立,互不影响。 在服务端数据存储中,也十分关键。 比如,存储的canvas模板数据和Vue-amap的SVG路径信息,这时就需要序列化存储。 另外,localStorage和sessionStorage存储的数据必须先转化为字符串,否则可能出现存储失效的问题。 当从服务端接口获取Canvas或SVG数据时,能帮助解析这些数据,并在和vue-amap等组件中正确渲染。 此外,还能过滤数据和格式化输出,包括设置缩进,使其更易于阅读。 不过,遇到自引用对象时,会抛出“cyclic object value”错误,这时需要特殊处理,比如使用库。 对于具有相同属性但顺序不同的对象,的结果可能出乎意料,这需要额外注意。 在实际操作中,可能会遇到诸如数据库存储后属性消失、axios请求参数undefined消失等问题,这可能是由于replacer函数的过滤、属性设置或数据类型的特殊性导致的。 与localStorage的配合使用时,确保数据为字符串是关键。 通过上述内容,你应该对有了更深入的认识。 在遇到问题时,记得检查replacer、对象属性和数据类型,找出问题的根源。 加入我们的技术讨论小组,一起交流学习,提升前端开发技能吧!
最近,用户在使用 xuejianxianzun/PixivBatchDownloader 下载器时遇到了一个挑战:大量文件抓取后,在导出结果时, 函数抛出了 Invalid string length 的错误。 问题源于数据处理过程中,当处理大量对象时,生成的字符串超过了JavaScript引擎的长度限制,通常为2的29次方,即约512MB。 为解决这个限制,一个解决方案是将数据分解。 原有的做法是将整个数据集转换为一个字符串,现在改为逐个对象处理,将每个对象转换为字符串并存储在数组中。 这样,每个字符串的长度都将大大减少,从而避免了单个字符串过长导致的错误。 另外,如果不进行格式化,还可以进一步减小字符串长度和生成文件的体积。 通过这些策略,我们可以有效应对处理大容量数据时的长度限制问题。
复制粘贴一下 ()三个参数的含义:
返回值:返回包含 JSON 文本的字符串。 从上面的参数说明中可以看到,第二个参数可以是一个函数或者数组,这给了我们很大的发挥空间。
stringify() 的第一个和第三个参数都好理解,所以下面主要说的是第二个参数。
当第二个参数为数组时,可作为条件筛选使用。 例如有如下对象:
如果我们只需要name属性,则可以这样:
这个特性只对对象的根属性生效,例如:
即使第二层上也有name属性,但在筛选时并不会选中。 当对一个数组进行转换时,会筛选数组第一层的每个值,例如:
基本上数组的用法就是如此了。
函数的发挥空间是很大的,理所当然地用法也就比较多了。 当第二个参数为函数时,stringify() 会给函数传递两个参数,参数值为每一个成员的键和值。 但跟数组参数不同的是,函数会处理所有层级上的每一个成员。 例如:
所有符合条件的内容都被修改了(注意『小红』是『小刚』的下一层)。 正是因为函数的这个特性,我们可以很方便地实现一些可能比较麻烦的功能。 比如上面的例子,如果不使用 stringify() 方法而想要修改所有层级上的age属性的值,就需要需要进行深循环。
上面的例子中,如果想要复制一份arr的数据,通常是进行深拷贝,但其实也可以使用stringify(),只需要配合 () 即可:
stringify() 不能处理值为函数的成员,当某个成员的值为函数时,在转换过程中会被自动排除,例如:
同样的,() 方法是不能处理函数格式的字符串的。
在JavaScript中,() 和 () 是处理JSON数据的两个关键工具。() 有多种用法:
而 () 则用于解析JSON字符串,传入自定义解析器提供灵活性,但需确保输入字符串为有效JSON格式。 比如,如果字符串不符合JSON规范,会引发错误。
总结,使用这两个方法时,要密切关注序列化和解析过程中可能遇到的循环引用、格式错误以及特殊类型转换等问题。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/ef3323bf2e08bebd16b2.html,复制请保留版权链接!
在MATLAB中生成随机数看似一项简单的任务,但如果没有适当的理解,它可能会导致不准确和不可重复的结果,本文将深入探讨MATLAB随机数生成中的常见陷阱,并提供技巧以避免这些陷阱并优化结果,通过遵循本文中的准则,您可以确保您的随机数生成代码产生准确且可重复的结果,陷阱1,使用不合适的随机数生成器MATLAB提供多种随机数生成器,每种生...。
互联网资讯 2024-09-29 20:25:33
响应式布局随着移动设备的普及,响应式布局已成为Web开发的必备功能,响应式布局允许网站在不同尺寸的屏幕上良好显示,从台式机到智能手机,这对于确保所有用户获得良好的体验至关重要,无论他们使用何种设备,实现响应式布局有多种方法,包括,使用媒体查询、使用Flexbox和Grid等CSS布局模块,以及使用CSS框架,这些技术使Web开发人员能...。
本站公告 2024-09-28 13:56:40
TreeView控件是VB中用于显示分层数据的强大工具,当树视图包含大量节点时,它可能会变得慢速和无响应,通过实施一些性能优化技术,可以显著提高TreeView控件的速度和响应能力,1.减少节点计数TreeView控件性能的最大影响因素之一是节点数量,每个节点都需要应用程序创建、渲染和管理,这会消耗处理能力和内存,因此,尽量减少树视图...。
最新资讯 2024-09-25 15:19:34
简介`afxMessageBox`函数是一个允许你在VisualC,应用程序中显示消息框的函数,消息框是一种用户界面元素,它用于向用户显示信息、警告或错误消息,它还可以用于获取用户输入,如何使用`afxMessageBox`函数`afxMessageBox`函数的语法为,cppintafxMessageBox,constcharlp...。
最新资讯 2024-09-25 06:08:30
简介在现代Web开发中,JavaScript应用程序变得越来越复杂,处理大量数据的需求也不断增加,为了满足这些要求,开发人员需要找到方法来提高应用程序的性能和响应能力,setInterval函数setInterval函数是一个内置的JavaScript函数,允许您以指定的间隔,以毫秒为单位,重复执行一段代码,它通常用于创建定时器,在特...。
本站公告 2024-09-17 04:29:44
创建文件失败是一个常见的Windows错误,通常由CreateFile函数引发,此函数用于访问和创建文件和目录,因此它在应用程序开发中至关重要,排查CreateFile错误排查CreateFile错误可能很困难,因为原因可能有多种,以下是一个详尽的策略,可帮助您识别并解决这些错误,检查路径和文件名确保您正在使用的路径和文件名有效,验证...。
最新资讯 2024-09-14 20:08:43
>,一个航班抓取工具,可以从多个航空公司网站抓取航班信息,结语通过本文的介绍,相信大家已经对旅游网站的运作模式和免费下载旅游网站源码有了更多的了解,如果你也想搭建一个旅游网站,不妨下载这些免费的源码,并加以修改和定制,打造一个属于你自己的旅游平台,最后,祝大家都能旅途愉快,玩得尽兴!...。
本站公告 2024-09-13 17:39:52
释放负面情绪对于我们的身心健康至关重要,当我们压抑或否认自己的负面情绪时,它们会累积并对我们的健康产生负面影响,释放负面情绪可以帮助我们缓解压力、改善心情、提高认知能力,甚至促进身体健康,有多种方法可以释放负面情绪,以下是一些建议,1.正视你的情绪承认你的感受很重要,不要否认或压抑它们,当你意识到自己感到难过、愤怒或沮丧时,不要试图将...。
本站公告 2024-09-12 07:22:22
Socket编程是建立网络通信的一种重要方法,通过使用socket,我们可以创建套接字,并在客户端和服务器之间建立连接,本文将介绍如何使用LinuxSocket编程建立安全的网络通信,一、Socket编程的基础Socket是一个端点,它允许两个或多个应用程序通过网络进行通信,要使用Socket编程,我们需要创建套接字,并将其绑定到一个...。
技术教程 2024-09-12 05:14:02
在当今数字时代,网络编程至关重要,它使我们能够与远程计算机通信、共享数据并提供在线服务,对于Windows来说,微软提供了各种工具和API来支持网络编程,使开发人员能够创建强大的网络应用程序,Windows网络编程基础Windows网络编程的基础建立在套接字编程之上,套接字是一种双向通信通道,使应用程序能够在网络上发送和接收数据,Wi...。
本站公告 2024-09-10 04:28:49
substr,函数概述在PHP中,substr,函数用于截取字符串的一部分,它的语法如下,stringsubstr,string$string,int$start,int$length,其中,$string,要截取的字符串$start,截取开始位置,从0开始,$length,截取的长度,可省略,默认为字符串长度,$start,su...。
本站公告 2024-09-05 17:33:20
如何做一个免费的个人网站,下面是如何建立一个免费的个人网站,电脑,联想天翼510S,系统,WindowsS10,软件,微软边缘102.0.1245.441.在浏览器中搜索,免费空房间,或,免费个人网站,2.以,柯凡,为例,有很多免费空房间,只是随便举个例子,点击进入官网,出现报名页面,点击立即体验免费注册,3.你找到后,可以直接分...。
技术教程 2024-09-02 02:41:00