前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

简介: 前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

先了解一下JavaScript 数据类型有哪些?

javaScript 中有8种基本的数据类型:7种为基本数据类型,而Object 为复杂数据类型

基本数据类型(原始数据类型):

  • number 用于任何类型的数字
  • bigint 用于任意长度的整数。
  • string 用于字符串
  • boolean :布尔值 用于 true 和 false。
  • null 用于未知的值
  • undefined 用于未定义的值 —— 只有一个 undefined 值的独立类型。
  • symbol 用于唯一的标识符。

复杂数据类型(非原始数据类型):

亿点小知识: Object 是复杂数据类型的统称,以下类型都是属于Object 类型:

  • Function(函数)
  • Array(数组)
  • Date(日期)
  • RegExp(正则表达式)
接下来我们来看一下 栈内存和堆内存

当定义一个变量的时候,JavaScript 引擎会为变量分配两种内存:栈内存和堆内存。

栈内存和堆内存分别对应基本数据类型和复杂数据类型

  • 栈内存:

基本数据类型: number、bigint 、string 、boo lean 、null 、undefined 、symbol

对于基本数据类型有固定的大小。JavaScript 引擎为它们分配一片固定的内存,并存储在上:

let name = "小张";
let age = 18;

因为 name 和 age 都是基本数据类型,JavaScript 引擎将它们存储在栈上,如下图所示:

JavaScript 将对象复杂数据类型(Object) 存储在堆上

let obj = {
    name: "小张",
    age: 18
};
let arr = [1,2,3]

对于复杂数据类型 会把变量名(对象名)作为堆内存的地址指向 堆内存 如下图所示:

关于栈(Stack)

“栈”具有线程和“先进后出”的特点,也就是每个栈桢一般会保存下一个栈桢的地址,指向next节点(即指向下一个栈桢),类似队列的链式结构。同时先入栈的会先执行,后入栈的会先弹出(执行完销毁)。

我们常说的栈内存一般指的是内存的空间栈。

那么栈内存有哪些特点

数据一执行完毕,变量会立即释放,节约内存空间。

  • 优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器。
  • 缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
    亿点小知识:栈内存的数据会进行共享
let a = 2
let b = 2

运行过程是 它会在栈中创建一个变量为a的引用 然后查找栈内是否有2这个数据,如果没有就创建一个2数据进行赋值,当b进行查找的时候会找到2这个数据直接会指向2这个数据,但当a=3的时候 同样会去查找有没有3数据,没有会进行创建3,但不会影响b=2 这个值

关于堆(Heap)

是内存中最大的一块内存区域,也是被各个线程共享的内存区域,所有的对象实例(或复杂类型信息)都保存在堆内存中。

堆内存特点

堆内存中所有的实体都有内存地址值,内存释放靠垃圾回收机制不定时的收取。

  • 堆的优势:可以动态地分配内存大小。
  • 缺点:由于要在运行时动态分配内存,存取速度较慢。(这个一般是体会不到的,只是相对于栈内存而言)
了解一些相关的知识
  • 变量
    变量名是栈内存指针的别名。因为可以先声明变量,后赋值。
    声明变量是在指针页表里建立变量信息。而赋值才是真正的开辟内存空间。但是为了节省内存所以变量名与值数据是分开存放的。
  • 就因为变量与值是分开两个地方保存,所以才有“栈内存数据共享”这个特性。从而会有不同的变量名指向同一个内存,和相同变量名指向不同的内存等情况。

     而保存变量名的内存地址称为指针变量。

  • 内存溢出
    内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
  • 内存泄露
  • 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
    我们在开发中有时候会遇到浏览器崩溃无响应可能就是因为内存堆积的后果。

以上就是js的栈内存和堆内存感谢大家的阅读

如碰到其他的问题 可以私下我 一起探讨学习

如果对你有所帮助还请 点赞 收藏谢谢~!

关注收藏博客 作者会持续更新…

相关文章
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
751 158
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
705 159
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
719 174
|
监控 JavaScript 数据库连接
解读Node.js内存监控工具生成的报告
需要注意的是,不同的内存监控工具可能会有不同的报告格式和内容,具体的解读方法可能会有所差异。因此,在使用具体工具时,还需要参考其相关的文档和说明,以更好地理解和利用报告中的信息。通过深入解读内存监控报告,我们可以不断优化 Node.js 应用的内存使用,提高其性能和稳定性。
636 175
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
782 174
|
缓存 监控 JavaScript
避免在Node.js中出现内存泄漏
总之,避免内存泄漏需要在开发过程中保持谨慎和细心,遵循最佳实践,不断优化和改进代码。同时,定期进行内存管理的检查和维护也是非常重要的。通过采取这些措施,可以有效地降低 Node.js 应用中出现内存泄漏的风险,确保应用的稳定和性能。
437 159
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
1076 159
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
796 62
|
存储 缓存 安全
阿里云服务器计算型c7/c8y/c8i,通用型g7/g8y/g8i,内存型r7/r8y/r8i区别及选择参考
为了满足不同企业级用户的多样化需求,阿里云在当下的活动中推出了多款计算型、通用型和内存型的云服务器实例,包括计算型c7/c8y/c8i、通用型g7/g8y/g8i以及内存型r7/r8y/r8i等。这些实例各具特色,适用于不同的应用场景和业务需求。本文将为您详细解析这些实例的区别,以及选择参考,帮助您根据自己的需求选择合适的阿里云服务器实例。
|
存储 固态存储
磁盘和内存的区别
存储特性: • 磁盘:非易失性存储,数据在断电后不会丢失,适合长期存储数据。 • 内存:易失性存储,数据在断电后会丢失,适合临时存储当前运行的程序和数据。 容量: • 磁盘:容量通常较大,从几百GB到数TB不等,适合存储大量的文件和数据。 • 内存:容量相对较小,一般在几GB到几十GB之间,用于提供快速的临时存储空间。 速度: • 磁盘:读写速度较慢,HDD一般在几十MB/s,SSD可以达到几百MB/s甚至数GB/s。 • 内存:读写速度非常快,通常在几十纳秒到几百纳秒之间,能够快速响应CPU的指令。
1107 2

热门文章

最新文章