深浅拷贝方法1

本文详细介绍了JavaScript中的浅拷贝和深拷贝概念,通过实例展示了它们的区别。浅拷贝仅复制对象的引用,而深拷贝会创建一个全新对象,确保修改拷贝对象不会影响源对象。文章提供了两种深拷贝的实现方式,一种是通过遍历对象属性,另一种是利用JSON.parse和JSON.stringify方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script>
			/* 
			  浅拷贝:拷贝基本数据类型时,不受任何影响,
			       当拷贝引用类型时,源对象也会被修改。
			 深拷贝:就是完完全全拷贝一份新的对象,
			        它会在内存的堆区域重新开辟空间,
					修改拷贝对象就不会影响到源对象
			*/
			var obj1 = {
				"a": 1,
				"b": 2
			};
			//浅拷贝
			var obj2 = obj1;
			obj2.a = 6;
			console.log(obj1); //{a: 6, b: 2}源对象也被修改
			//对象深拷贝
			var obj3 = {};
			for (var key in obj1) {
				//obj3.a=1
				obj3[key] = obj1[key];
			}
			console.log(obj3); //{a: 6, b: 2}
			obj3.b = 888;
			console.log(obj3); //{a: 6, b: 888}
			console.log(obj1); //{a: 6, b: 2}源对象未被修改



			//数组深拷贝
			var arr1 = [1, 2, 3];
			var arr2;
			arr2 = arr1;
			arr2[1] = 6;
			console.log(arr2); //[1, 6, 3]
			console.log(arr1); //[1, 6, 3]  源对象被修改
			var arr3 = [];
			for (var key in arr1) {
				arr3[key] = arr1[key];
			}
			console.log(arr3); //[1, 6, 3]
			arr3[1] = 666;
			console.log(arr3); //[1, 666, 3]
			console.log(arr1); //[1, 6, 3] 源对象未被修改
		</script>

深拷贝方法2 

<script>
			var obj1 = {
				"a": 1,
				"b": 2
			};
			var ary1 = [1, 2, 3];

			var obj = {
				"a": 1,
				"b": 2,
				"c": ['hello', 'world'],
				"stu": {
					'name': 'zs',
					"age": 18,
					"score": [10, 50, 60]
				}
			}
			//obj可能是数组也可能是对象
			function deepCopy(obj) {
				var newObj = Array.isArray(obj) ? [] : {};
				for (var key in obj) {
					if (typeof(obj[key]) != "object") {
						newObj[key] = obj[key];
					} else {
						//递归 函数内部调用函数本身
						var no = deepCopy(obj[key]);
						newObj[key] = no;
					}
				}
				return newObj;
			}
			var obj2 = deepCopy(obj1);
			console.log(obj2);

			var ary2 = deepCopy(ary1);
			console.log(ary2);

			var obj6 = deepCopy(obj);
			console.log(obj6);
			obj6.stu.score[1] = 100;
			console.log(obj6);
			console.log(obj);
			//深拷贝2
			var obj8 = JSON.parse(JSON.stringify(obj));
			console.log(obj8);
			obj8.c[0] = "祖国统一";
			console.log(obj8);
			console.log(obj);
		</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值