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

猜你喜欢

转载自blog.csdn.net/weixin_43931898/article/details/103084337
今日推荐