浅拷贝
1、简单实现
for(let prop in obj){ obj2[prop] = obj[prop]; }
2、assign
Object.assign(obj2,obj);
3、拓展运算符
obj2 = {obj};
4、
let tmp = JSON.stringify(obj); obj2 = JSON.parse(tmp);
深拷贝
1、
function deepClone(origin){ let target = origin.constructor === Array? []:{};//判断复制源为什么类型 for(let prop in origin){ if(origin.hasOwnProperty(prop)){//是否为原型链上的属性 if(typeof origin[prop] == "object"){//判断是否为基本数据类型 origin[prop].constructor === Array ? target[prop] = []:target[prop] = {}; target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身 }else{ target[prop] = origin[prop];//正常复制 } } } return target; } obj2 = deepClone(obj);
2、
function deepClone(origin){ let toStr = Object.prototype.toString;//保存函数引用 let arrayStr = "[object Array]"; //储存调用函数判断为数组时返回的值 let target = toStr.call(origin) == arrayStr? []:{};//判断复制源为什么类型 for(let prop in origin){ if(origin.hasOwnProperty(prop)){//是否为原型链上的属性 if(typeof origin[prop] == "object"){//判断是否为基本数据类型 toStr.call(origin[prop]) == arrayStr ? target[prop] = []:target[prop] = {}; target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身 }else{ target[prop] = origin[prop];//正常复制 } } } return target; } obj2 = deepClone(obj);
3、jq $.extend(true,{},{})