深拷贝与浅拷贝

深拷贝和浅拷贝
1. 内存地址
Array, Function,Object 等等可以认为是除了基本数据类型 String,Number,Boolean,null,undefined,Symbol 以外,所有类型都是引用数据类型

引用数据类型存储在堆内存中,在栈中存储了指针,该指针指向堆中该实体的起始地址

当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
2. 赋值和深/浅拷贝的区别
这三者的区别如下,不过比较的前提都是针对引用类型:

当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的
浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响
 

 // 基本数据类型不会影响
 let name = 'jsx';
 let user = name;
 user = 'ljj';
 console.log(name, user); // jsx ljj

 // 引用类型浅拷贝
 let obj = {
	name: 'html',
	age: 20,
	grilfriend: {
		name: 'css'
	}
}

function lightCopy(obj) {
	let target = {};
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			target[key] = obj[key]
		}
	}
	return target;
}
let obj1 = lightCopy(obj);
obj1.grilfriend.name = 'vue';
console.log(obj); // {name: 'html', age: 20, grilfriend: {name: 'vue'}}
console.log(obj1); // {name: 'js', age: 20, grilfriend: {name: 'vue'}}
 

 // 深拷贝
 let method = {
 	user: 'bbc',
 	info: {
 		change: true
 	},
 	fn: function() {}
 }
 let newObj = JSON.parse(JSON.stringify(method));
 newObj.info.change = 'ok';
 console.log(method);
 console.log(newObj);
————————————————
版权声明:本文为CSDN博主「langmanboy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/langmanboy/article/details/124022060

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值