图解js浅拷贝和地址引用的理解

前两天遇到一个深浅拷贝的问题,浅拷贝并不是我理解的那个浅拷贝,是把浅拷贝和地址引用搞混了,画了个图加深理解

首先来看一段代码;里面包含了浅复制和地址引用;


let arrayA = [1, '这是一个字符串', undefined, null, { obj: '这是一个obj' }];
console.log('原始的arrayA', arrayA)//原始的arrayA [1, 2, 3, 4, 5, 6, 7]
let arrayB = Array.from(arrayA)//浅拷贝(注意,浅拷贝只会拷贝一层)
let arrayC = arrayA//应用arrayA的堆地址

arrayA[0] = 99
arrayA[1] = "修改一下这个字符串"
arrayA[2] = "修改一下这个undefind"
arrayA[3] = "修改一下这个null"
arrayA[4].obj = "修改一下这个obj"

console.log('arrayA', arrayA)//[99, '修改一下这个字符串', 修改一下这个undefind, 修改一下这个null, { obj: '修改一下这个obj' }];
//arrayB是由Array.form浅拷贝来的,
console.log('arrayB', arrayB)//[1, '这是一个字符串', undefined, null, { obj: '修改一下这个obj' }]
//arrayC地址应用(arrayC是指向arrayA这个数组对象的堆内存的内存地址),所以arrayA改变后arrayC也会改变,因为它两指向的是同一个内存地址;
console.log('arrayC', arrayC)//[99, '修改一下这个字符串', 修改一下这个undefind, 修改一下这个null, { obj: '修改一下这个obj' }];

在这里插入图片描述

这张图解释了上面那段代码,
首先我们通过字面量定义了arrayA,前四个元素都是基本类型,最后一个元素是一个对象;
然后通过Array.from()浅复制出了一个arrayB;它只会复制一层,这就是所谓的浅复制

Array.from() 方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。(引用自MDN)

arrayB是复制出了一个新的对象,这个数组的前四个元素都是值赋值,所以直接将初始的值复制过来了;arrayB【4】(第五个元素)是Object对象,所以将其地址引用了,通过图也能看到,arrayA和arrayB的第五个元素都指向那个蓝色背景的地址,里面有一个obj;所以在修改了obj后arrayB也对应的变化了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值