javaScript实现浅拷贝深拷贝

一.浅拷贝深拷贝和赋值的区别

赋值:和原数据指向同一对象,没有开辟新的内存空间,新拷贝的数据改变会使原数据也跟着改变;
浅拷贝:和原数据指向不同对象,给对象第一层数据开辟了新的内存空间,改变拷贝后的值不会使第一层原数据发生改变,但会使原数据包含的子对象发生改变 ;
深拷贝:给原数据所有子对象都开辟新的内存空间。

实现浅拷贝代码

var a = {
 name: '我是a'
};      
 
function simpleCopy(obj) {
   var newObj = {};
   for (let i in obj) {               
      newObj[i] = obj[i]            
   }            
     return newObj        
  }        
  var b = simpleCopy(a);
  b.name='我是b'
  console.log(a.name);//我是a
  console.log(b.name);//我是b

用递归实现深拷贝

var obj = {            
	   name: '王哈哈',
            age: 18,
            score: [10, 20, 30]       
             };        
  var o = {}
  //封装函数利用递归实现深拷贝        
  function deepCopy(newObj, oldObj) {            
    for (var i in oldObj) {                
      var item = oldObj[i]; //获取属性值oldObj[i]                
        if (item instanceof Array) { //判断这个值是否属于数组
          newObj[i] = []                    
          deepCopy(newObj[i], item)               
       	} else if (item instanceof Object) { //判断是否为对象型     
       	  newObj[i] = {};                    
	  deepCopy(newObj[i], item)                
	} else { //为简单数据类型                    
	newObj[i] = item;                
	}            	   
     }        
  }         
 deepCopy(o, obj)       
       
 o.score[1] = 100        
 console.log(o.score);//[10,100,30]        
 console.log(obj.score);//[10,20,30]

JSON实现深拷贝

 function jsonCopy(oldObj) {            
   obj = JSON.stringify(oldObj);            
   let newObj = JSON.parse(obj);           
   return newObj;        
  }         
  let a = [1, 2, 3, 4];       
  b = jsonCopy(a);       
  b[0] = 2;       
  console.log(a, b);//[1,2,3,4],[2,2,3,4]

不足:适用于数组的深拷贝,无法拷贝对象中原型链的方法属性和函数,当数据的层次很深,栈会溢出。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页