位置: 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)

  • qq音乐无缝播放怎么开(qq音乐无缝播放怎么开电脑模式)

    qq音乐无缝播放怎么开(qq音乐无缝播放怎么开电脑模式)

  • it是什么意思

    it是什么意思

  • 米notelte什么型号(小米notelte参数)

    米notelte什么型号(小米notelte参数)

  • 闲鱼处置长期生效如何处理(闲鱼处置长期生效怎么注销)

    闲鱼处置长期生效如何处理(闲鱼处置长期生效怎么注销)

  • 华为抢购排队中要多久(华为手机抢购排队中)

    华为抢购排队中要多久(华为手机抢购排队中)

  • 腾讯视频二次审核要多久(腾讯视频审核一天了)

    腾讯视频二次审核要多久(腾讯视频审核一天了)

  • 快手为什么会无缘无故的扣钱(快手为什么会无缘无故涨粉)

    快手为什么会无缘无故的扣钱(快手为什么会无缘无故涨粉)

  • 苹果支持北斗定位吗(苹果北斗定位API)

    苹果支持北斗定位吗(苹果北斗定位API)

  • 为什么苹果更新不了13.5(为什么苹果更新系统后北京公交app闪退)

    为什么苹果更新不了13.5(为什么苹果更新系统后北京公交app闪退)

  • 三星s8开机界面一串英文(三星s8开机视频)

    三星s8开机界面一串英文(三星s8开机视频)

  • 为什么保密柜的视频看不了(为什么保密柜的照片日期不对)

    为什么保密柜的视频看不了(为什么保密柜的照片日期不对)

  • 抖音怎么查看好友在线状态(抖音怎么查看好友点赞过的作品)

    抖音怎么查看好友在线状态(抖音怎么查看好友点赞过的作品)

  • 美团兑换的商家红包能退吗(美团兑换的商家红包可以变成普通红包吗)

    美团兑换的商家红包能退吗(美团兑换的商家红包可以变成普通红包吗)

  • 电子邮件传输的基本协议(电子邮件传输的工作过程)

    电子邮件传输的基本协议(电子邮件传输的工作过程)

  • 抖音聊天记录删了怎么恢复(抖音聊天记录删了还可以恢复吗)

    抖音聊天记录删了怎么恢复(抖音聊天记录删了还可以恢复吗)

  • 怎么使用uc看小电影(uc看的)

    怎么使用uc看小电影(uc看的)

  • 淘宝上拒绝签收点哪里(淘宝上拒绝签收怎么操作)

    淘宝上拒绝签收点哪里(淘宝上拒绝签收怎么操作)

  • 苹果11死机重启(苹果11死机重启不了,为什么)

    苹果11死机重启(苹果11死机重启不了,为什么)

  • 微信安全加载不出来怎么办(微信安全加载不出来怎么办苹果6手机)

    微信安全加载不出来怎么办(微信安全加载不出来怎么办苹果6手机)

  • vivox27什么时候上市的(vivox27什么时候出厂的)

    vivox27什么时候上市的(vivox27什么时候出厂的)

  • 坦白说怎么解锁线索(坦白说在哪找到)

    坦白说怎么解锁线索(坦白说在哪找到)

  • 三星s8手机什么时候上市的(三星s8手机什么处理器)

    三星s8手机什么时候上市的(三星s8手机什么处理器)

  • ios13支持分屏吗(ios13能分屏吗)

    ios13支持分屏吗(ios13能分屏吗)

  • vivo可以安装鸿蒙系统吗 安卓系统切换到鸿蒙系统注意事项(vivo手机可以安装鸿蒙)

    vivo可以安装鸿蒙系统吗 安卓系统切换到鸿蒙系统注意事项(vivo手机可以安装鸿蒙)

  • 费用的进项税额可以抵扣吗
  • 公益组织收到捐赠款计入什么科目
  • 海外工作薪资比国内高多少
  • 什么叫欠账
  • 核定征收季度核定销售额
  • 7月薪资8月发怎么交税
  • 印花税退税流程怎么操作
  • 小规模纳税人计税方法
  • 当月减少的固定资产当月停止折旧
  • 房贷抵扣个税如何设置100%
  • 个人转让著作权所得免征个人所得税吗
  • 经营二手车怎么交税
  • 年末发票
  • 支付利息的诉讼请求
  • 经营租赁是主营业务收入吗
  • 公司按最低标准缴纳社保
  • 只占股不出资
  • 银行结算方式包括哪些内容
  • 增值税专用发票有效期是多长时间
  • 税控技术服务费每年都可以抵扣吗
  • 13个点的发票实际交多少钱
  • 公司买的食用油会计分录
  • 企业预算报表如何做
  • 质押股票是否缴印花税
  • 盘亏固定资产会计处理
  • 17%和6%的票能直接抵扣吗?
  • 现金支票工本费发票
  • 发出的货物可以要求退回吗
  • i912900k用什么主板好
  • 资产负债表里的存货怎么算
  • win7电脑怎么样
  • 成本核算怎么核算
  • 存货出租的会计分录
  • 能用javascript 最终
  • php分页思路
  • 董事长报销应该是怎样的流程
  • 独立核算的分公司注销时账面怎么处理
  • wordpress限制邮箱注册
  • 工地购买的厨房用品计入哪个科目
  • 发票项目要求
  • python中numpy数组和列表的区别
  • 将织梦dedecms转换到wordpress
  • okr开源软件
  • mongodb数据表
  • 用vue做的企业项目
  • 转入固定资产清理会计科目
  • 系统带我玩隐形守护者 小说
  • sql 列转行
  • 金税盘服务费如何抵扣
  • 公司卖废品收入要交增值税
  • 境外所得抵免限额大于境外承担的所得税税额
  • 无形资产减值准备借贷
  • 业务招待费会计科目
  • 对公账户没有用了一定要注销吗?
  • 资产负债表所有者权益和利润表关系
  • 有形资产负债率多少合适
  • 建设工程中设备计入包干价是否合法
  • 专栏设计模板
  • sql server错误和使用情况报告
  • linux上mysql安装详细教程
  • 联想电脑BIOS启动键
  • win10系统设置快捷键
  • xp如何给文件夹加密码
  • efi shell有什么用
  • 电脑win 8系统
  • Linux桌面环境安装
  • w10升级失败怎么办
  • win7旗舰版怎么改成专业版
  • linux cat命令的用法
  • node执行js文件的命令是什么
  • 基于核心素养下的大单元教学设计
  • javascript如何学
  • 自定义右键属性是什么
  • json与对象的区别
  • js获取div下指定元素的值
  • 宝鸡税务局长
  • 武汉市契税减免政策
  • 广东省国家税务局电子发票系统,网络设置
  • 车辆购置税查询电话
  • 城市维护建设税税基是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设