浅拷贝:
function shallowCopy(obj){
if(typeof obj!=='function'&& obj!==null){
let cloneObj=Array.isArray(obj)?[]:{}
for(let prop in obj){
if(obj.hasOwnProperty(prop)){
cloneObj[prop]=obj[prop]
}
}
return cloneObj
}
else{
return obj
}
}
深拷贝:
JSON.stringfy(JSON.parse())
上面的方法不能解决循环引用,也不能显示函数或undefined
手写深拷贝
[
关于WeakMap
](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。
WeakMap.prototype.get(key)
返回key关联对象, 或者 undefined(没有key关联对象时)
WeakMap.prototype.set(key, value)
在WeakMap中设置一组key关联对象,返回这个 WeakMap对象。
var deepClone=(obj,map=new WeakMap())=>{
if(map.get(obj)){
return obj
}
let newObj;
if(typeof obj==='object'&& obj!==null){
map.set(obj,true)
newObj=Array.isArray(obj)?[]:{};
for(let item in obj){
if(obj.hasOwnProperty(item)){
newObj[item]=deepClone(obj[item])
}
}
return newObj;
}
else {
return obj;
}
};