-
浅拷贝(只复制第一层)
浅拷贝有两种方法,一种是object.assign
-
深拷贝
简单的做法:JSON.parse(JSON.stringfy(obj)) 但是该方法也是有局限性的:
会忽略undefined
会忽略symbol
会忽略函数
不能解决循环引用的对象 (会报错)
对象、数组、
注意考虑:伪多维数组、数组对象
function arrDeepCopy(source){
if(source instanceof Array){
var copy=[];
for(var item in source){
copy=typeof source[item]==='Object'? arrDeepCopy(source[item]):source[item];
}
return copy;
}
else if(source instanceof Object){
var copy={};
for(var item in source){
copy=typeof source[item]==='Object'? arrDeepCopy(source[item]):source[item];
}
return copy;
}
}
今天偶尔看到了另一种简洁以及考虑更全面的写法,我用了es6实现,上面的部分当时图省事用的es5语法,如何转es6就不转了,相信看到这篇博客的人应该不会再这方面有问题:
let DeepCopy=(origin,target)=>{
target=target||{}
for(let prop in origin){
if(origin.hasOwnProperty(prop)){//是原型链上的
if(typeof(origin[prop])==='Object'&&origin[prop]){//是对象注意typeof(null)返回object
//先判断是不是数组
if(origin[prop] instanceof Array){
target[prop]=[];
DeepCopy(origin[prop],target[prop])
}else{
target[prop]={}
DeepCopy(origin[prop],target[prop])
}
}
else{
target[prop]=origin[prop]
}
}
}
return target;
}