js中对象深度克隆,以及ES6中的深度克隆的实现

简要介绍:js中的对象的赋值,其实是实现了对象的引用,在赋值对象上修改属性会影响到原来的对象。

–ES5中我们可以通过递归函数来实现深层次的克隆。
–ES6中我们可以通过Object.assign的方式来实现深度克隆。

1.javascript(ES5)中对象的克隆

function deepClone(obj){
    var newObj= obj instanceof Array?[]:{};
    for(var i in obj){
       newObj[i]=typeof obj[i]=='object'?  
       deepClone(obj[i]):obj[i];    
    }
    return newObj;
}

缺点:不能实现包装类型比如通过new String()或者new Number()创建的对象的深度克隆

2.ES6下的对象深度克隆

(1)通过Object.assigin实现

const deepClone=(obj)=>{
   var proto=Object.getPrototypeOf(obj);
   return Object.assign({},Object.create(proto),obj);
}

通过Object.getPrototypeOf函数得到obj被克隆函数的原型上的属性,然后通过Object.assign实现深度克隆。

(2)通过proto来实现(仅适合浏览器端)

const deepClone=(obj)=>({

  __proto__: Object.getPrototypeOf(obj),
  ...obj
})

通过扩展运算符…和proto属性来实现

你可能感兴趣的:(ES6)