首页 > 其他 > 详细

深拷贝 浅拷贝实现

时间:2019-12-28 22:06:54      阅读:104      评论:0      收藏:0      [点我收藏+]

深拷贝实现的方法

1.通过递归去赋值所有层级属性

技术分享图片

function deepClone(obj){
  let objClone = Array.isArray(obj)?[]:{};
  if(obj && typeof obj==="object"){
      for(key in obj){
          if(obj.hasOwnProperty(key)){
              //判断ojb子元素是否为对象,如果是,递归复制
              if(obj[key]&&typeof obj[key] ==="object"){
                  objClone[key] = deepClone(obj[key]);
              }else{
                  //如果不是,简单复制
                  objClone[key] = obj[key];
              }
          }
      }
  }
  return objClone;
}    
let a=[1,2,3,4],
  b=deepClone(a);
a[0]=2;
console.log(a,b);

技术分享图片

2.通过借用JSON的parse和stringify方法

function deepClone(obj){
  let _obj = JSON.stringify(obj),
      objClone = JSON.parse(_obj);
  return objClone
}    

3.通过JQuery的$.extend方法

$.extend( [deep ], target, object1 [, objectN ] )

CSDN 递归拷贝

var obj = {   //原数据,包含字符串、对象、函数、数组等不同的类型
      name:"test",
      main:{
          a:1,
          b:2
      },
      fn:function(){
         
      }
       friends:[1,2,3,[22,33]]
  }
?
  function copy(obj){
       let newobj = null;   //声明一个变量用来储存拷贝之后的内容
       
    //判断数据类型是否是复杂类型,如果是则调用自己,再次循环,如果不是,直接赋值即可,
    //由于null不可以循环但类型又是object,所以这个需要对null进行判断
       if(typeof(obj) == ‘object‘ && obj !== null){
       
//声明一个变量用以储存拷贝出来的值,根据参数的具体数据类型声明不同的类型来储存
           newobj = obj instanceof Array? [] : {};  
           
//循环obj 中的每一项,如果里面还有复杂数据类型,则直接利用递归再次调用copy函数
           for(var i in obj){  
               newobj[i] = copy(obj[i])
          }
      }else{
           newobj = obj
      }    
     return newobj;    //函数必须有返回值,否则结构为undefined
  }
?
   var obj2 = copy(obj)
   obj2.name = ‘修改成功‘
   obj2.main.a = 100
  console.log(obj,obj2)
?

 

深拷贝 浅拷贝实现

原文:https://www.cnblogs.com/jiangyuhang/p/12112973.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!