概念
值类型:直接存储其值。
C#中的值类型:byte,short,int,long,float,double,decimal,char,bool 和 struct
JavaScript中的值类型:Number、String、Boolean、undefined、null
C#中的引用类型:Object、string 和 class等
JavaScript中的引用类型:Array、Object、function、Date、RegExp等
引用类型:存储对其值的引用,类似于指针
特点
值类型:
- 占用空间固定,保存在栈中
- 保存和复制的是值本身
- 使用typeof检测数据类型
- 基本类型数据时值类型
- 值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
- 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。
引用类型:
- 占用空间不固定,保存在堆中
- 保存和复制的是指向对象的一个指针
- 使用instanceof检测数据的类型
- 使用new()方法构造出的对象时引用类型
- 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
- 引用类型的对象总是在进程堆中分配(动态分配)。
值类型和引用类型数据存储数据的过程
1、值类型
栈,先进后出,由栈底开始写入数据。当定义了一个变量var num=100;时,这时会在1007位置存放100数据。再定义一个var num1=num时,此时会在1006位置增加一个num1,值与num的值相同100。此时将num赋值为200,此时会在1005位置增加一个个num等于200,栈底的num变为为1007,成为一个野值,因为一旦赋值,就不会改变。
2、引用类型:
引用类型:定义一个数组:var arr=[1,2]; 此时会在堆上面存放引用值[1,2],在栈底1001位置存放引用地址heap1001。当再定义一个arr1等于arr时,会在栈1006位置增加一个arr1,因为引用值和arr相同,所以arr1在栈上存储的也是heap1001,与arr指向同一引用位置。此时在arr中增加一个元素。arr.push(3);会在堆1001位置上增加一个元素3,变为[1,2,3]。如果再另arr=[1,3];这个时候会在堆1002上开辟一个新的内存,存储[1,3]。arr指向新的堆地址heap1002。而arr1依然指向heap1001。