深拷贝和浅拷贝

152 阅读2分钟

---深拷贝和浅拷贝

主题使用方法: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]
	  }
    }
  }
}

`