深拷贝

172 阅读1分钟

深拷贝的三种实现方式分别是:

1、递归递归去复制所有层级属性

deepClone(obj) { 
      let objClone = Array.isArray(obj) ? [] : {}    
      if (obj && typeof obj === 'object') {        
        for (let key in obj) {            
          if (obj.hasOwnProperty(key)) { // 判断ojb子元素是否为对象,如果是,递归复制
                  if (obj[key] && typeof obj[key] === 'object') {
                      objClone[key] = this.deepClone(obj[key])
                  } else { // 如果不是,简单复制
                      objClone[key] = obj[key]
                  }
              }
          }
      } return objClone
    }   

2、除了递归,我们还可以借用JSON对象的parse和stringify

function deepClone(obj){
     let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
        return objClone
    }   
        let a=[0,1,[2,3],4],
          b=deepClone(a);
          a[0]=1;
          a[2][0]=1;
          console.log(a,b);

3、借用JQ的extend方法

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

deep表示是否深拷贝,为true为深拷贝,为false则为浅拷贝

target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。

object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。

    let a=[0,1,[2,3],4],
      b=$.extend(true,[],a);
      a[0]=1;
      a[2][0]=1;
      console.log(a,b);