深度克隆

122 阅读1分钟
function deepClone(origin, target) {   
   var target = target || {}, //没给第二个参数就给个空数组     
       toStr = Object.prototype.toString, //简化代码      
       arrStr = "[object,Array]"; //简化代码   
        for (var prop in origin) {  //for in循环开始        
             if (origin.hasOwnProperty(prop)) { //判断是不是自己的元素       
                if ((origin[prop] !== null) && (typeof (origin[prop]) == 'object')) {    
                //循环遍历对象,如果不是null且是对象的话          
                   if (toStr.call(origin[prop]) == arrStr) { //是对象的情况下判断是不是数组       
                   target[prop] = []; //是数组的话创建一个新数组                    
} else {      
                   target[prop] = {}; // 是对象的化创建一个新对象          
          }            
                   deepClone(origin[prop], target[prop]); //开始递归使用深度克隆         
       } else {          
                   target[prop] = origin[prop]; //如果不是对象就直接克隆了        
        }      
      } //判断是否是自己元素 结尾    
    }     
   return target;  //函数返回值  
  }

这样的话就不会出现浅克隆里面,对象里面有些存引用值的属性地址被两者共用的问题