简要介绍: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属性来实现