
正文
js数组中带对象深拷贝,js数组深拷贝和浅拷贝
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JS传值和传址问题(JS深拷贝)
1、处理这个问题涉及到JS中的深拷贝,JS的深拷贝会为新的变量重新申请一个新的地址块,不会指向原变量的地址,如何实现深拷贝,以下提供了两种方法。
2、浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。
3、js中储存对象都是存引用地址,所以浅拷贝会导致两个变量指向同一块内存地址。数组的赋值其实相当于给了索引,改变其中一个变量其他的引用其他都会改变。
4、深拷贝和浅拷贝深拷贝和浅拷贝的示意图大致如下:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
5、传值:实际复制的是值,存在两个不同的、独立的拷贝;传址:复制的只是对值的引用。如果通过这个新的引用修改了值,则这个改变对最初的引用来说也可见。
6、基本数据类型,拷贝是直接拷贝变量的值,而引用类型拷贝的其实是变量的地址。
相关问答
Q1: 用递归解决对象的深拷贝问题
深拷贝会另外拷贝一份一个一模一样的对象,从堆内存中开辟一个新的区域存放新对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
Object.assign()拷贝是浅拷贝,它拷贝的是属性值,假如源对象的属性值是一个对象obj,那么拷贝的则是这个对象值的指针(也就是地址);这个时候修改obj的值,则目标对象会受到影响。想要避免这种影响我们需要对对象进行深拷贝。
`copy()`函数可以进行浅复制,即复制对象的属性引用,而`deepcopy()`函数可以进行深复制,即递归复制对象的属性。
也就是说,如果对象的属性值为 简单类型 (如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;如果属性值为 对象或其它引用类型 ,那对于这个对象而言其实是浅拷贝的。
尝试进行深复制可能会导致无限递归,从而导致程序崩溃。因此,在使用深拷贝时,必须小心处理包含循环引用的对象。在使用深拷贝时,如果对象的层次结构比较复杂,可能会导致性能问题,因此必须小心使用深拷贝。
Q2: js数组赋值,不修改原数组,注意区分深、浅拷贝!踩坑!
1、js中储存对象都是存引用地址,所以浅拷贝会导致两个变量指向同一块内存地址。数组的赋值其实相当于给了索引,改变其中一个变量其他的引用其他都会改变。
2、js数组是引用类型的值,我们直接将原数组赋值给新的变量,由于指针指向同一个内存地址,修改数组,原数组也会被修改。如果不想原数组被修改,可以采用以下方法:此时,再修改copyList的值,不会影响list的值。
3、浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。
4、这时,发现只单独push元素到gloalarr中,原数组arr 也发生了改变。
5、但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
6、浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。
关于js数组中带对象深拷贝和js数组深拷贝和浅拷贝的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








