一.基本类型和引用类型的区别
1>先了解内存
内存是存储数据的,不同的类型的数据,要存储在不同的区域,一下是一张内存的分区图,分为栈区,堆区,全局静态区,只读区
2>基本类型和引用类型在内存上存储的区别
以上函数testf在调用时,
1) 定义局部变量 age,由于age是局部变量,所以在栈中申请内存空间,起名为age,又由于给age赋的值250是基本类型,所以,值直接存储在栈中
2)定义局部变量arr,由于arr是局部变量,所以在栈中申请空间,但由于给arr赋的值不是基本类型,而是引用类型(new出来的),所以,先在堆中申请空间存放数据 12,23,34,。再把堆区的地址赋给arr。
3>总结一下基本类型和引用类型
基本类型:就是值类型,就是变量在所对应的内存区域存储的是值,比如age存储的是250
引用类型,就是地址类型,就是ar对应的内存中存储着地址,真正的数据,是在地址对应的内存区域里.
二、基本类型和引用类型在赋值时内存的变化
可以认为,赋值就是拷贝
因为arr1=arr.所以在给arr[0]赋值的时候,arr1[0]的值也会发生改变,因为arr和arr1保存着相同的地址,数据是共享的
三.深拷贝和浅拷贝
所谓拷贝,就是赋值,把一个变量赋值给另一个变量,就是把变量的内容进行拷贝,把一个对象的值赋给另一个对象,就是把对象拷贝一份
1>基本类型,没有问题
因为在赋值的时候,赋的是数据,所以不存在深拷贝和浅拷贝的问题
2>引用类型有问题
引用类型赋值的时候,赋的值是地址(就是引用类型变量在内存中保存的内容)
var arr1 = new Array(12,23,34)
Var arr2 = arr1;//这就是一个最简单的浅拷贝
如果要改变arr2所引用的数据:arr2[0]=100时,那么arr1[0]的值也是100。
原因就是 arr1和arr2引用了同一块内存区域
这是最简单的浅拷贝,因为,只是把arr1的地址拷贝的一份给了arr2,并没有把arr1的数据拷贝一份。所以,拷贝的深度不够
3.用json对象的方式,来演示一下深拷贝和浅拷贝
1)、定义一个json对象(对象的属性也是对象)
内存图
2)、把该对象p进行复制一份
(一)浅拷贝
在控制台中打印的结果(p和p2的books[0]都变成了“四国”)
内存中
(二)深拷贝
在控制台中打印的结果(只有p2的books[0]变成了“四国”)
内存