本文目录
js对象深拷贝的最好的方法
1、首先可以通过Object.assign来解决这个问题,很多人认为这个函数是用来深拷贝的。其实并不是,Object.assign只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,所以并不是深拷贝。
2、还可以通过展开运算符...来实现浅拷贝
let a = {age: 1}
let b = { ...a }
a.age = 2
console.log(b.age) // 1
前端 深拷贝和浅拷贝的异同点
浅拷贝:浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响
深拷贝:在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,以保证深拷贝的对象的引用图不包含任何原有对象或对象图上的任何对象,拷贝后的对象与原来的对象是完全隔离,互不影响
什么是深拷贝和浅拷贝python
浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。
深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于Javascript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。
而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
浅拷贝和深拷贝的区别
一.深拷贝
源对象和副本对象是不一样的两个对象。
源对象引用计数不变,副本对象计数器为1(因为是新产生的)。
至少有一层是对象复制。
二.浅拷贝
源对象和副本对象是同样的对象。
源对象(副本对象)引入计数器+1,等同于做一次retain的操作。
本质:没有生产新的对象。
从整体上来讲,深拷贝和浅拷贝的不同地方主要还是在于指针(或与指针)方面,浅拷贝仅仅是简易的将源对象(这里是指广义的对象,不只是单指类的实例)的指针赋值给目标对象,对目标指针的操作就是对源对象的操作,因此在大部分情况下,目标对象析构(或跳出其可见域)之后,源对象相关部分也就一同析构了。而深拷贝,是为目标对象重新分配空间,这样就能够和源对象的操作区分。
以上就是关于js深拷贝与浅拷贝 ,js对象深拷贝的最好的方法的全部内容,以及js深拷贝与浅拷贝 的相关内容,希望能够帮到您。