一、深拷贝与浅拷贝
-
什么是深拷贝
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象(新旧对象不共享同一块内存),且修改新对象不会影响原对象(深拷贝采用了在堆内存中申请新的空间来存储数据,这样每个可以避免指针悬挂) -
什么是浅拷贝
如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,那么拷贝的就是内存地址(新旧对象共享同一块内存),所以如果其中一个对象改变了这个地址,就会影响到另一个对象(只是拷贝了指针,使得两个指针指向同一个地址)
二、赋值与浅拷贝的区别
-
把一个对象赋值给一个新的变量的时候,赋的其实是该对象在栈中的地址,而不是栈中的数据。也就是这两个对象指的是同一个储存空间,不论哪个对象发生改变,其实都是改变储存空间里的内容。因此,两个对象是联动的。
-
浅拷贝是按位拷贝对象的,他会创建一个新的对象,这个对象有着原始对象属性值的一份精确拷贝。
如果属性是基本类型,拷贝的就是基本类型的值。
如果属性是内存地址(引用类型),拷贝的就是内存地址,因此如果一个对象改变了这个地址,就会影响到另一个对象。
即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。 -
赋值与浅拷贝举例
对象赋值: let obj1 = { name:'chen', age: 26, hobby:['baskitball','swim','run','eat'] } let obj2 = obj1 obj2.name = 'zi' obj2.age = 100 obj2.hobby[0] = 'play games' console.log(obj1) // {"name":"zi","age":100,"hobby":["play games","swim","run","eat"]} console.log(obj2) // {"name":"zi","age":100,"hobby":["play games","swim","run","eat"]}