前端的深拷贝和浅拷贝_浅谈前端深拷贝与浅拷贝

说起前端的浅拷贝与深拷贝得先从javascript中的数据类型说起:

js数据类型分为俩大类:

原始数据类型:undefined null boolean number string 原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;

引用类型数据:Object function Array 引用数据类型直接存储在堆中,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后,从堆中获得实体。

如下图所示

浅拷贝定义:只是把要拷贝的对象的指针拷贝了过去,并未重新开辟内存,例如 一个数组 var arr1 = ["a","b",1,2,3];var arr2 = arr1;此时arr1和arr2在内存中他们的指针都指向同一个地址,比如我进行如下操作更改arr2[0] = "A";那么arr1也会跟着响应的改变,此时arr1 变为了 ["A","b",1,2,3],因为arr2只是拷贝了arr1指向真正存放arr1数组在内存中的指针,arr1和arr2俩个数组对象指向的内存地址是同一个,并没有复制引用类型的数据,所以arr2修改了数组元素,arr1也会跟着改变。

深拷贝定义:在javascript中数据类型分为基本数据类型/引用数据类型,基本数据类型相对于来说,所有的拷贝都是深拷贝,因为只要我们定义一个基础数据类型,那么系统就会开辟一段地址用于存放基础数据类型,ES6中的symbol()也适用 var a = Symbol(12),b = a;。b = symbol(2);此时a依然是symbol(12);

实现浅拷贝的方法

1.利用es6 Obect.assign()实现浅拷贝

var obj = {name:"lily",age:18};

var copy_obj = Object.assign({},obj)  //  {name: "lily", age: 18}

2.直接引用赋值

var arr1 = ["a","b",1,2,3];var arr2 = arr1

3.$.extend( [deep ], target, object1 [, objectN ] )jquery实现浅拷贝

$.extend( [deep ], target, object1 [, objectN ] )

deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝

targetObject类型 目标对象,其他对象的成员属性将被附加到该对象上。

object1  objectN可选。 Object类型 第一个以及第N个被合并的对象。

var obj1 = {name:"lily"};

var obj2 = {age:16};

var obj3 = {sex:male};

var objnew = $.extend(false,{},obj1,obj2,obj13)

实现深拷贝的方法

1.$.extend( [deep ], target, object1 [, objectN ] )jquery实现浅拷贝

第一个参数改为true可以实现深拷贝

2.递归实现深拷贝

function deepClone(obj){

let objClone = Array.isArray(obj)?[]:{};

if(obj && typeof obj==="object"){

for(key in obj){

if(obj.hasOwnProperty(key)){

//判断ojb子元素是否为对象,如果是,递归复制

if(obj[key]&&typeof obj[key] ==="object"){

objClone[key] = deepClone(obj[key]);

}else{

//如果不是,简单复制

objClone[key] = obj[key];

}

}

}

}

return objClone;

} 3.可以借用JSON对象的parse和stringify

function deepClone(obj){

let _obj = JSON.stringify(obj),

objClone = JSON.parse(_obj);

return objClone

}

没法复制函数,正则,symbol

总结:深拷贝会重新开辟内存地址,浅拷贝只是拷贝了对象的指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端深拷贝浅拷贝的区别在于复制对象时是否递归地复制对象中的子对象。 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址。所以如果其中一个对象改变了这个地址,就会影响到另一个对象。浅拷贝复制一层对象的属性。 深拷贝是将一个对象从内存中完整地拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,并递归地拷贝对象中的子对象。深拷贝后的新对象与原对象互不影响,即使修改新对象的值也不会影响原对象。深拷贝复制了所有层级的对象属性。 在前端开发中,深拷贝通常用于确保修改副本对象不会影响原始对象,尤其是在涉及到多层嵌套的对象或数组时。常见的实现深拷贝的方式包括使用递归、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、付费专栏及课程。

余额充值