面试题-关于深拷贝浅拷贝

本文详细探讨了JavaScript中的赋值、变量类型以及浅拷贝和深拷贝的概念。通过实例展示了Object.assign和展开运算符在浅拷贝中的应用,并解释了它们的局限性。接着,介绍了如何实现深拷贝,包括简单版、进阶版的实现,以及处理复杂情况如函数、undefined、正则和循环引用的方法。最后,分析了lodash库中cloneDeep的关键源码,为深入理解深拷贝提供了参考。
摘要由CSDN通过智能技术生成

关于赋值

赋值,即直接将变量相等,=,此时对于这两个变量来讲,指向了同个内存地址,所以,内存地址指向的内容一旦改变就会同步改变

关于 js 变量类型

基本数据类型: Number, Boolean, String, Symbol, null, undefined

引用类型: Object,诸如 array, function, object

关于浅拷贝

浅拷贝的理解就是两个变量的内存地址是不一样的,但对于不同类型的变量是有区别的:

基本数据类型: 一个变量的更改不会引起另一个变量的更改

引用类型:一个变量的内容更改会引起另一个变量的更改

const a = [{aa: 1}]

var b = a.map(item => { // 因为此时item是一个对象,所以是直接更改item.aa也会影响a
  item.aa = 2
  return item
})
console.log(b) // b: {aa: 2}
console.log(a) // a: {aa: 2}

实现一个浅拷贝

Object.assign

利用 Object.assign 能进行浅拷贝,仅拷贝一级 key 的 value 值,如果你对原值进行二级以上的 value 值的拷贝,则两个变量都会同时受到影响

展开运算符

var a = {aa: 1}
var b = {...a}

深拷贝概念

浅拷贝的理解就是两个变量的内存地址是不一样的,一般更加应用于引用类型

引用类型:一个变量的内容更改不会引起另一个变量的更改,因为内容对应的内存地址不一样,所以取到的值也就不一样

实现一个深拷贝

简单版

var obj = {a: 1}

function clone(origin) {
  return JSON.parse(JSON.stringify(origin))
}

var
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值