js的concat方法踩坑

文章讨论了JavaScript中concat方法在处理同一数组变量时,可能会导致新数组内的元素引用同一内存块的问题。当修改新数组的一个元素时,另一个也会随之改变。通过Object.is函数验证了这一点。解决方案是使用深拷贝,如JSON.parse(JSON.stringify()),以确保两个数组元素在新数组中分别指向独立的内存空间。

 concat是会将前后两个数组如果是同一个变量listchild,那么在新数组中的两个listChild会不会指向同一块内存

listChild=[{...}]
let list =  listChild.concat(listChild);

先说结论,concat是会将前后两个数组拷贝,然后返回一个新数组,虽然新数组是一块新内存,但是如果前后两个数组是同一个变量listchild,那么就会出现再新数组list中的,两个listchild实际上是指向同一块内存。

由于将js的数组赋值给变量,实际上是赋值的数组引用,所以当concat(listChild)时,编译器申请了一块新的内存空间,用于存储listChild中可枚举的属性的副本(可枚举属性下面会讲),然后listChild.concat时,由于listChild已经创建了副本,所以直接返回了该副本的引用,并不新申请内存,导致结果如下图:

最终导致操作list[0]时,list[1]会跟着一起变

有api可以验证这个问题,我们可以使用 Object.is 函数来比较两个对象是否是同一个对象,它会比较两个对象的内存地址是否相同。

console.log(,Object.is(list[0],list[1]))
//结果为true

解决方案:

既然两个listchild指向同一块内存,那就深拷贝一个listchild,也就是多申请一块内存,使两个listchild各自指向单独的内存,那么在最终的list中就不会出现指向同一内存的问题了

listChild=[{...}]
let list =  listChild.concat(JSON.parse(JSON.stringify(listChild)));
JSON.parse(JSON.stringify(obj))只是其中一种深拷贝的方式,也可以选用其他方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值