1、Es5的实现方式
var obj = {
name: "张三",
age: 34,
info: {
hobby: ["足球", "篮球","乒乓球"]
}
}
function deepClone( resource ){
let target;
let type = Object.prototype.toString.call(resource).slice(8,-1);
if( typeof resource == "object" ){
target = type === "Array" ? [] : {};
for( let key in resource ){
if( resource.hasOwnProperty( key)){
if( typeof resource[key] =="object"){
target[key] = deepClone( resource[key] )
}else{
target[key] = resource[key];
}
}
}
}else{
target = resource;
}
return target;
}
var newObj = deepClone(obj)
newObj.info.hobby[0] = "台球";
console.log(obj,newObj)
2、Es6的实现方式
function deepClone(origin, hashMap = new WeakMap()) {
if ((origin == undefined) || (typeof origin !== "object")) {
return origin
};
const hashKey = hashMap.get(origin);
if (hashKey) return hashKey;
const target = new origin.constructor();
hashMap.set(origin, target);
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
target[k] = deepClone(origin[k], hashMap);
}
}
return target;
}
var obj1 = {};
var obj2 = {};
obj2.obj1 = obj1;
obj1.obj2 = obj2;
deepClone(obj2)