• javascript---对象和函数的引用、浅拷贝、深拷贝、递归


    1、javascript 对象和函数的引用

    <!doctype html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>javascript 对象和函数的引用、浅拷贝、深拷贝、递归</title>
    	<script type="text/javascript">
    		//对象和函数都是对象引用的关系,a和b公用一个地址
    		//所以当b改变也会影响a
    		var a=[1,2,3];
    		var b=a;//同一个引用
    		b.push(4);
    		alert(b);//1 2 3 4 
    		alert(a);//1 2 3 4 对象的引用
    
    
    		var a=[1,2,3];
    		var b=a;
    		b=[1,2,3,4];//b又又一次的占用了一个新地址。与之前的进行脱离了,一个新的空间
    		alert(b);//1 2 3 4
    		alert(a);// 1 2 3没有引用到
    
    
    		var obj={
    			a:10
    		}
    		var obj2=obj;
    			obj2.a=20;
    		alert(obj.a);//20 影响到了之前的对象
    
    
    
    
    	</script>
    </head>
    <body>
    	
    </body>
    </html>

    2、浅拷贝实现:

    		//浅拷贝
    		var obj={
    			a:10
    		}
    		function copy (obj) {
    			//复制关系。而不是引用关系
    			var newOBJ={};
    			for (var arrt in obj) {//循环复制全部属性。能够称为浅拷贝或者叫浅克隆
    				newOBJ[arrt]=obj[arrt];
    			};
    			return newOBJ;
    		}
    
    		var obj2=copy(obj);
    		obj2.a=20;
    		alert(obj.a);//10
    
    
    

    浅拷贝存在的问题仅仅能拷贝一层

    		//浅拷贝的问题:仅仅能拷贝一层
    		////举例验证-->
    		var obj={
    			a:{b:10}
    		}
    		function copy (obj) {
    			var newOBJ={};
    			for (var arrt in obj) {
    				newOBJ[arrt]=obj[arrt];
    			};
    			return newOBJ;
    		}
    		var obj2=copy(obj);
    		obj2.a.b=20;
    		alert(obj.a.b);//20



    ==========================================================================
    3、深拷贝(深拷贝要利用到递归知识)攻克了浅拷贝仅仅能拷贝一层的问题。

    //递归(函数调用函数自身)
    		//推断终止条件,能够运行return动作
    		function jiechen (n) {
    			if(n==1){
    				console.trace();
    				return 1;
    			}
    			return n*jiechen(n-1);
    		}
    		alert(jiechen(4)); //4*3*2*1
    深拷贝实现:

    //深拷贝
    		var obj={
    			a:{b:10}
    		}
    		function deep_copy (obj) {
    			//利用递归的方式
    			var newOBJ={};
    			if(typeof obj!='object'){
    				console.trace();
    				return obj;//终止条件。假设不是对象就放回该值
    			}
    			for (var arrt in obj) {
    				newOBJ[arrt]=deep_copy(obj[arrt]);//再一次拷贝(递归)
    			};
    			return newOBJ;
    		}
    
    		var obj2=deep_copy(obj);
    		obj2.a.b=20;
    		alert(obj.a.b);//10


  • 相关阅读:
    EntityFramework.Extended 支持 MySql
    向着那个理想的世界奔跑
    DDD 领域驱动设计-两个实体的碰撞火花
    云自无心水自闲
    JQuery 复制粘贴上传图片插件(textarea 和 tinyMCE)
    理解 .NET Platform Standard
    【补充】Gitlab 部署 CI 持续集成
    DDD 领域驱动设计-领域模型中的用户设计
    CSS float 定位和缩放问题
    JQuery 加载 CSS、JS 文件
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6699415.html
Copyright © 2020-2023  润新知