一、JSON序列化与反序列化
let obj = {
a:1,
b:[1,2,3],
c:{
name:"Asia"
}
}
let obj2 = JSON.parse(JSON.stringify(obj));
console.log(obj);
console.log(obj2);
缺点:
- 克隆出来的对象的构造函数会指向Object,原型链关系断裂
- 无法实现对函数、regExp等特殊对象的克隆
- 在存在循环引用的时候会抛出异常
二、自定义深克隆
1、
// 检查类型 let checkType = data => { return Object.prototype.toString.call(data).slice(8, -1) } let deepClone = target => { let targetType = checkType(target) let result if (targetType === 'Object') { result = {} } else if (targetType === 'Array') { result = [] } else { return target } for (let i in target) { let value = target[i] let valueType = checkType(value) if (valueType === 'Object' || valueType === 'Array') { result[i] = deepClone(value) // 递归 } else { result[i] = value } } return result }
2、
let obj = {
a:11,
b:[1,2,3],
c:{
name:'Asia',
d:{
id:123
}
},
fn:function(){
return 123;
}
}
function deepClone(obj,obj2){
for(let key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] == "object"){
obj2[key] = Array.isArray(obj[key]) ? [] : {};
deepClone(obj[key],obj2[key]);
}else{
obj2[key] = obj[key];
}
}
}
}
let obj2 = {};
deepClone(obj,obj2);
console.log(obj);
console.log(obj2);