JavaScript的浅拷贝和深拷贝
浅拷贝
:浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响。深拷贝
:在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,以保证深拷贝的对象的引用不包含任何原有对象或对象上任何对象,拷贝后的对象与原来的对象完全隔离,互不影响。
浅拷贝
和深拷贝
是针对变量类型为引用类型
来说的。其实质区别是是否真正的获取到要复制对象的实体。
javascript中的变量分为基本类型
和引用类型
,基本类型就是保存在栈内存
中的简单数据段,引用类型指的是那些保存在堆内存
中的对象。
栈内存
:存放基本类型。堆内存
:存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个存放在堆内存中的对象)
- 基本类型:undefined、null、boolean、number和string。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过
按值来访问
。 - 引用类型:值的大小不固定,栈内存中存放的是地址来指向堆内存中的对象。是
按引用访问的
。栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把他们保存到栈内存中,但由于内存地址大小是固定的,因此可以将内存地址保存到栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过内存地址找到堆内存中的值。对于这种,我们叫做按引用访问
。 - 基本类型在当前执行环境结束时销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时,这个对象才被垃圾回收机制回收。
一般来说深拷贝通过递归或循环来实现:资料参考
1 | var json1={"name":"鹏哥","age":18,"arr1":[1,2,3,4,5],"string":'afasfsafa',"arr2":[1,2,3,4,5],"arr3":[{"name1":"李鹏"},{"job":"前端开发"}]}; |