//深拷贝方法
function deepCopy(source) {
//判断当前传参是引用类型还是基本类型
//基本类型直接返回
if(typeof source != 'object'){
return source
}
//引用类型按情况处理
let type = Object.prototype.toString.call(source).slice(8,-1);
switch (type) {
case 'Null':
return source;
case 'Date':
return new Date(source);
case 'Function':
return source;
case 'Array':
return copyArray(source);
case 'Object':
return copyObject(source);
default:
return source
}
}
//处理Array类型深拷贝
function copyArray(source) {
let list = new Array();
for(let item of source){
list.push(deepCopy(item));
}
return list;
}
//处理Object类型深拷贝
function copyObject(source) {
let obj = new Object();
for(let key in source){
if(source.hasOwnProperty(key)){
//处理对象本身的属性
//只处理当前一层
obj[key] = deepCopy(source[key]);
}
}
return obj;
}
const sourceObj = {
name : 'test',
value : 10,
able : true,
num : null,
text : undefined,
obj : {
a : 1,
b : '2',
c : {
d : 3,
f : [1, 2, 3, 4, 5]
}
},
list : [ 1, '2', null, undefined, {g:1,h:'XX'} ],
fun : function () {return 4},
date : new Date()
};
const targetObj = deepCopy(sourceObj);
targetObj.list[4].h = 'PP';
targetObj.obj.c.f[1] = 6;
targetObj.fun = function(){return 5};
console.log(targetObj);
console.log(targetObj.list[4].h);
console.log(sourceObj.list[4].h);
console.log(targetObj.obj.c.f);
console.log(sourceObj.obj.c.f);
console.log(targetObj.fun())
console.log(sourceObj.fun())