前端 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 引擎将它们存储在栈上,如下图所示:
前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?
JavaScript 将对象复杂数据类型(Object) 存储在堆上

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

对于复杂数据类型 会把变量名(对象名)作为堆内存的地址指向 堆内存 如下图所示:
前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?

关于栈(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 栈内存和堆内存 基本数据类型和复杂数据类型的区别?
以上就是js的栈内存和堆内存感谢大家的阅读
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…文章来源地址https://www.toymoban.com/news/detail-503375.html

到了这里,关于前端 js 栈内存和堆内存 基本数据类型和复杂数据类型的区别?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 秒懂 栈内存和堆内存(深入底层)

    一般理解 很多人对内存的认识并没有那么透彻。 只知道基本数据类型(值类型)存放在“栈内存”中。引用数据类型(对象类型)存放在“堆内存”中。 内存概念 首先,栈和堆都是JS引擎或JVM虚拟机等运行环境创建的内存模型,由CPU管理控制。 既然是模型,那就是虚构的,

    2023年04月23日
    浏览(36)
  • JVM——栈和堆概述,以及有什么区别?

    方法栈并不是某一个 JVM 的内存空间,而是我们描述方法被调用过程的一个逻辑概念。 在同一个线程内,T1()调用T2(): T1()先开始,T2()后开始; T2()先结束,T1()后结束。 从英文单词角度来说 栈:stack 堆:heap 从数据结构角度来说 栈和堆一样:都是先进后出,后进先出的数据结

    2024年02月12日
    浏览(40)
  • 笔记本电脑内存条的类型有哪些?它们之间有什么区别?

    笔记本电脑内存条有几种常见的类型,包括: DDR4(Double Data Rate 4):DDR4 是目前最新的内存标准,它提供了更高的带宽和更低的电压。DDR4 内存条速度更快,能够处理更多数据,并且相对于旧的 DDR3 内存而言更节能。 DDR3(Double Data Rate 3):DDR3 内存条是较旧的内存标准,但仍

    2024年02月07日
    浏览(63)
  • 【python基础】复杂数据类型-列表类型(元组)

    列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的。 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的列表被称为元组。 元组看起来犹如列表,但使用圆括号而不是方括号来标识

    2024年02月07日
    浏览(67)
  • JS基本原理:对象类型赋值和原生类型赋值

    在本文中,我试图以最简洁的方式来阐明JavaScript编程原理中对象类型赋值和原生类型赋值之间的区别,以及它们各自是如何工作的。这也是我希望在我的JavaScript编程生涯早期就已经理解的东西。 首先,让我们回顾一下JavaScript中不同的原生类型和对象类型。 原生类型 :Boo

    2024年02月08日
    浏览(40)
  • 【python基础】复杂数据类型-列表类型(数值列表)

    视频讲解 列表非常适合用于存储数字集合,而Python提供了很多工具,可帮助我们高速地处理数字列表。 Python的range函数能够轻松的生成连续一系列数字。 其语法格式:range(起始值,终止值) 我们通过之前学习的for循环输出range函数生成的连续数字,编写程序如下所示: 我们通

    2024年02月07日
    浏览(50)
  • 【python基础】复杂数据类型-列表类型(列表切片)

    视频讲解 前面学习的是如何处理列表的 所有数据元素 。Python还可以处理列表的部分元素,Python称之为切片。 创建切片,可指定要使用的第一个数据元素的索引和最后一个数据元素的索引。与range函数一样,Python在到达指定的第二个索引 前面的 数据元素后停止。比如要切片

    2024年02月07日
    浏览(52)
  • 【python基础】复杂数据类型-列表类型(增删改查)

    视频讲解 列表数据类型-增删改查 列表是由一系列数据元素按特定顺序排列组成的 。可以将 任何类型数据元素 加入列表中,其中的数据元素之间没有任何关系。鉴于列表通常包含多个数据元素,给列表变量指定一个表示复数的名称是个不错的选择。 在Python中, 用方括号[

    2024年02月07日
    浏览(57)
  • 【python基础】复杂数据类型-列表类型(排序/长度/遍历)

    在创建的列表中,数据元素的排列顺序常常是无法预测的。这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息。有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调整排列顺序。python提供了很多列表数据元素排序的方式,可根据情况选用

    2024年02月07日
    浏览(44)
  • Advanced .Net Debugging 4:基本调试任务(对象检查:内存、值类型、引用类型、数组和异常的转储)

    一、介绍 这是我的《 Advanced .Net Debugging 》这个系列的第四篇文章。今天这篇文章的标题虽然叫做“基本调试任务”,但是这章的内容还是挺多的。由于内容太多,故原书的第三章内容我分两篇文章来写。上一篇我们了解了一些调试技巧,比如:单步调试、下断点、过程调试

    2024年03月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包