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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值