位置: IT常识 - 正文

堆和栈详解js(js栈堆的区别)

编辑:rootadmin
堆和栈详解js 认识堆和栈

推荐整理分享堆和栈详解js(js栈堆的区别),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js 堆和栈,堆和栈java,js 堆和栈,堆栈 js,堆栈 js,js堆和栈的区别 阮一峰,js 堆和栈,js 堆和栈,内容如对您有帮助,希望把文章链接给更多的朋友!

学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。

理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有几种含义

在理解堆与栈这两个概念时,需要放到具体的场景下去理解。一般情况下有两层含义:

(1)内存操作场景下,堆与栈表示两种内存的管理方式。

(2)数据结构场景下,堆与栈表示两种常用的数据结构。

1、内存操作场景

stack的第一种含义是存放数据的一种内存区域。程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈),另一种叫做heap(堆)。

它们的主要区别是:stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;

heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。

三个变量和一个对象实例在内存中的存放方式如下:

从上图可以看到,i、y和cls1都存放在stack,因为它们占用内存空间都是确定的,而且本身也属于局部变量。但是,cls1指向的对象实例存放在heap,因为它的大小不确定。作为一条规则可以记住,所有的对象都存放在heap。

接下来的问题是,当Method1方法运行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。

栈由操作系统自动分配和释放,比如基本数据类型(Number、String、Boolean……)和函数的参数值等。

堆由开发人员自主分配和释放,若不主动释放,程序结束时由浏览器回收,用于存储引用类型

2、数据结构场景

JavaScript存在栈和队列概念,通过数组的方式,模仿实现堆栈。

栈:栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素称作进栈、入栈或压栈(Push);把栈顶元素删除,使其相邻的元素成为新的栈顶元素称作出栈或退栈(Pop)。通过数组的push()、pop()方法实现栈。

stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out) 。

与这种结构配套的,是一些特定的方法,主要为下面这些。

push:在最顶层加入数据。pop:返回并移除最顶层的数据。top:返回最顶层数据的值,但不移除它。isempty:返回一个布尔值,表示当前stack是否为空栈。

堆:堆其实是一种优先队列,也就是说队列中存在优先级,比如队列中有很多待执行任务,执行时会根据优先级找优先度最高的先执行。

堆和栈详解js(js栈堆的区别)

堆的特点是"无序"的key-value"键值对"存储方式。

我们想要在书架上找到想要的书,最直接的方式就是通过查找书名,书名就是我们的key。拿着这把key,就可以轻松检索到对应的书籍。

"堆的存取方式跟顺序没有关系,不局限出入口"。

一、js的数据类型

为了更好容易的理解堆和栈,首先来复习一下js中的数据类型。在js中数据类型主要分为以下两大类:

类型

内容

基本类型

String,Number,Boolean,Null,Undefined,这5种基本数据类型它们是直接按值存放的,所以可以直接访问。(简单的数据段,存放在栈内存中,占据固定大小的空间。内存地址大小的固定的,在堆内存中为值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但可以将内存地址保存在栈内存中)

引用类型

Function,Array,Object,当我们需要访问这三种引用类型的值时,因为包含引用类型的变量实际上保存的不是变量本身,而是指向该对象的指针。所以,首先得从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。(引用类型保存在堆内存中,包含引用类型的变量实际上保存的不是变量本身,而是指向该对象的指针。)

二、什么是堆什么是栈

创建数据的时候就会占用内存、内存主要开辟了两类空间

结构

内容

栈(stack)

由操作系统自动分配内存空间,自动释放,存储的是基础变量以及一些对象的引用变量,占据固定大小的空间。

堆(heap)

由操作系统动态分配的内存,大小不定也不会自动释放,一般由程序员分配释放,也可由垃圾回收机制回收(程序结束时由浏览器回收)。

优缺点:

结构

优点:

缺点:

栈(stack)

栈中的内容是操作系统自动创建、自动回收,占据固定大小的空间,因此内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。

相比于堆来说存取速度会快,并且栈内存中的数据是可以共享的,例如同时

本文链接地址:https://www.jiuchutong.com/zhishi/300404.html 转载请保留说明!

上一篇:【小程序开发】—— 封装自定义弹窗组件(小程序开发定制)

下一篇:【TypeScript】TS进阶-函数重载(七)(typescript tsconfig)

  • 怎么注册滴滴快车司机(如何注册滴滴)

    怎么注册滴滴快车司机(如何注册滴滴)

  • 苹果怎么查激活时间(苹果怎么查激活日期)

    苹果怎么查激活时间(苹果怎么查激活日期)

  • 扩频通信的基本原理(扩频通信的主要特点)

    扩频通信的基本原理(扩频通信的主要特点)

  • 什么是暗网

    什么是暗网

  • 华为p40pro充电器型号(华为p40pro充电器参数配置)

    华为p40pro充电器型号(华为p40pro充电器参数配置)

  • 抖音企业号会不会限流(抖音企业号会不会封号呢)

    抖音企业号会不会限流(抖音企业号会不会封号呢)

  • 清除单元格内容按什么键(清除单元格内容快捷键是什么)

    清除单元格内容按什么键(清除单元格内容快捷键是什么)

  • 网易uu能不能2个电脑用(uu能不能两个人)

    网易uu能不能2个电脑用(uu能不能两个人)

  • 拼多多已发货怎么拒收(拼多多已发货怎么重新打印面单)

    拼多多已发货怎么拒收(拼多多已发货怎么重新打印面单)

  • 合约版和无需合约版有什么区别(无需合约版和合约版哪个更好)

    合约版和无需合约版有什么区别(无需合约版和合约版哪个更好)

  • 荣耀手环需要一直开蓝牙吗(荣耀手环需要一直开着吗)

    荣耀手环需要一直开蓝牙吗(荣耀手环需要一直开着吗)

  • 怎么设置文字下划线(怎么设置文字下划线并设置成空心)

    怎么设置文字下划线(怎么设置文字下划线并设置成空心)

  • 华为3代耳机怎么充电(华为3代耳机怎么用)

    华为3代耳机怎么充电(华为3代耳机怎么用)

  • XR机身尺寸(xr机身尺寸和13一样吗)

    XR机身尺寸(xr机身尺寸和13一样吗)

  • 电脑开机一会就黑屏是什么原因(电脑开机一会就关机了怎么回事)

    电脑开机一会就黑屏是什么原因(电脑开机一会就关机了怎么回事)

  • 亚马逊下单后怎么付款(亚马逊下单怎么不砍单)

    亚马逊下单后怎么付款(亚马逊下单怎么不砍单)

  • 手机如何显示双屏(手机如何显示双语)

    手机如何显示双屏(手机如何显示双语)

  • 手机不能锁屏怎么办(手机锁屏不能锁怎么办)

    手机不能锁屏怎么办(手机锁屏不能锁怎么办)

  • 华为荣耀7x怎么装双卡(华为荣耀7x怎么调屏幕亮度时间)

    华为荣耀7x怎么装双卡(华为荣耀7x怎么调屏幕亮度时间)

  • ctrl+e没反应(ctrl+e按了没反应)

    ctrl+e没反应(ctrl+e按了没反应)

  • 滴滴顺风车安全吗(女生一个人坐滴滴顺风车安全吗)

    滴滴顺风车安全吗(女生一个人坐滴滴顺风车安全吗)

  • 苹果无线耳机能关机吗(苹果无线耳机能给华为用吗)

    苹果无线耳机能关机吗(苹果无线耳机能给华为用吗)

  • 谷歌官网为什么进不去(为什么谷歌网上商店打不开)

    谷歌官网为什么进不去(为什么谷歌网上商店打不开)

  • 小米步数在哪设置(小米步数设置)

    小米步数在哪设置(小米步数设置)

  • 京东自营店如何开店(京东自营店如何投诉客服)

    京东自营店如何开店(京东自营店如何投诉客服)

  • mysqld-nt.exe - mysqld-nt是什么进程 有什么用

    mysqld-nt.exe - mysqld-nt是什么进程 有什么用

  • WEB核心【会话技术】第十五章(web2.0核心)

    WEB核心【会话技术】第十五章(web2.0核心)

  • 如何利用Linux命令检查和对比两个文件内容区别(linux如何使用)

    如何利用Linux命令检查和对比两个文件内容区别(linux如何使用)

  • 个人所得税纳税记录
  • 递延所得税资产借贷方向
  • 印花税的缴纳方式有哪三种
  • 一般纳税人购买二手车可以抵扣嘛
  • 分销佣金税务处理
  • 取得虚开普票怎样补增值税
  • 缴纳上个月增值税要先计提吗
  • 公司的车不处理违章可以吗
  • 个人捐赠支出税前扣除条件
  • 小规模超过30万附加税减半吗
  • 土地款发票是否可以抵扣
  • 一般纳税人企业所得税多久申报一次
  • 天猫国际的店铺是正品吗 感觉很便宜
  • 一次性发放年终奖怎么税务筹划
  • 空白增值税报表在哪下载
  • 回拨工费经费怎么做会计分录?
  • 材料短缺赔偿会计分录怎么写?
  • 哪些计入应收账款
  • 互联网合同范本
  • 文化建设事业费逾期申报有罚款吗
  • 劳务费开发票还要代扣代缴吗?
  • 增值税科目设置的凭证处理方面的特殊要求
  • 城市垃圾处理费怎么申报
  • 补开去年的发票怎么结转成本?
  • 基本户转移到别的银行怎么转移
  • 其他货币资金包括存出保证金吗
  • 电子税务局如何查进项发票
  • 财务报表申报完可以修改吗
  • 增值税留抵税额会计科目
  • 房产税的征收范围为
  • 年终奖发放与补发的区别
  • 偷渡者视频
  • intel me有什么用
  • 交易性金融资产是什么意思
  • php中defined什么意思
  • 增值税发票没认证 可以重新开吗
  • Java8 Stream流Collectors.toMap当key重复时报异常(IllegalStateException)
  • 分公司注销,总公司账务处理
  • 不动产司法拍卖税费
  • ERROR: Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
  • phpmyadmin无法登陆mysql数据库
  • php实现上传文件
  • 为什么递延收益不产生所得税影响
  • 原材料存货跌价准备会计分录
  • 什么是附加税举个例子
  • 跨年度多计提的附加税怎么做分录
  • 股东转股怎么办理
  • 以前年度盈余调整对应科目
  • 流动资产比例大说明什么
  • 工会经费税务代收是什么意思
  • 固定资产怎么进行无形资产清理的
  • 收据和发票有什么用
  • 进项税额是怎么算的
  • 利润分配科目是所有者权益科目吗
  • 企业将购进的原材料分录
  • 软件开发过程中,一个错误发现的越晚
  • 初次建账应准备哪几种会计本
  • 在mysql中,删除表的外键约束的关键字为()
  • u极速u盘启动官网
  • centos5.5加固
  • mac入门视频教程
  • find按照文件大小查找
  • centos 查看用户命令
  • win7旗舰版玩dnf总是未响应
  • android view动画
  • 将网页改换成黑白
  • html标签自动换行
  • linux脚本自启
  • 批处理/l
  • js遍历获取指定数据
  • jquery事件的响应
  • linux shutdown命令详解
  • shell脚本ll
  • java script教程
  • js中的?
  • 晋税通注册
  • 江西省发票查询系统
  • 如何填写财产申报表
  • 华为西安总代理
  • 北京市地税总局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设