js里的(数组和对象)深浅拷贝

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>)</title>
    </head>
    <body>
    <div>
    	
    </div>
    <script>
    	
    		let obj={
    			name: "张三",
    			age: "20",
    			sex: "男",
    			address: "深圳"
    		}
    		let array = [1,2,"3",4]
    		
    		
    		
    		//为对象添加属性属性
    		obj['job']="web前端开发";
    		//console.log(obj)
    		
    		/*
    			浅拷贝(数组): (会改变原数组)
    			
    				就是数组A重新赋值给数组B,数组B里的属性值被改变,则数组A里的值也会跟着发生改变
    		*/
    		let array2 = array;
    		array2[1]="name";		//改变数组里的属性
    		//console.log(array);		//[1, "name", 3, "4"]
    		//console.log(array2);	//[1, "name", 3, "4"]
    		
    		/*
    			深拷贝(数组):	(不会改变原数组)
    			
    				1.使用slice() 和 concat()方法来实现深拷贝
    				
    					arrayObj.slice(start, [end]) 该方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。不会改变原数组
    					
    					arrayObj.concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    				
    				2.利用循环实现
    		*/
    		
    		// 1.使用slice() 和 concat()方法来实现深拷贝
    		let arr = ["A","B","C","D","E"];
    		let arrayCopy = arr.concat();
    		arrayCopy[0] = 1
    		//console.log(arr);	//  ["A", "B", "C", "D", "E"]
    		//console.log(arrayCopy);	// [1, "B", "C", "D", "E"]
    		
    		// 2.利用循环实现深拷贝
    		let aa1 = [9,8,7,6,5];
    		let aa2 = [];
    		
    		aa1.forEach((item) => {
    			aa2.push(item);
    		})
    		//console.log(aa2);	//[9,8,7,6,5]
    		
    		
    		/*
    			对象的浅拷贝:
    			
    				 就是对象A重新赋值给另一个对象B,对象B里的属性值被改变,则对象A里的值也会跟着发生改变
    		*/
    	
    		let obj1 = {
    		   name:'发哥',
    		   age: 22
    		}
    
    		let obj2 = obj1;
    		obj2.name = 'fa哥';	//obj2改变nane属性值
    		console.log(obj1); //{name: "fa哥", age: 22}
    		console.log(obj2); //{name: "fa哥", age: 22}
    		
    		/*
    			对象的深拷贝: (不会改变原对象的属性)
    			
    				
    		*/
    		
    		var obj3 = {
    			name: '军哥',
    			age: 22,
    			
    		}
    		
    		//使用递归的方式实现数组、对象的深拷贝
    		function deepClone(obj) {
    		  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
    		  var objClone = Array.isArray(obj) ? [] : {};
    		  //进行深拷贝的不能为空,并且是对象或者是
    		  if (obj && typeof obj === "object") {
    			for (key in obj) {
    			  if (obj.hasOwnProperty(key)) {
    			  //判断ojb子元素是否为对象,如果是,递归复制
    				if (obj[key] && typeof obj[key] === "object") {
    				  objClone[key] = deepClone(obj[key]);
    				} else {
    				  objClone[key] = obj[key];
    				}
    			  }
    			}
    		  }
    		  return objClone;
    		}
    		
    		let objCopy = deepClone(obj3);	//对象为改变前赋给新的变量
    		obj3.name = 'junge';
    		console.log(obj3);//Object {name: "junge", age: 22}
    		console.log(objCopy);//Object {name: "军哥", age: 22}
 
    </script>
    </body>
    </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值