对象、数组的深拷贝和浅拷贝
JavaScript的数据类型分为基本数据类型和引用类型。二者在内存中存放的方式不同,导致了其赋值时差异。
基本类型值
基本类型值指的是存储在栈中的一些简单的数据段,在JavaScript中基本数据类型有String,Number,Undefined,Null,Boolean。
基本类型是按值访问的,从一个变量复制基本类型的值到另一个变量后这两个完全独立的,即使一个变量改变了也不会影响到第二个变量。
引用类型值
引用类型值是引用类型的实例,它是保存在堆内存中的一个对象,引用类型是一种数据结构,最常用的是Object,Array,Function类型。
浅拷贝:
基本数据类型赋值时,给的是实实在在的数据值 ,赋值后二者只是值一样而已,不会相互影响; 而引用类型,给的是原数据的引用地址,所以新旧数据会互相影响,因为本质上还是同一个数据对象,浅拷贝就是基于表面的拷贝方式;当属性值为对象类型时,只拷贝了对象数据的引用地址,导致新旧数据没有完全分离,还会互相影响。
深拷贝:
深拷贝就是 ‘完全’拷贝,也就是两个不一样的引用地址,拷贝之后新旧数据完全分离,不再共用对象类型的属性值,不会互相影响。
实现方式:
JSON.parse(JSON.stringify(Obj)) 不能深拷贝属性值是函数的对象。
Object.assign({},obj1,obj2...) 注意前边是一个空对象。
总结
要理解造成浅拷贝的原因:对象类型数据复制时,复制了引用地址,用的还是同一个数据对象;所以实现深拷贝的方式就是要对 对象类型属性值递归进行深拷贝,避免直接赋值。