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

浅拷贝和深拷贝的区别

时间:2023-04-03 00:46:45 HTML

浅拷贝和深拷贝1、数据类型数据分为基本数据类型(String、Number、Boolean、Null、Undefined、Symbol)和对象数据类型。基本数据类型的特点:数据直接存放在栈(stack)中引用数据类型的特点:存放的是栈中引用的对象,真正的数据存放在堆内存中。引用数据类型在堆栈中存储指针。这个指针指向这个实体在堆中的起始地址。解释器在查找引用值时,首先获取其在栈中的地址,获取到地址后,再从堆中获取实体。2、浅拷贝和深拷贝深拷贝和浅拷贝只针对Object、Array等引用数据类型。深拷贝和浅拷贝的示意图大致如下:浅拷贝只拷贝对象的指针,不拷贝对象本身,新旧对象仍然共享同一块内存。但是,深拷贝将创建一个相同的对象。新对象不与原对象共享内存,修改新对象不会改变原对象。3.赋值和浅拷贝的区别当我们将对象赋值给一个新的变量时,实际赋值的是对象在栈上的地址,而不是堆中的数据。即两个对象指向同一个存储空间。无论哪个对象发生变化,实际上都是变化的存储空间的内容。因此,这两个对象是链接在一起的。浅拷贝是对象的按位拷贝,它使用原始对象属性值的精确副本创建新对象。如果属性是基本类型,则复制基本类型的值;如果属性是内存地址(引用类型),内存地址被复制,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。也就是说,默认的拷贝构造函数只对对象进行浅拷贝(逐个拷贝成员),即只拷贝对象空间,不拷贝资源。我们先来看两个例子。对比赋值和浅拷贝,会给原来的对象带来什么变化?上例中obj1为原始数据,obj2通过赋值操作得到,obj3通过浅拷贝得到。我们可以清楚的看到对原始数据的影响,具体见下表:四、浅拷贝的实现1.Object.assign()Object.assign()方法可以为源对象本身赋值任意数量的可枚举属性被复制到目标对象,然后返回到目标对象。但是Object.assign()执行的是浅拷贝,即复制对对象属性的引用,而不是对象本身。注意:当对象只有一层时,是深拷贝2.Array.prototype.concat()修改新对象会把它改成原来的对象:3.Array.prototype.slice()修改同一个新对象会变成原来的对象:Array的slice和concat方法补充说明:Array的slice和concat方法不修改原数组,只返回一个浅拷贝的新数组原始数组中的元素。原始数组的元素将根据以下规则进行复制:如果元素是对象引用(不是实际对象),slice会将对象引用复制到新数组中。两个对象引用都指向同一个对象。如果引用的对象发生变化,新数组和原数组中的这个元素也会发生变化。对于字符串、数字和布尔值(不是String、Number或Boolean对象),slice将值复制到新数组中。在其他数组中修改这些字符串或数字或布尔值不会影响其他数组。这段话可能很难理解。举个例子,稍微修改一下上面的例子:V。深拷贝JSON.parse(JSON.stringify())的实现方法原理:使用JSON。stringify将对象转换为JSON字符串,然后使用JSON.parse()将字符串解析为对象。走啊走,生成一个新的对象,对象会开一个新的栈,实现深拷贝。这种方法虽然可以实现数组或者对象的深拷贝,但是不能处理函数。这是因为JSON.stringify()方法将一个JavaScript值(对象或数组)转换为JSON字符串,不能接受手写函数递归方法递归方法实现了深度克隆的原理:遍历对象和数组,直到它们都是基础数据类型,然后复制它们,这就是深度复制函数库lodash。这个函数库还提供了_.cloneDeep用于DeepCopy。喜欢的可以关注小编哦~