浅拷贝和深拷贝

该文章转载于:https://blog.csdn.net/jiang7701037/article/details/98738487?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162623663616780261920193%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162623663616780261920193&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-98738487.first_rank_v2_pc_rank_v29&utm_term=%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D&spm=1018.2226.3001.4187
**一.先了解基本类型和引用类型的区别
**一.了解内存
内存是储存数据的,不同数据要放到不同的区域中。
内存分为四个区域:
栈区    只可以存放局部变量的值     被调用函数的地址      形参
堆区 new出来得值
全局静态区 存放全局变量        静态变量
只读区    常量区存放常量 ,代码区存放程序的代码
**二.基本类型和引用类型在内存上存储的区别
以栈区和堆区举例说明:

在这里插入图片描述
1.局部变量age被定义并被赋值后,会取值存到栈区中,并将值起名为age,又由于给age赋了一个值,这个值是基本类型,所以值会直接存储在栈内;
2.定义局部变量arr,会在栈区申请内存空间把局部变量的值存进去,但是arr中的值不是基本类型而是引用类型(new出来的)。因此会在堆内存中存入arr的数据:【12,23,34】,再把堆的地址赋给arr(栈内)
**基本类型和引用类型的概念
1.基本类型:就是值类型,定义的变量所对应的内存区域存储的是值。例如:age变量所对应的内存存储的就是值250
2.引用类型:就是一个地址类型。 变量arr就是一个引用类型。arr所对应的内存中储存着地址,而真正的数据是在地址对应的内存区域中。
**三.基本类型和引用类型在赋值时的内存变化
**1、基本类型:
赋值就是拷贝

**2、引用类型:
在这里插入图片描述
举例说明:
在这里插入图片描述

如果给arr【0】进行赋值的话,也就是改变原来的值得话,arr1【0】的值也会被改变。因为arr和arr1保存着相同的地址,两个人引用的地址是共享的。
**四.深拷贝和浅拷贝

拷贝,实际意义上是赋值。把一个变量的值赋给另一个变量,就是把内容进行了拷贝。把一个对象的值赋给及另一个对象,这就叫拷贝。
**1、基本类:

Var a = 100;
Var b = a;
consle.log b;//100
如果要改变b的值得话,a的值不会被改变;
**2、引用类型:

引用类型赋值时,赋的值地址(就是引用类型变量在内存中保存的内容)
例如:
var arr1 = new Array(12,23,34);
var arr = arr1;         这就是一个最简单的的浅拷贝
如果arr的值改变,arr1的值也会改变的
这是因为两个变量用了相同的地址
    这只是把arr1的地址拷贝了一份,给了arr,并没有把数据给arr。。
**3、用json对象的方式演示浅拷贝和深拷贝:

1.定义一个json对象(对象的属性也是对象)

var p = {
	id:"007",
	name:"刘德华",
	age:"18"
	book:"new array("三国演义","红楼梦",“水浒传”)  //引用类型
}



在这里插入图片描述

2.进行浅拷贝

var p1 = {};
for(let key in p){
	p1[key] = p[key];
}
p1.book[0] = "四国";
console.log(p1);
console.log(p);

p和p1book[0]的值都变成了四国。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3.进行深拷贝

var p2 = {};
for (let key in p){
	p2[key] = [];
	for(let i in p[key]){
		p2[key][i] = p[key][i]
	}else{
	p2[key] = p[key];
	}
}
p2.book[0] = "四国";
console.log(p);
console.log(p2);

只有p2.book[0]的值变成了四国;
在这里插入图片描述

在这里插入图片描述
4.深拷贝最终版

var p = {
	id:"007",
	name:"刘德华",
	wife:{
		id:"008",
		name:"刘德的妻子",
		address:{
			city:"北京",
			area:"海淀"
	}
	}
}
function copyObj(obj){
	let newObj = {};
	for(let key in obj){
		if(typeof obj[key] = "object"){
			newObj[key] = copyObj[obj(key)]	
		}else{
			newObj[key] = obj(key);
		}
	}
	return newObj;
}
ley p2 = copyObj(p);
p2.wife.name = "张三疯";
p2.wife.address.city = "香港"
console.log(p);
console.log(p2);

在这里插入图片描述
深拷贝_如果属性是数组等非键值的对象

//给数组对象增加一个方法,用来复制自己
Array.prototype.copyself = function(){
	let arr = new Array();
	for(let i in this){
		arr[i] = this[i];
	}
	return arr;
}
var p (){
	id:"oo7",
	name:"刘德华",
	books: new Array("三国演义","红楼梦","水浒传")
}
function copyObj(obj){
	let newObj = {};
	for(let key in obj ){
		if(typeof newObj[key] == 'object'){
			newObj[key] = obj[key].copyself();
		}else{
			newObj[key] = obj[key];
		}		
	}
	return newObj
}
var p1 = copyObj(p);
p1.books[0] = "四国";
console.log(p);
console.log(p1);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值