js实现对象深拷贝

js实现对象深拷贝方法一

//js实现对象深拷贝方法一
//initalObj原始对象  finalObj拷贝对象
	function deepClone(initalObj,finalObj){
		var obj = finalObj || {};
		for(var i in initalObj) {
			// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
			var prop = initalObj[i];
			if(prop === obj){
				continue;
			}
			if(typeof prop === 'object'){
			//如果数据类型是引用类型
				obj[i] = (prop.constructor === Array)?[]:{};
				//递归
				arguments.callee(prop,obj[i]);
			}else{
			//如果数据类型是基本类型
				obj[i] = prop;
			}
		}
		return obj;
	}
	var str = {};
	var obj = {a:{a:'hello',b:21}};
	deepClone(obj,str);
	console.log(str.a); //{a: "hello", b: 21}
	str.a.b = 22;
	console.log(str.a.b); //22
	console.log(obj.a.b); //21

js实现对象深拷贝方法二

//js实现对象深拷贝方法二
	function deepClone2(obj){
		//判断数据类型是否为引用类型
		if(!obj || !(obj instanceof Object) || (typeof obj =="function")){
			return obj || undefined;
		}
		var constructor = obj.constructor;
		var newobj = new constructor();
		for(var key in obj) {
			if(obj.hasOwnProperty(key)) {
				newobj[key] = deepClone2(obj[key]);//递归
			}
		}
		return newobj;
	}
	
	var father = {
		a:'a',
		b:{
			a:'ba',
			b:123
		},
		c:function(){alert("c");},
		e:undefined
	}
	var child = deepClone2(father);
	console.log(child); //{a: "a", b: {a:'ba',b:123}, c: ƒ(){alert("c");}, e: undefined}
	child.b.b = 345;
	console.log(child.b.b); //345
	console.log(father.b.b); //123

js实现对象深拷贝方法三

//直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果
	function deepClone3(initalObj,finalObj){
		var obj = finalObj || {};
		for(var i in initalObj){
			// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
			var prop = initalObj[i];
			if(prop === obj){
				continue;
			}
			//如果数据类型是引用类型
			if(typeof prop ==='object'){
				obj[i] = (prop.constructor === Array) ? []:Object.create(prop);
			}else{
			//如果数据类型是基本类型
				obj[i] = prop;
			}
		}
		return obj;
	}
	
	var obj1 = {
		a:'a',
		b:{
			a:'ba1',
			b:111
		},
		c:function(){alert("c")},
		d:undefined
	}
	
	var newobj1 = {};
	deepClone3(obj1,newobj1);
	console.log(newobj1);//{a: "a", b: {a:'ba1',b:111}, c: ƒ(){alert("c");}, e: undefined}
	newobj1.b.b = 666;
	console.log(newobj1.b.b); //666
	console.log(obj1.b.b); //111
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值