基本类型:Boolean
、Null
、Undefined
、Number
、String
、Symbol
引用类型:Object
、Array
、Function
(深拷贝和浅拷贝)
一维数组的深拷贝
slice()
、concat()
、Array.from()
一维对象的深拷贝
Object.assign()
没有undefined
、函数
以及symbol
值的对象深拷贝
JSON.parse(JSON.stringify(obj))
递归拷贝
第三方库:
JQuery
的$.extend
lodash
的_.cloneDeep
原生js:
function deepCopy(obj,parent=null){
//创建一个新对象
let result = {};
let keys = Object.keys(obj);
let key = null;
let temp = null;
let _parent = parent;
//该字段有父级则需要追溯该字段的父级
while(_parent){
//如果该字段引用了它的父级则为循环引用
if(_parent.originalParent === obj){
//循环引用直接返回同级的新对象
return _parent.currentParent;
}
_parent = _parent.parent;
}
for(let i=0;i<keys.length;i++){
key = keys[i];
temp = obj[key];
//如果字段的值也是一个对象
if(temp && typeof temp === 'object'){
//递归执行深拷贝 将同级的待拷贝对象与新对象传递给parent方便追溯循环引用
result[key] = deepCopy(temp,{
originalParent:obj,
currentParent:result,
parent:parent
});
} else {
result[key] = temp;
}
}
return result;
}
var obj1 = {
x:1,
y:2
};
obj1.z = obj1;
let obj2 = deepCopy(obj1);
console.log(obj1);
console.log(obj2);