---深拷贝和浅拷贝
主题使用方法:github.com/xitu/juejin…
theme: juejin highlight: juejin
`
根本原因在于,基本数据类型:String Symbol null ,undefine,boolean 等保存在栈内存之中,
引用数据类型:Object(function ,array,RegExp,Date) 保存在堆内存之中
js对引用数据类型都是操作的对象的引用,而不是操作实际的对象,如果,obj1拷贝了obj2,那么这
两份引用的数据类型都指向了同一个堆内存地址,具体操作就是及那个obj1的栈内存地址拷贝复制了一份给了obj2
引申的一个问题就是:为什么基本数据类型保存在栈中,而引用类型保存在堆中呢
1.堆比栈大,栈比堆速度块
2.基本数据类型比较稳定,而且相对来说占用的内存小
3.引用的数据大小是动态的,而且是无限的,引用值的大小会改变,不能放在栈中,否则会降低变量的查找速度,先先进后出,因此放在变量的栈空间的的值是该对象的存储的堆的地址,地址的大小是固定的,所以把它存储在栈堆性能无任何负面影响
4.堆内存是无需存储,可以直接根据引用直接获取
所有函数的参数都是按值来传递的,对于原始值,只有把变量里的值传递给参数,之后参数个这个变量互不影响 null类型会返回object,因此null值便是一个空对象指针
深拷贝与浅拷贝
浅拷贝和深拷贝都针对引用数据类型,先拷贝只赋值指向某个对象的指针,而不是赋值对象本身,新旧对象共享同一块内粗,但深拷贝会另外创造一个一摸一样的对象,修改新对象不会改到原对象
深拷贝方法
func deepClone(obj){
var obj2=Array.isArray(obj1)?[]:{};
if(obj1 &&typeof obj1==="objext"){
for(let i in obj1){
if(obj1[i]&&&typeof obj[i]==='object'){
obj2[i]=deepclone(obj1[i])
}else {
obj2[i]=obj[i]
}
}
}
}
`