JS深拷贝数组对象实践与效率对比

JS里要把A数组复制到B数组

如果只是A=B赋值过去

修改B内容的时候,A内容也会随之改变

 

其原理是因为每个数组都会在内存里开辟一个内存区间,如果只是简单的A=B复制,只是把A的指针也复制给了B

所以A,B指针是共用的,B修改后,A再去读该指针内容自然就一样

这被称为浅拷贝

 

这时候使用array.concat 或 array.slice可以实现数组的深拷贝

 

如果数组里的是对象

例如 A=[{},{}]

var B=A.slice() 后,出现以下情况

B.push({})

B数组元素+1,A数组无变化

B[0].new = 1,A数组的[0]也会出现new=1

 

由此推断

数组元素里的对象也是有指针的,slice后只是数组有新指针,但是元素里的对象是指针级复制过去的

后面我又尝试过

A.forEach(e=>{

  B.push(e)

})

得到的结果一样,由此证明复制过去的对象是对象指针

 

解决方案:

最傻瓜的方式,转为json字符串让他在内存上独立,再转回数组。

B=JSON.parse(JSON.stringify(A))

 

感觉总有哪里不对,可能怀疑效率不高,就想出接下来的处理方案

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值