深浅拷贝封装

  1. 浅拷贝(只复制第一层)

    浅拷贝有两种方法,一种是object.assign

  2. 深拷贝

简单的做法: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;
}

你可能感兴趣的:(前端技术,javascript编程)