深浅拷贝具体代码

            var obj = {
				a:1,
				b:2
			}
			
			var obj2 = {
				a:1,
				b:2,
				c:{
					d:4,
					e:{
						f:5
					}
				},
			}
			
			// var obj1 = obj;
			// obj1.a = 2;
			// console.log(obj);//这个时候obj也被修改了,需求不修改
			
			console.log(Object.getOwnPropertyNames(obj))
			
			var obj1 = {}
			//以下是浅拷贝成功的例子
			// for (let var1 of Object.keys(obj)) {
			// 	console.log(var1)
			// 	obj1[var1] = obj[var1]
			// }
			// for (let var1 of Object.getOwnPropertyNames(obj)) {
			// 	// console.log(var1)
			// 	obj1[var1] = obj[var1]
			// }
			// for (let var1 in obj) {
			// 	console.log(var1)
			// 	obj1[var1] = obj[var1]
			// }
			// obj1.a = '哈哈';
			// console.log(obj1)
			// console.log(obj)//修改obj1,原对象没有被修改,需求成立
			
			//以下是使用浅拷贝,但是对象有好几层的例子,即修改深层次的原对象也被修改,失败
			// for (let var1 of Object.keys(obj2)) {
			// 	console.log(var1)
			// 	obj1[var1] = obj2[var1]
			// }
			// obj1.c.d = '深层次';
			// console.log(obj1)
			// console.log(obj2)//修改obj1,原对象也被修改,需求失败,所以需要深拷贝
			
			// 以下是深拷贝
			//第一种
			console.log(typeof null)
			function deepClone(obj,cloneObj){
				cloneObj = cloneObj || {}  
				for (let var1 in obj) {
					console.log(var1)
					if( typeof obj[var1] == 'object' && typeof obj[var1] != 'null' ){
						// cloneObj[var1] = Array.isArray(obj[var1]) ? [] :  {};
						cloneObj[var1] = obj[var1] instanceof Array ? [] :  {}
						deepClone(obj[var1],cloneObj[var1])
					}else{
						cloneObj[var1] = obj[var1]
					}
				}
				return cloneObj
			}
			var cloneObj = deepClone(obj2)
			
			//第二种
			// var cloneObj = JSON.parse(JSON.stringify(obj2))
			
			//第三种
			// var cloneObj = $.extend(true,{},obj2)
			
			cloneObj.c.d = '深层次';
			cloneObj.c.e.m = '深深深层次';
			console.log(cloneObj)
			console.log(obj2)//修改克隆(拷贝后)来的数组,原对象不会被修改,需求成功
			

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
拷贝和浅拷贝都是常见的复制数据的方式。 浅拷贝只会复制对象的第一层属性,如果对象属性值是一个引用类型,那么复制的是该引用类型的地址,也就是说,新对象和原对象的该引用类型的属性指向同一个内存地址。当原对象的该引用类型的属性值发生变化时,新对象也会受到影响,因为它们指向的地址是相同的。 深拷贝则会递归地复制对象及其所有嵌套的属性,直到所有属性都是基本类型或不可变类型时才停止。这样,新对象和原对象的所有属性都指向不同的内存地址,互不影响。 实现深拷贝的方式有很多,以下列举几种: 1. 使用JSON.parse和JSON.stringify方法:先将对象转为字符串,然后再将字符串转回对象,这样可以实现深拷贝,但是有一些限制,比如不能复制函数、正则表达式等特殊类型的数据。 ```javascript let newObj = JSON.parse(JSON.stringify(oldObj)); ``` 2. 使用递归函数:遍历对象的所有属性,如果属性值是对象,则递归调用该函数进行复制,这样可以实现完整的深拷贝。 ```javascript function deepClone(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result[key] = deepClone(obj[key]); } } return result; } ``` 以上列举了常见的深拷贝和浅拷贝的方式,具体使用哪种方式取决于实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小坚果_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值