function deepClone(origin,target){ //target是否存在若是不存在建立空对象 let tar = target || {}, //判断是否为引用数据类型 toStr = Object.prototype.toString, arrType='[object Array]'; for(let key in origin){ //剥离原型链的数据 if(origin.hasOwnProperty(key)){ //判断是否为引用数据类型 对象或数组 if(typeof(origin[key]) === 'object' && origin[key] !== null){ if(toStr.call(origin[key]) === arrType ){ tar[key] = []; }else{ tar[key] = {}; } deepClone(origin[key],tar[key]); }else{ tar[key] = origin[key]; } } } return tar; }
2.数组
/** * 辅助函数, 断定是不是对象 * @param obj * @returns {boolean} */ function isObj(obj) { return obj instanceof Object; } /** * 深拷贝fromObj面的全部属性/值, 到toObj对象里面 * @param fromObj 拷贝对象 * @param toObj 目标对象 */ function deepCopyObj2NewObj(fromObj, toObj) { for (var key in fromObj) { if(fromObj.hasOwnProperty(key)){ var fromValue = fromObj[key]; // 若是是值类型,那么就直接拷贝赋值 if (!isObj(fromValue)) { toObj[key] = fromValue; } else { // 若是是引用类型,那么就再调用一次这个方法, // 去内部拷贝这个对象的全部属性 // fromValue是什么类型, 建立一个该类型的空对象 var tmpObj = new fromValue.constructor; // console.log(tmpObj); // debugger; deepCopyObj2NewObj(fromValue, tmpObj); toObj[key] = tmpObj; } } } }