`

jQuery中深浅拷贝原理分析及实现(容易看懂的)

阅读更多
//测试Chrome版本  40.0.2214.115 m

//如有错误欢迎指出

//深浅拷贝
//写过复杂的,做了各种判断的那种
//想想写个简单容易一眼看到头的
var a1={};
var a2={
	namex:"xxx",
	getName:function(){
		alert(namex);
	},
	xx:{
		namexx:"xxx",
	}
};
//一个向另一个加另一个上面没有的属性
//很简单
var copy=function(){
	//浅拷贝
	var
		name,
		target=arguments[0],
		src=arguments[1];
		for(name in src){
			if(src[name]===target[name]){
				continue;
			}
			target[name]=src[name];
		}
}
//copy(a1,a2);
//console.info(a1);//

//深拷贝
//浅拷贝代码改改

//注意两个问题
//明确谁向谁拷贝
//第二个要有返回值(return),不然返回都为 undefined
var deepCopy=function(){
	var
		name,
		target=arguments[0],
		src=arguments[1];
		//再做个判断,若是再次拷贝时,target[name]很可能为空
		if(!(typeof(target)==="object")){
			target={};
		}
		for(name in src){
			if(src[name]===target[name]){
				continue;
			}
			/*
			if( target !==null && typeof(src[name])==="object"){
				target[name]=deepCopy(target[name],src[name]);
			}else{
				target[name]=src[name];
			}
			*/
			
			if( src[name] !==null && typeof(src[name])==="object"){
				//src就是引用xx  --->target -------->  {namexx:"xxx",} 
				target[name]=deepCopy(target[name],src[name]);
				//target[name]=deepCopy(target[name]!==undefined?target[name]:{} ,src[name]);
				console.trace();
			}else if(src[name]!==undefined){
				target[name]=src[name];
			}
			//target[name]=src[name];
		}
	return target;
};
var a3={};
var a4={
	namex:"xxx",
	getName:function(){
		alert(namex);
	},
	xx:{
		namexx:"xxx",
	}
};
deepCopy(a3,a4);
console.info(a3);
a4.namex="我是谁";//深拷贝后不会再受到影响
console.info(a3);

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics