当前位置: 首页 > Web前端 > HTML

如何在JavaScript中克隆一个对象?

时间:2023-03-28 11:46:12 HTML

微信搜索【GreatMovetotheWorld】,第一时间与大家分享前端行业动态、学习路径等。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。原始值和引用值(对象)在我们想要复制它们时表现得非常不同。原始值我们假设一个变量名有一个与之关联的原始值(数字、字符串、布尔值、未定义和空值)。如果我们将这个变量名复制到另一个变量名2,对原始变量的任何修改都不会影响第二个变量,因为它们是原始值。letname="前端小智";letname2=name;console.log(name,name2);//前端小智,前端小智name="王大爷";console.log(name,name2);/然而,如果我们对引用类型的值做同样的事情,我们对一个变量所做的任何更改也会反映在另一个变量中,因为两个变量都指向同一个对象。数组要复制数组,可以使用slice()方法创建数组的新副本。这个副本可以独立修改而不影响原来的数组。如果没有传递参数,它会精确复制数组,但数字也可以作为参数传递。如果只传递一个数字,它将确定我们要从中复制的索引的值,而如果传递两个数字,它将标记开始和结束。//例1constnames=['前端小智','王大爷','小丽'];constnames2=names;console.log(names,names2);//["前端小智","WangDaye","Xiaoli"]//["FrontendXiaozhi","WangDaye","Xiaoli"]//Example2names2[2]='FrontendXiaoli';console.log(names,names2);//["前端小智","王大业","前端小利"]//["前端小智","王大业","前端小利"]//例3constname2=names.slice();names[2]='我是隔壁的老智慧';console.log(name2,names2)//["前端小智","王大爷","前端小丽"]//["前端小智","王大爷","我是下一个老头door"]object当引用值是一个对象时会发生同样的情况,并且对其其中一个属性的任何修改都会影响两个变量。要克隆一个对象,使用Object.assign()方法,该方法将一个或多个源对象的所有可枚举属性的值复制到目标对象,但该方法只是对对象进行浅拷贝。//例1constnames={name:'前端小智',surname:'邻居老智'}constnames2=names;console.log(names,names2)//打印出来的结果完全一样//例2names2.surname='邻里老王';console.log(names,names2)//{name:"前端小志",surname:"邻里老王"}//{name:"前端小志",surname:"邻里老王"}//例3constnames3=Object.assign({},names);names3.surname='隔壁老色P';console.log(names,names3)//{name:"前端小智",surname:"邻居老王"}//{name:"前端小智",surname:"邻居老色P"}要对对象进行深拷贝,需要用到其他方法。正如我们所说,Object.assign()方法仅适用于浅拷贝(即,当我们的对象没有其他对象作为属性时)。在这些情况下,必须制作对象的深拷贝。与浅拷贝不同,深拷贝递归地复制每个子对象,直到所有涉及的对象都被复制。我们可以使用什么方法来制作对象的深拷贝?JSON.parse(JSON.stringify(obj))此方法使用JSON.stringify()将对象转换为字符串,然后使用JSON.parse()将其转换回对象。此方法适用于简单对象,但不适用于对象属性是函数的情况。constnames={name:'前端小智',surname:'隔壁老智慧',social:{wx:'大举走向世界',url:'www.lsp.com'}}constnames2=JSON.parse(JSON.stringify(names));names2.social.url='www.baidu.com';console.log(names,names2);/**{name:"前端小智"social:{wx:"大招天下》,url:"www.lsp.com"}surname:"邻家老智慧"}*//**{name:"前端小智慧"social:{wx:"大招totheWorld",url:"www.baidu.com"}surname:"OldWisdomNextDoor"}*/deepcopy另一种非常有趣和优雅的深度复制对象的方法是使用递归函数。我们创建一个deepClone(object)函数,将我们想要克隆的对象作为参数传递给它。在函数内部,创建了一个局部变量clone,它是一个空对象,将从起始对象克隆的每个属性都添加到该对象中。具体思路:如果属性不是对象,则简单地克隆它并添加到新的克隆对象中。如果属性是对象,则再次执行deepClone(value)函数,将属性(本例中为对象)的值作为参数传递,并重复相同的过程。函数deepClone(object){varclone={};for(varkeyinobject){varvalue=object[key];if(typeof(value)!=='object'){clone[key]=value;}else{clone[key]=deepClone(value);}}returnclone;}deepClone({value1:1,value2:{value3:2}});//{value1:1,value2:{value3:2}}deepClone({value1:1,value2:{value3:{value3b:3}}});//{value1:1,value2:{value3:{value3b:3}}}代码部署后,可能的bug不能实时我知道为了解决这些BUGs之后,我花了很多时间在日志调试上。顺便推荐一个好用的BUG监控工具,Fundebug。原文:https://www.ma-o.org/en/progr...交流有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智慧.本文GitHubhttps://github.com/qq44924588...已收录,有完整的测试站点、资料和我的一线厂商访谈系列文章。