JavaScript——深拷贝

1.在JavaScript中基本数据类型保存在栈中,而复杂数据类型(引用数据类型)存放在堆中。

2.拷贝:其实就是复制,在JavaScript中拷贝又分为浅拷贝和深拷贝。无论是浅拷贝还是深拷贝都只适合于对象或者数组这类复杂数据类型(引用数据类型)。

3.浅拷贝和深拷贝的区别:

        浅拷贝:只是拷贝数据的内存地址,让新的数组或者对象能够引用原数据。彼此之间的操作会互相影响。

        深拷贝:是在内存中开辟一个新的存储空间,完完全全的拷贝一整个一模一样的对象(数组),将原对象的所有内容全部复制过来。和原对象(数组)完全分隔,彼此之间的操作互不影响。

4.浅拷贝就是创建一个新的对象(数组)让其指向原来的数据地址,引用原数据;新对象对数据进行操作时,原对象数据也会发生改变。例如:

        var obj1 = {
			name:"xiaozhang",
			age:21,
			height:180
		}
		
		var obj2 = obj1
		console.log(obj2)
		
		obj2.weight = 60
		console.log(obj1)

5.深拷贝会在内存中重新开辟一段新的存储空间,将原对象的所有内容全拷贝到新的存储空间内。使得两个对象(数组)指向两个不同的堆内存数据。从而实现改变互不影响。例如:

            var arr = [10, 20, 30, [1, 2, [3, 4]]]

			function deepcope(data) {
				if (typeof(data) == "object") {
					if (data == null) {
						return null
					} else if (data.constructor == Date()) {
						return new Date(data.getTime())
					} else if (data.constructor == RegExp) {
						return new RegExp(data)
					} else {
						var newobj = new data.constructor()
						for (var key in data) {
							newobj[key] = arguments.callee(data[key])
						}
						return newobj
					}
				} else {
					return data
				}
			}
			var arr2 = deepcope(arr)
			console.log(arr2)
			
			arr2.push(55,66)
			console.log(arr2)
			console.log(arr)

 6.对象的深拷贝也可以用JSON.stringify()和JSON.parse()来实现:

            var obj = {name:"xiaozhang"}

			var str = JSON.stringify(obj) 
			var obj2 = JSON.parse(str) 
			console.log(obj2)
			
			obj2.age = 21
			console.log(obj2)
			console.log(obj)

            var obj = {x1:null,x2:new Date(),x3:"hello",son:{age:20}}
			var obj2 = JSON.parse(JSON.stringify(obj))
			obj2.son.age = 300
			console.log(obj2) //会改变数据类型

 以上这两种方式虽然都可以实现深拷贝,但是这两种方法使用时存在缺陷,当对象里面有引用数据类型、时间、正则表达式 等时,数据解析会出现问题;所以上面这两种用JSON.stringify()和JSON.parse()的方式都不推荐使用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

z_小张同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值