1.JavaScript递归实现对象深拷贝
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;
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。