当前位置: 首页 > 科技观察

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

时间:2023-03-22 10:06:00 科技观察

原始值和引用值(对象)在我们想要复制它们时的行为非常不同。原始值我们假设一个变量名有一个与之关联的原始值(数字、字符串、布尔值、未定义和空值)。如果我们将这个变量名复制到另一个变量名2,对原始变量的任何修改都不会影响第二个变量,因为它们是原始值。letname="前端小智";letname2=name;console.log(name,name2);//前端小智,前端小智name="王大爷";console.log(name,name2);//Wang然而,如果我们对引用类型的值做同样的事情,我们对一个变量所做的任何更改也会反映在另一个变量中,因为两个变量都指向同一个对象。数组要复制数组,可以使用slice()方法创建数组的新副本。这个副本可以独立修改而不影响原来的数组。如果没有传递参数,它会精确复制数组,但数字也可以作为参数传递。如果只传递一个数字,它将确定我们要从中复制的索引的值,而如果传递两个数字,它将标记开始和结束。//示例1constnames=['前端小智','王大叶','小丽'];constnames2=names;console.log(names,names2);//["前端小智","王大叶""","小丽"]//["小智前端","王大爷","小丽"]//例子2names2[2]='小丽前端';console.log(names,names2);//["前端小智","王大业","前端小利"]//["前端小利","王大业","前端小利"]//例3constname2=names.slice();names[2]='我是隔壁的老智慧';console.log(name2,names2)//["前端小智","王大爷","前端小丽"]//["前端小李”当引用值是一个对象时会发生同样的事情,对其其中一个属性的任何修改都会影响两个变量。要克隆一个对象,使用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:"前端Xiaozhi",surname:"邻家王老头"}//{name:"前端小智",surname:"邻家老色P"}要对对象做深拷贝,需要用到other方法。正如我们所说,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)函数,将属性(本例中为对象)的值作为参数传递,并重复相同的过程。functiondeepClone(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}}}作者:LuigiNori作者:前端小智来源:stackabuse译文:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects