前端学习——深拷贝与浅拷贝

数据类型

在讨论深拷贝与浅拷贝之前,我们先来聊一聊数据类型,因为他和深浅拷贝有关。

在js中,数据类型分为基本数据类型(NUmber、String、Boolean、Null、Undefined、Symbol)引用数据类型(Object、Array、Function)

我们知道,基本数据类型是直接存储在栈中,而引用数据类型是存在堆内存中的,栈中存的,是指向堆内存地址的指针。

深拷贝、浅拷贝

深浅拷贝是针对引用数据类型。

简单来说,浅拷贝是只拷贝了引用数据类型的在栈中的指针,它们指向的都是同一个堆内存地址,所以浅拷贝在某些情况会造成改变数据后导致别的另一份数据也同步被改变的情况;而深拷贝是直接将堆内存中存储的数据直接复制一份,不会有浅拷贝互相影响的问题。

浅拷贝的方法

  • Object.assign()
  •  Array.prototype.concat()
  • Array.prototype.slice() 

slice() 方法可从已有的数组中返回选定的元素。
语法arrayObject.slice(start,end)。

深拷贝的方法

  • JSON.parse(JSON.stringify())

将一个对象先转为json字符串,然后再转回来,这样可以实现深拷贝。

但是这个方法有个缺陷,可以实现对象或数组的深拷贝,但是不能处理函数,函数经过这样处理后会变成null。

手写深拷贝

function deepClone(source) {
            //引用类型=>数组[],对象{}
            const targetObj = source.constructor === Array ? [] : {}
            for (let keys in source) {
                // 检测一个对象是否含有指定名称的属性,并返回一个布尔值,指示属性是否为对象的自有属性(而不是继承而来的)
                if (source.hasOwnProperty(keys)) {
                    //数组和对象
                    if (source[keys] && typeof source[keys] === "object") {
                        //targetObj[keys] = source[keys].constructor === Array ? [] : {}
                        targetObj[keys] = deepClone(source[keys])
                    } else {
                        //基本类型
                        targetObj[keys] = source[keys]
                    }

                }
            }
            return targetObj
        }

前端深拷贝浅拷贝的区别在于复制对象时是否递归地复制对象中的子对象。 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。所以如果其中一个对象改变了这个地址,就会影响到另一个对象。浅拷贝只复制一层对象的属性。 深拷贝是将一个对象从内存中完整地拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,并递归地拷贝对象中的子对象。深拷贝后的新对象与原对象互不影响,即使修改新对象的值也不会影响原对象。深拷贝复制了所有层级的对象属性。 在前端开发中,深拷贝通常用于确保修改副本对象不会影响原始对象,尤其是在涉及到多层嵌套的对象或数组时。常见的实现深拷贝的方式包括使用递归、JSON.stringify和JSON.parse等方法。而浅拷贝则可以通过赋值操作、Object.assign等方法来实现。 因此,深拷贝浅拷贝的区别在于复制对象时是否递归地复制对象中的子对象,以及复制后的对象是否与原对象互不影响。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [[前端面试题]:深拷贝浅拷贝的区别](https://blog.csdn.net/WWEIZAI/article/details/126519334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [前端面试:浅拷贝深拷贝的区别?](https://blog.csdn.net/weixin_39570751/article/details/123363926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值