前端面试题之——说一说深浅拷贝,都是怎么实现的?

前端面试题之——说一说深浅拷贝,都是怎么实现的?

首先,基本数据类型没有深浅拷贝之分,基本数据类型存储在栈内存中,每一次赋值都会在栈中开辟一片新空间存放值,但是复杂数据类型要区分深拷贝和浅拷贝

浅拷贝

什么是浅拷贝?

在发生赋值操作时,比如b = a (a,b都是复杂数据类型),这实际上是把a的引用给了b,大家都知道复杂数据类型的值是存放在堆里面的,栈中存放的是数据在堆中的地址 ,这个时候发现,当修改了a中的值,b中的值也会改变,这就产生了不是我们本意的修改。这就是浅拷贝

实现浅拷贝的方法

  • 展开语法:Spread syntax (…)
  • 数组原型方法concat():合并数组并返回新数组,数组中元素是复杂数据类型,返回调用此方法的浅拷贝
  • 数组原型方法slice():返回一个新数组,根据参数begin和end决定的原数组的浅拷贝(包括begin不包括end)原数组不改变
  • Array.from()方法:对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例,第一个参数是一个想转换为数组的伪数组或可迭代对象,第二个参数是一个回调函数,如果指定了该参数,新数组中每个元素都会执行该回调函数,第三个参数是第二个参数回调函数的this对象
  • Object.assign()方法:Object.assign()方法只会拷贝可枚举的自身的属性到目标对象,第一个参数是目标对象,第二个参数是源对象,如果第二个源对象和目标对象里面含有相同的属性,那么目标对象中的属性会被覆盖

深拷贝

什么是深拷贝?

复杂类型的深拷贝,比如b想深拷贝a,那b就要在堆里面开辟一个新的空间,把a的值复制到新的存储空间里,这样ba在栈中存储的地址是不一样的,也就是说ba只有内在的值是一样的,此时b被修改a也不会被修改了

实现深拷贝的方法

  • JSON.stringify():将对象转换为JSON字符串,然后使用JSON.parse()将字符串转换回(全新的)JavaScript对象(但是有缺陷:许多JavaScript对象根本不可序列化,例如函数(带闭包)、Symbol、在HTML DOM API中表示HTML元素的对象、递归数据以及许多其他情况。在这些情况下,调用JSON.stringify()来序列化对象将会失败。所以没有办法对这样的物体进行深度复制。)
  • structuredClone():优点是允许将源中的可转移对象转移到新副本(转移之后原件会被清除),不仅仅是克隆,但是请注意,structuredClone()并不是JavaScript语言本身的一个特性,而是浏览器和任何其他实现像window这样的全局对象的JavaScript运行时的一个特性,调用structuredClone()来克隆一个不可序列化的对象将会失败,和JSON.stringify()一样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值