js数组浅拷贝和深拷贝demo

数组和对象一样,是引用数据类型
在这里插入图片描述
因为指向同一块栈区域,所以当修改arr2时,arr1数组也会发生变化,上图代码在控制台输出结果为:
在这里插入图片描述
解决方法:
数组浅拷贝,可以用concat、slice方法返回一个新数组的特性来实现拷贝
在这里插入图片描述
控制台输出结果为:
在这里插入图片描述
可以看到,arr1数组不会因arr2数组改变而改变。


对象深拷贝:obj2 = JSON.parse(JSON.stringify(obj1)) 可实现对象深拷贝


浅拷贝方法只适用于数组元素是基本类型,如果数组中有对象或者数组,需要进行深拷贝,下面是深拷贝一个通用方法,实现思路:拷贝的时候判断属性值的类型,如果是对象,继续递归调用深拷贝函数。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200327145441897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1Mzk4ODQ4,size_16,color_FFFFFF,t_70
控制台输出结果为:
在这里插入图片描述
可以看到,arr1修改数组中对象的值,arr2并没有随之改变,问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深拷贝浅拷贝都是复制一个对象,区别在于复制后的对象与原对象是否共享同一内存地址。深拷贝会复制出一个新的对象,与原对象不共享内存地址,而浅拷贝只是复制了一个指向原对象的引用,两个对象共享同一内存地址。 以下是深拷贝浅拷贝的示例代码: ```javascript // 浅拷贝示例 let obj1 = { name: 'Alice', age: 20, skills: ['JavaScript', 'Vue', 'React'] } let obj2 = Object.assign({}, obj1) // 使用 Object.assign() 方法进行浅拷贝 obj2.age = 21 // 修改 obj2 的 age 属性 obj2.skills.push('Angular') // 修改 obj2 的 skills 属性 console.log(obj1) // { name: 'Alice', age: 20, skills: [ 'JavaScript', 'Vue', 'React', 'Angular' ] } console.log(obj2) // { name: 'Alice', age: 21, skills: [ 'JavaScript', 'Vue', 'React', 'Angular' ] } // 可以看到,修改了 obj2 的属性后,obj1 的 skills 属性也被修改了,这是因为浅拷贝只是复制了一个指向原对象的引用,两个对象共享同一内存地址。 // 深拷贝示例 let obj3 = { name: 'Alice', age: 20, skills: ['JavaScript', 'Vue', 'React'] } let obj4 = JSON.parse(JSON.stringify(obj3)) // 使用 JSON.parse() 和 JSON.stringify() 方法进行深拷贝 obj4.age = 21 // 修改 obj4 的 age 属性 obj4.skills.push('Angular') // 修改 obj4 的 skills 属性 console.log(obj3) // { name: 'Alice', age: 20, skills: [ 'JavaScript', 'Vue', 'React' ] } console.log(obj4) // { name: 'Alice', age: 21, skills: [ 'JavaScript', 'Vue', 'React', 'Angular' ] } // 可以看到,修改了 obj4 的属性后,obj3 的属性没有被修改,这是因为深拷贝会复制出一个新的对象,与原对象不共享内存地址。 ``` 需要注意的是,深拷贝虽然可以解决浅拷贝的问题,但是由于深拷贝会递归地复制对象的所有属性,所以可能会导致性能问题,特别是在处理大型复杂对象时。因此,需要根据具体情况选择合适的拷贝方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值