游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

js中的浅拷贝和深拷贝

  js的数据类型:基本数据类型:String、Number、Boolean、Null、Undefined;引用数据类型:Object(Array、Date、Function、RegExp)。
  基本数据类型和引用数据类型的区别:基本数据类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配,是直接按值存放的,所以可以直接访问。引用数据类型:引用类型(object)是存放在堆内存中的,变量实际上是一个存放在栈内存的指针,这个指针指向堆内存中的地址。每个空间大小不一样,要根据情况来进行特定的分配。引用数据类型保存在堆内存中,然后在栈内存中保存了一个对堆内存中实际对象的引用,即数据在堆内存中的地址,JS对引用数据类型的操作都是操作对象的引用而不是实际的对象,如果obj1拷贝了obj2,那么这两个引用数据类型就指向了同一个堆内存对象,具体操作是obj1将栈内存的引用地址复制了一份给obj2,因而它们共同指向了一个堆内存对象;
  例如:vara1;ba;栈内存会开辟一个新的内存空间,此时b和a都是相互独立的b2;console。log(a);1
  例如:vararr〔1,2,3,4〕;arr1arr;arr将栈内存的引用地址复制了一份给arr1,因而它们共同指向了一个堆内存对象;arr1〔2〕9;console。log(arr);〔1,2,9,4〕
  基本数据类型值不可变:javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。原始值是不可更改的:任何方法都无法更改(或突变)一个原始值。对数字和布尔值来说显然如此改变数字的值本身就说不通,而对字符串来说就不那么明显了,因为字符串看起来像由字符组成的数组,我们期望可以通过指定索引来假改字符串中的字符。实际上,javascript是禁止这样做的。字符串中所有的方法看上去返回了一个修改后的字符串,实际上返回的是一个新的字符串值。
  基本数据类型的值是不可变的,动态修改了基本数据类型的值,它的原始值也是不会改变的,varstrabc;str〔1〕f;console。log(str);abc
  有很多操作字符串的方法,但是这些方法都是返回一个新的字符串,并没有改变其原有的数据。
  引用类型值可变vara〔1,2,3〕;a〔1〕5;console。log(a〔1〕);5
  浅拷贝与深拷贝:浅拷贝和深拷贝都只针对于引用数据类型,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存;但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象;浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制。
  区分深拷贝与浅拷贝,就是假设B复制了A,当修改B时,看A是否会发生变化,如果A也跟着变了,说明这是浅拷贝,拿人手短,如果A没变,那就是深拷贝,自食其力。
  浅拷贝:
  forin只循环第一层functionsimpleCopy(obj1){varobj2Array。isArray(obj1)?〔〕:{};for(letiinobj1){obj2〔i〕obj1〔i〕;}returnobj2;}varobj1{a:1,b:2,c:{d:3}}varobj2simpleCopy(obj1);obj2。a3;obj2。c。d4;console。log(obj1。a);1console。log(obj2。a);3console。log(obj1。c。d);4console。log(obj2。c。d);4
  Object。assign()实现浅拷贝及一层的深拷贝varobj1{a:{b:1},c:2}varobj2Object。assign({},obj1)obj2。a。b3;obj2。c3console。log(obj1。a。b);3console。log(obj2。a。b);3console。log(obj1。c);2console。log(obj2。c);3
  Object实现拷贝2,浅拷贝varobj1{a:1,b:2,c:{d:3}}varobj2Object。create(obj1);obj2。a3;obj2。c。d4;console。log(obj1。a);1console。log(obj2。a);3console。log(obj1。c。d);4console。log(obj2。c。d);4
  深拷贝
  1、递归实现深拷贝functiondeepCopy(obj1){varobj2Array。isArray(obj1)?〔〕:{};if(obj1typeofobj1object){for(variinobj1){varpropobj1〔i〕;避免相互引用造成死循环,如obj1。aobjif(propobj1){continue;}if(obj1。hasOwnProperty(i)){如果子属性为引用数据类型,递归复制if(proptypeofpropobject){obj2〔i〕(prop。constructorArray)?〔〕:{};arguments。callee(prop,obj2〔i〕);递归调用}else{如果是基本数据类型,只是简单的复制obj2〔i〕prop;}}}}returnobj2;}varobj1{a:1,b:2,c:{d:3}}varobj2deepCopy(obj1);obj2。a3;obj2。c。d4;console。log(obj1。a);1console。log(obj2。a);3console。log(obj1。c。d);3console。log(obj2。c。d);4
  2、Object。create实现深拷贝1,但也只能拷贝一层functiondeepCopy(obj1){varobj2Array。isArray(obj1)?〔〕:{};if(obj1typeofobj1object){for(variinobj1){varpropobj1〔i〕;避免相互引用造成死循环,如obj1。aobjif(propobj1){continue;}if(obj1。hasOwnProperty(i)){如果子属性为引用数据类型,递归复制if(proptypeofpropobject){obj2〔i〕(prop。constructorArray)?〔〕:Object。create(prop);}else{如果是基本数据类型,只是简单的复制obj2〔i〕prop;}}}}returnobj2;}varobj1{a:1,b:2,c:{d:3}}varobj2deepCopy(obj1);obj2。a3;obj2。c。d4;console。log(obj1。a);1console。log(obj2。a);3console。log(obj1。c。d);3console。log(obj2。c。d);4
  3、使用JSON。stringify和JSON。parse实现深拷贝JSON。stringify把对象转成字符串,再用JSON。parse把字符串转成新的对象。缺点:(1)如果obj里面有时间对象,则JSON。stringify后再JSON。parse的结果,时间将只是字符串的形式,而不是时间对象;(2)如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;(3)如果obj里有函数,undefined,则序列化的结果会把函数或undefined丢失;(4)如果obj里有NaN、Infinity和Infinity,则序列化的结果会变成null;(5)JSON。stringify()只能序列化对象的可枚举的自有属性,例如如果obj中的对象是有构造函数生成的,则使用JSON。parse(JSON。stringify(obj))深拷贝后,会丢弃对象的constructor;(6)如果对象中存在循环引用的情况也无法正确实现深拷贝;
  以上,如果拷贝的对象不涉及上面讲的情况,可以使用JSON。parse(JSON。stringify(obj))实现深拷贝,但是涉及到上面的情况(除循环引用的情况外),可以考虑使用如下方法实现深拷贝。functiondeepClone(data){consttypethis。judgeType(data);letobj;if(typearray){obj〔〕;}elseif(typeobject){obj{};}else{不再具有下一层次returndata;}if(typearray){eslintdisablenextlinefor(leti0,lendata。length;ilen;i){obj。push(this。deepClone(data〔i〕));}}elseif(typeobject){对原型上的方法也拷贝了。。。。eslintdisablenextlinefor(constkeyindata){obj〔key〕this。deepClone(data〔key〕);}}returnobj;}functionjudgeType(obj){tostring会返回对应不同的标签的构造函数consttoStringObject。prototype。toString;constmap{〔objectBoolean〕:boolean,〔objectNumber〕:number,〔objectString〕:string,〔objectFunction〕:function,〔objectArray〕:array,〔objectDate〕:date,〔objectRegExp〕:regExp,〔objectUndefined〕:undefined,〔objectNull〕:null,〔objectObject〕:object,};if(objinstanceofElement){returnelement;}returnmap〔toString。call(obj)〕;}
  4、如果被拷贝中没有对时间、正则要求兼容,可以采用如下方法functiondeepClone(obj){letobjCloneArray。isArray(obj)?〔〕:{};if(objtypeofobjobject){for(keyinobj){if(obj。hasOwnProperty(key)){判断ojb子元素是否为对象,如果是,递归复制if(obj〔key〕typeofobj〔key〕object){objClone〔key〕deepClone(obj〔key〕);}else{如果不是,简单复制objClone〔key〕obj〔key〕;}}}}returnobjClone;}
  5、热门的函数库lodash,也有提供。cloneDeep用来做深拷贝
  6、jquery实现深拷贝,jquery提供一个。extend可以用来做深拷贝varrequire(jquery);varobj1{a:1,b:{f:{g:1}},c:〔1,2,3〕};varobj2。extend(true,{},obj1);console。log(obj1。b。fobj2。b。f);false

电影狼少女开机何沐蓉化身美艳王妃,倾城绝色惹人怜爱8月22日,由东阳市后翼影业有限公司、九江长投影业有限公司、东阳静远影业有限公司、九江市委宣传部、九江市文化旅游发展集团联合出品的中国首部狼女题材电影《狼少女》举行了开机仪式,……PoE供电华为路由H6组网无忧,轻松应对大户型多终端笔者家里属于目前北方比较常见的上下两层翻建房屋,另有院子和南边的厢房设计,两层主建筑大约280平左右。这三年来各类品牌用过的全屋路由也不下8、9种,无线级联,电力组网,最后又回……知错就改发布的华为P50系列向命运低头了吗?第一部分:知错就改千呼万唤始出来,很多国人期盼的华为时尚P系列华为P50系列终于发布了,与之前媒体爆料的还惨烈,整场发布会就没有5G版P50系列手机再现。之前有媒体……Q2财报之外,腾讯音乐的未来如何?作者:霖宁原创:深眸财经(chutou0325)北京时间8月16日美股盘后,腾讯音乐控股(TME)发布了2021年二季度财报。报告显示,腾讯音乐第二季度总营收……这一次,让世界听我说话2019年12月30日,第十五届中国少年科学院小院士课题研究成果展示交流活动在中国少年科学院落下帷幕。原子同学学员王柏良、黄翊天同学,与来自全国各省市的2000多名优秀学……当玄冰50遇见堡垒240,新手装机一样轻车熟路引言从今年五月开始,我就开启了装机之旅,以前看到网友的段子装机一时爽,一直装机一直爽,我还不以为然,如今我算是真正的入坑了!在今年618前,我自己攒了一台主机,当时……追忆迷局海报预告全球首发狼叔休杰克曼深陷诺兰式悬疑由华纳兄弟影片公司出品的好莱坞动作惊悚悬疑电影《追忆迷局》(暂译,Reminiscence)今日正式公布全球首款海报及预告片。影片由《西部世界》创作者丽莎乔伊导演,休杰克曼、丽……我无法不安利这部不唱歌跳舞的印度电影!愿你也能遇到这样的老师星姐要强势安利一下这部电影,这是继《摔跤吧,爸爸》之后的又一部零差评的印度电影。10月10日,星关系陪伴着奥斯卡院线组织的广大网友在奥斯卡大世界影城提前观看了这部《嗝嗝老……七夕快到了,币价不再是那个币价,你还是那个单身的你!今天的币市依然是一片红,只有和美元同进退的泰达(USDT)还坚强的绿着,世界警察还是厉害啊。有人欢喜有人愁,土耳其的法币就没有这么坚挺一个月前:一个月后:……盯盯拍车载智慧屏S50于华为HDC2021大会正式发布2021年10月22日,由HUAWEIHiCar与DDPAI盯盯拍联合打造的,搭载HarmonyOS分布式技术的第二代车载智慧屏S50在HDC2021大会上正式发布!手机上支持……奇瑞瑞虎7PLUS曝光,奇瑞这速度起飞了,新车频出近日,网上曝光了奇瑞瑞虎7plus的几组照片,目前还没有官方的消息出来。这个速度真是让人有点意外,毕竟4月底刚刚发布了瑞虎7超能版。看来,技术积累足够的奇瑞,下半年可以给大家带……璀璨高颜值的Vlog摄影神器荣耀50系列起售价2699元起荣耀50眼下618正在火热举行,诸多上半年旗舰都迎来了价格下调,打算冲击一波销量,但荣耀所走的战略不同,是赶在618之前发布了一款新机荣耀50系列。该机在开始预热时就已经得到了……
日本初创公司推出飞行摩托车XTurismo近日,由三菱电机、京瓷和知名足球球星本田圭佑所投资的一家日本初创公司A。L。I。Technologies推出了一款飞行摩托车XTurismo。这款飞行摩托车重约300公斤……青春力量一刻尽显华为nova7系列助你成焦点你的20岁梦想是什么?你想对20岁的自己说些什么?5月4日,人民日报携手华为nova7系列推出热血短片《我的20岁》,展现了当代青年的热血青春故事。短片中,三位20岁青年……纠结iOS安卓谁更安全?ColorOS11出世都可以坐下了近年来,公共WiFi逐渐成为餐厅、电影院等公共场所的标配,却也因其开放的特点容易遭到不法分子攻击,成为风险WiFi。根据相关调研机构数据显示,2020年上半年共发现公共WiFi……完美陌生人影评一个人要隐藏多少秘密,才能巧妙度过一生5月22日星关系联合奥斯卡电影院线组织网友到奥斯卡西元国际影城超前观看电影《完美陌生人》。该影片主要围绕七个人在聚会上玩的一个游戏而展开。当今社会,科技发达,手机早已渗透到千家……7nm锐龙真香!联想小新152020锐龙版来了小新152020锐龙版全系搭载AMD锐龙4000系列,R54600U先行,所以3999元价格对应的处理器是R54600U,考虑到100sRGB色域、16GB内存、512GBSS……昼颜评价年度女性必看影片又甜又虐的禁忌爱情故事5月15日星关系联合奥斯卡电影院线组织网友到奥斯卡汇金国际影城观提前观看《昼颜》,影片由上户彩、斋藤工、伊藤步、平山浩行等主演的爱情剧情片,该片是2014年电视剧《昼颜》的续集……电影完美陌生人评价来吧来玩一场让你心惊肉跳的游戏电影《完美陌生人》是一部喜剧电影,由保罗格诺维瑟执导,出演的演员主要包括阿尔芭洛瓦赫、卡西娅史穆特妮亚克、吉塞培巴蒂斯通等人,该部影片主要围绕七个人在聚会上玩的一个游戏而展开。……电影寂静之地评价赴一场与死神相交的约会死,一个让人听到都惊恐万分的字眼。面对死亡,人们的眼瞳中充满了恐惧与害怕。死亡的感觉究竟是何种滋味,我们从现实生活中恐怕无从知晓,也许在看一些恐怖片或者惊悚片的时候,才能略微的……电影复仇者联盟3无限战争评价一场属于王者的视觉盛宴当遇到困难的时候,每个人都会希望会有一个超级英雄来解救自己。当然,这样的画面也无数次出现在各大电影中,在电影世界中来慰藉人们受伤的心灵。今天,我们所要谈论的话题也是超级英雄们,……电影战犬瑞克斯评论上演了一段催人泪下的人狗情缘在当今社会,狗被人们视为忠诚的象征。狗不仅可以作为生活中的朋友,也可以是精神世界的伴侣。狗这一动物形象活跃于各大影视剧中,近年来,感人的宠物片屡见不鲜,但今天我们所介绍的影片有……268V检测标准获认可中国汽车流通协会首批行认证授权机构目前,在由中国汽车流通协会(CADA)主办的中国二手车大会上,国内知名二手车专业检测机构268V的检测标准符合业内规范,并以出色的成绩成为中国汽车流通协会首批指定的行认证授权机……音响销售面对面之我卖音响的这些年(连载1)8月18号下午三点半,大雨倾盆,我和另一位编辑部同事撑着伞,从广州淘金地铁站的B出口走到友谊商场大门,不到三分钟的时间,已经同落汤鸡无异。乘电梯上到五楼,转几个弯,就找到这间位……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网