对象引用(浅克隆和深克隆)

一、s中的数据类型

  1. Js中数据类型分为两大类:(1)基本数据类型:数值、字符串、布尔值、nullundefined2)复杂数据类型:对象

二、克隆的概念:

   浅度克隆:基本数据类型为值传递,对象类型为引用传递

   深度克隆:所有属性和方法均完全复制,与原对象完全脱离,也就是说对于新对象的任何修改都不会反映到元对象中。


三.浅克隆的表现:

1.基本数据类型:

     	var a="a";
	var b=a;
	b="b";
	console.log(a); //a
	console.log(b);//b

2.复杂数据类型:

1)函数的克隆

  函数也是对象,但是函数的克隆通过浅克隆就可以实现

   	var a=function(){alert(1);};
	var b=a;
	b=function(){alert(2);};
	console.log(a);  //function(){alert(1);}
	console.log(b);	 //function(){alert(2);}

通过普通的负值方式,就是想了函数的克隆,并且不会影响之前的对象。原因就是函数的克隆会在内存中单独开辟一块空间,互不影响。

2)普通的对象


	var oPerson={
		oName:"石倩蓉",
		oAge:"18",
		oAddress:{
			province:"beijing"
		},
		ofavorite:[
			"swimming",
			{reading:"history"}
		]
	}
	function clone(obj){
		var result={};
		for(var key in obj){
			result[key]=obj[key];
		}
		return result;
	}
	var student=clone(oPerson);
	console.log(oPerson.oAddress.province);   //”beijing”
	student.oAddress.province="shanghai";
	console.log(oPerson.oAddress.province);   //”shanghai”

四.深度克隆实现

      为了保证对象的所有属性都被复制到,我们必须知道如果for循环以后,得到的元素仍是Object或者Array,那么需要再次循环,直到元素是原始类型或者函数为止。为了得到元素的类型

		/*----------------------------数据类型的判断--------------------------------*/
		function isClass(obj){
			if(obj===null) return "null";
			if(obj===undefined) return "undefined";
			return Object.prototype.toString.call(obj).slice(8,-1);
		}
		/*------------------------------------------------------------*/
		function deepClone(o){
			var result;
			var oClass=isClass(o);
			if(oClass=="Object"){
				result={};
			}else if(oClass=="Array"){
				result=[];
			}else{
				return o;
			}
			for(var key in o){
				result[key]=arguments.callee(copy); //递归调用
			}
			return result;
		}
		/*------------------------------------------------------------*/
		var oPerson={
			oName:"shiqianrong",
			oAge:"24",
			oAddress:{
				province:"shanxi"
			},
			oFavoriate:[
				"swimming",
				{reading:"history book"}
			]
		}
		/*------------------------------------------------------------*/
		var student=deepClone(oPerson);
		console.log(oPerson.oAddress.province);
		student.oAddress.province="shanghai";
		console.log(oPerson.oAddress.province);














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值