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

  • 安卓手机如何打开.mtz文件(安卓手机如何打开nfc功能)

    安卓手机如何打开.mtz文件(安卓手机如何打开nfc功能)

  • 闲鱼信用回收多久到账(闲鱼信用回收多少信用才可以先收款)

    闲鱼信用回收多久到账(闲鱼信用回收多少信用才可以先收款)

  • 苹果手机没有设置闹钟每天都在响怎么办(苹果手机没有设备管理和描述文件怎么信任)

    苹果手机没有设置闹钟每天都在响怎么办(苹果手机没有设备管理和描述文件怎么信任)

  • model是什么型号(oppomodel是什么型号)

    model是什么型号(oppomodel是什么型号)

  • 怎么看内屏有没有被换(怎么知道内屏有没有摔坏)

    怎么看内屏有没有被换(怎么知道内屏有没有摔坏)

  • 微博上铁粉怎么获得(微博铁粉怎么恢复)

    微博上铁粉怎么获得(微博铁粉怎么恢复)

  • ps压感设置在哪里(ps压感在哪开)

    ps压感设置在哪里(ps压感在哪开)

  • 充电宝会损坏手机电池吗(充电宝会不会把手机充坏)

    充电宝会损坏手机电池吗(充电宝会不会把手机充坏)

  • 华为p30充电慢是什么原因(华为p30充电慢是为什么)

    华为p30充电慢是什么原因(华为p30充电慢是为什么)

  • oppo老是自动静音(oppo手机怎么会自动静音)

    oppo老是自动静音(oppo手机怎么会自动静音)

  • iphone快充多少w(iphone快充要多少w)

    iphone快充多少w(iphone快充要多少w)

  • 苹果手机闪电接口有液体怎么办(苹果手机闪电接口有液体)

    苹果手机闪电接口有液体怎么办(苹果手机闪电接口有液体)

  • ipadair2能用手写笔吗(ipadair可以手写吗)

    ipadair2能用手写笔吗(ipadair可以手写吗)

  • 荣耀v30是什么屏幕(荣耀v30手机是什么屏幕)

    荣耀v30是什么屏幕(荣耀v30手机是什么屏幕)

  • 苹果8有红外线遥控功能吗(苹果手机自带红外线吗)

    苹果8有红外线遥控功能吗(苹果手机自带红外线吗)

  • 华为哪款手机支持无线充电(华为哪款手机支持红外线功能)

    华为哪款手机支持无线充电(华为哪款手机支持红外线功能)

  • iphone6s是nano卡吗(苹果6s是插小卡吗)

    iphone6s是nano卡吗(苹果6s是插小卡吗)

  • ps魔法棒在哪里(ps魔法棒在哪里找得到)

    ps魔法棒在哪里(ps魔法棒在哪里找得到)

  • 手机怎么新建txt

    手机怎么新建txt

  • 为什么运动世界校园定位不了(为什么运动世界校园跑步了没有记录)

    为什么运动世界校园定位不了(为什么运动世界校园跑步了没有记录)

  • 如何设置照片大小规格(如何设置照片大小为一寸)

    如何设置照片大小规格(如何设置照片大小为一寸)

  • 苹果x实况照片动不了(苹果x实况照片没有声音)

    苹果x实况照片动不了(苹果x实况照片没有声音)

  • 小米9pro防水吗(小米9pro5g防水吗)

    小米9pro防水吗(小米9pro5g防水吗)

  • 数字认证的功能有哪些(数字认证中的职能)

    数字认证的功能有哪些(数字认证中的职能)

  • 苹果无线耳机双击哪里(苹果无线耳机双耳怎么配对)

    苹果无线耳机双击哪里(苹果无线耳机双耳怎么配对)

  • ios12怎么关闭降频(ios12 关闭降频)

    ios12怎么关闭降频(ios12 关闭降频)

  • 小米的隐私空间在哪里(小米的隐私空间是独立空间)

    小米的隐私空间在哪里(小米的隐私空间是独立空间)

  • logger命令  系统日志记录(logparser命令)

    logger命令 系统日志记录(logparser命令)

  • 小规模纳税人预缴企业所得税
  • 零申报公司注销麻烦吗
  • 房产经纪公司成本费用
  • a3软件怎么反记账
  • 介质申报和网络申报的区别
  • 城建税和教育附加税
  • 房地产企业预售阶段企业所得税
  • 股权转让所得交所得税吗
  • 佣金是否要交所得税
  • 缴纳税费及工会经费
  • 增值税发票进项抵扣是什么意思
  • 网上买普票安全吗
  • 个人去税务局开劳务票 税点是多少
  • 学校应该缴纳的税
  • 收到承兑后背书怎么处理
  • 被扣留的质保金怎么办
  • 期末增值税如何结转
  • deepin阻止关机
  • 合同终止后发生的效果包括
  • 苹果11 关机方法
  • 进销存单据
  • scchost.exe - scchost是什么进程 有什么用
  • 退休返聘人员如何辞职
  • 土地增值税的计税依据
  • php设置中文编码
  • 纳税评估一般程序包括
  • 软件企业职工培训费税前扣除标准
  • 财务人员如何管控费用支出
  • pytorch model.module
  • 母子公司吸收合并税务处理
  • 跨行政区域是跨省吗
  • thinkphp3.1
  • 阿拉斯给加拉普
  • 封装和调用
  • 【经验分享】使用了6年的实时操作系统,是时候梳理一下它的知识点了 | 文末赠书4本
  • win11系统自动更新
  • php异常处理方法
  • 施工企业工人工资付给包工头老板需要写什么模板
  • 增值税年底抵扣
  • 个人所得税专项附加扣除赡养老人
  • mysql最新版怎么中文
  • 生育津贴和产假工资就高原则
  • 债务重组账务记忆口诀
  • 主营业务成本如何设置明细
  • 预缴增值税需要提交什么资料
  • 其他收益会计科目核算什么
  • 生产车间制造产品领用材料45000元,领用车间一半消耗
  • 房屋免租期的房子能卖吗
  • 领用材料什么会计科目
  • 如何使用费用分割单
  • sql server 数据库日志不可用
  • mysqlsum查询慢
  • sql返回一条数据
  • 不一样的萧先生
  • 微软桌面 ios
  • 如何下载苹果图书
  • XP系统安装不了游戏
  • mac如何隐藏桌面
  • 虚拟机中的centos怎么联网
  • 看视频出现弹幕怎么处理
  • wincomm.exe - wincomm是什么进程
  • cpqeadm.exe是什么进程 可以关闭吗 cpqeadm进程查询
  • win8触摸板失灵怎么办
  • win10系统如何给d盘加密
  • 基于centos6安装kvm服务
  • 使用xshell连接虚拟机需要修改哪些配置
  • 进程rundll32文件很多
  • Linux系统怎么用梯子
  • Linux如何使用clash
  • JavaScript的函数库
  • 清除电脑开机痕迹
  • mongoose教程
  • js的prepend
  • 数据类型 python
  • jquery函数大全
  • JQuery解析XML数据的几个简单实例
  • 农村医保网上如何查询
  • 广东省外经贸厅官网
  • 网上订机票怎么取票
  • 工资个人所得税法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设