zl程序教程

您现在的位置是:首页 >  其它

当前栏目

数据类型梳理 和 堆栈的理解

理解 数据类型 梳理 堆栈
2023-09-11 14:19:17 时间

1、基本数据类型


JavaScript中的变量可能包含两种不同数据类型的值:基本数据类型和引用数据类型。

JavaScript中一共有5种基本数据类型:String、Number、 Boolean、Undefined、Null。

基本数据类型的值是无法修改的,是不可变的。

基本数据类型的比较是值的比较,也就是只要两个变量的值相等,我们就认为这两个变量相等。
 

2、引用数据类型


引用类型的值是保存在内存中的对象。

当一个变量是一个对象时,实际上变量中保存的并不是对象本身,而是对象的引用。

当从一个变量向另一个变量复制引用类型的值时,会将对象的引用复制到变量中,并不是创建一个新的对象。

这时,两个变量指向的是同一个对象。因此,改变其中一个变量会影响另一个。

3,栈和堆梳理


JavaScript在运行时数据是保存到栈内存和堆内存当中的。

简单来说栈内存用来保存变量和基本类型,堆内存是用来保存对象。

我们在声明一个变量时,实际上就是在栈内存中创建了一个空间用来保存变量。

如果是基本类型则在栈内存中直接保存,如果是引用类型则会在堆内存中保存,变量中保存的实际上对象在堆内存中的地址。

当我们写了下边这几句代码的时候,栈内存和堆内存的结构如下:

栈的特点:是一种连续储存数据结构,先进后出,后进先出的性质

 栈内的元素只能通过列表的一端访问,这一端称为栈顶。由于栈具有先进后出的特点,所有任何不在栈顶的元素都无法访问

想要理解记住这个,建议结合杯子记忆

如图所示            栈中   a先进  b后进, b先出,a后出

 

堆: 是一种非连续的树形储存的数据结构,具有队列优先,先进先出的性质。


  每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。常用来实现优先队列,存取随意。

  优点: 动态分配内存大小,“按需分配”;

   缺点: 由于要在运动时才动态分配内存,相比于栈内存,它的存取速度较慢。
 

为什么会有栈内存和堆内存之分?

通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。