深拷贝与浅拷贝
介绍深浅拷贝之前,我们要先说一下,堆栈以及JavaScript的数据类型。
堆栈的描述:
- 栈:栈中存放的是变量名,地址(指针);
- 堆:堆中数据,值
基本数据类型存在栈中,引用类型存在堆中(存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆中),如果是基本数据类型,则按值访问,操作的就是变量保存的值(栈中);如果是引用类型的值,我们只是通过保存在变量中的引用类型的地址来操作实际的值(堆中);
JavaScript的数据类型可以分为两种:
- 基本数据类型:基本数据类型是值传递类型,有数值、字符串、布尔型、null,undefined等;特点:地址就是值,值就是地址
- 复杂类型:复杂类型是引用传递类型,有对象,数组。特点:地址是地址,值是值,拷贝时,默认拷贝的是地址
下面进入正题之深浅拷贝:
- 浅拷贝: 浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存;
- 深拷贝: 深拷贝就是能够实现真正意义上的数组和对象的拷贝。递归调用"浅拷贝"。(深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象)
浅拷贝只复制指向某个对象的地址(指针),而不复制对象本身的实际值,新旧对象的值还是共存于同一块内存。但深拷贝可以重新创造一个一模一样的新对象,新对象跟原对象的值不会共存于同一块内存,修改新对象的值就不会改到原对象的值了
深拷贝的方法:
1.遍历获取对象值(数组值)
2.利用json的转换为字符
3.使用js提供的方法Object.create()