JS数据类型和引用类型详解(转发)
1.两种值类型与数据类型的关系
基本类型:
(亦做原始类型)
简单的数据段。
包含的数据类型有:Undefined、Null、Boolean、Number、String.
引用类型:
由多个值构成的对象。
包含的数据类型有:Array 、 Object 、 function 、Date 、RegExp.
2.两种数据值类型与内存分配
JS内存空间分为栈(stack)、堆(heap)、池(一般会归类为栈中)。栈内存有序排列,并且大小固定。堆内存无需排列,大小不固定。
(1).基本类型 :
基本类型值大小固定,变量值存放在栈内存中。
基本类型值初始化:当用var关键字声明初始化一个变量之后,将变量名与一个栈内存地址绑定,并将变量的值存放在该地址的空间内。
基本类型值之间赋值:当基本类型之间发生变量的赋值操作时,会将栈空间中的值进行copy,并将该副本赋值给另一个变量,存放在另一个变量名绑定的内存空间中。变量值改变不会相互影响。
基本类型值重赋值(不可改变的原始值):如果对一个已经声明了的变量重新赋值,其实是切断了该变量与内存地址之间的绑定联系,将指针指向了新的栈空间,并将新值存在新空间内。之前地址就变成了野房间,野房间内的数据也不会凭空销毁,直到下一次与变量绑定时,被变量值覆盖。
(2).引用类型:
引用类型由于可以修改,可以不管的扩充成员,所以它们的大小是无法确定的,会降低变量查寻的速度,因此无法放在栈内存中。所以要保存一个引用类型,需要在堆内存中开辟一块空间去保存引用类型的数据。
引用类型值初始化:引用类型的值存放在堆中。变量名绑定的栈空间内存放的是一个指针,存放16进制的地址值,大小固定,所以存放在栈中,该地址就是变量值所在的堆地址。
引用类型值间赋值:该赋值不同与基本类型值之间的赋值。当赋值发生时,拷贝的依然是栈空间内的内容。但由于这是一个地址值,所以两个引用类型变量所指的就是同一个堆空间。此时,变量值改变会相互影响。
通过函数方法对对象进行改变,例如数组的push(),splice()等方法,实际上也是通过指针寻址,并在原来的变量值上做修改,所以依然是会相互影响的。
引用类型值重赋值:引用类型重赋值,在堆中开辟了一个新房间,并将栈中指针指向了新的堆地址。此时,a、b变量值改变就不会相互影响了。
3.两种数据值类型与内存访问机制
由于在内存中存放形式不同,所以两种的对变量的访问机制也不同。
基本类型是按值访问,可以直接得到变量值。
引用类型则是按引用访问。在访问引用类型的值是先得到存该值的地址,再通过该地址得到变量值。
- js数据类型 ——引用类型(Array).1/3
- JAVA基本数据类型及引用数据类型详解
- java基本数据类型传递与引用传递区别详解
- Js 基本数据类型、引用数据类型
- 在js中基本类型与引用类型的详解
- 深入解析js中基本数据类型与引用类型,函数参数传递的区别
- JS解决浮点数据类型的计算(引用)
- 判断js中各种数据的类型方法之 typeof() 和 Object.prototype.toString() 详解
- js数据类型 ——引用类型(Array).2/3
- js类型转换与引用类型详解(Boolean_Number_String)
- 详解js的六大数据类型
- JS中的两种数据类型及实现引用类型的深拷贝的方法
- JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function
- js数据类型 ——引用类型(Array).3/3
- JS 基本数据类型和引用数据类型
- js数据类型转换详解
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
- JS数据类型详解
- js基本数据类型引用类型深复制浅复制
- ES6-JS 基本类型和引用类型详解