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

  • vivox70怎么更换主题(vivox70怎么更换壁纸)

    vivox70怎么更换主题(vivox70怎么更换壁纸)

  • 电脑错误代码651怎么解决(错误代码0xc000014c开不了机)

    电脑错误代码651怎么解决(错误代码0xc000014c开不了机)

  • cpu有什么用(坏了的cpu有什么用)

    cpu有什么用(坏了的cpu有什么用)

  • 无gui引导的后果(无gui引导什么意思)

    无gui引导的后果(无gui引导什么意思)

  • 一个iphone id可以登录几个设备(一个iphone id可以登录几个手机,每个手机密码可不一样)

    一个iphone id可以登录几个设备(一个iphone id可以登录几个手机,每个手机密码可不一样)

  • 小红书无法修改头像(小红书无法修改封面)

    小红书无法修改头像(小红书无法修改封面)

  • 拍立得mini7c和7s区别(拍立得mini7c和mini9相纸通用吗)

    拍立得mini7c和7s区别(拍立得mini7c和mini9相纸通用吗)

  • ecf12服务器连接失败是什么意思(ecf12服务器连接失败)

    ecf12服务器连接失败是什么意思(ecf12服务器连接失败)

  • 录音好以后怎么发QQ群文件里(录音以后怎么发给发到微信朋友)

    录音好以后怎么发QQ群文件里(录音以后怎么发给发到微信朋友)

  • qq账号为什么被冻结(qq账号为什么被冰冻了)

    qq账号为什么被冻结(qq账号为什么被冰冻了)

  • qq操作过于频繁请稍后再试怎么办(qq操作过于频繁,不能评论)

    qq操作过于频繁请稍后再试怎么办(qq操作过于频繁,不能评论)

  • 绿洲怎么移除粉丝(绿洲移出粉丝)

    绿洲怎么移除粉丝(绿洲移出粉丝)

  • 拨号失败无法连接到通话网络是什么意思(拨号失败无法连接到移动网络)

    拨号失败无法连接到通话网络是什么意思(拨号失败无法连接到移动网络)

  • word文档生成条码(word里怎么生成条形码)

    word文档生成条码(word里怎么生成条形码)

  • 手机怎么收听电台(手机如何收听)

    手机怎么收听电台(手机如何收听)

  • 爱奇艺pps怎么切换模式(爱奇艺怎么切屏)

    爱奇艺pps怎么切换模式(爱奇艺怎么切屏)

  • word2003简历模板在哪(word里面的简历模板)

    word2003简历模板在哪(word里面的简历模板)

  • 华为al00是什么型号(华为al00是什么系列)

    华为al00是什么型号(华为al00是什么系列)

  • stkal00什么型号(下一页p20)

    stkal00什么型号(下一页p20)

  • 联发科p90手机有那些(联发科p90t)

    联发科p90手机有那些(联发科p90t)

  • ps照片放大模糊变清晰(ps图像放大模糊怎么变高清)

    ps照片放大模糊变清晰(ps图像放大模糊怎么变高清)

  • 被翡翠湾环绕的芬尼特岛,太浩湖,加利福尼亚 (© Rachid Dahnoun/Tandem Stills + Motion)(翡翠湾攻略)

    被翡翠湾环绕的芬尼特岛,太浩湖,加利福尼亚 (© Rachid Dahnoun/Tandem Stills + Motion)(翡翠湾攻略)

  • 基于Pytorch实现的EcapaTdnn声纹识别模型(pytorch基础)

    基于Pytorch实现的EcapaTdnn声纹识别模型(pytorch基础)

  • element-ui动态表单和验证(elementui动态表单数据回显)

    element-ui动态表单和验证(elementui动态表单数据回显)

  • 一般纳税人申报纳税的流程
  • 一般纳税人的税点
  • 存货成本核算方法有哪些
  • 多缴的企业所得税办理退税怎么处理
  • 技术转让成本包括什么
  • 折扣销售销售折扣销售折让有何区别
  • 非独立核算分公司个税怎么申报
  • 一般公共预算支出是什么意思
  • 哪些发票可以报销抵税
  • 个体户个人所得税税率表2023计算
  • 股权转让印花税减半征收政策
  • 财产保险费发票税率
  • 提供建筑服务应在发票备注栏注明
  • 竹笋属于什么税目类别
  • 开票资料地址填营业执照
  • 国外发票可以报销吗
  • 所得税预缴资产怎么计算
  • 水产类账目怎么做
  • 销售应税产品分录
  • 员工迟到扣工资的会计处理
  • 收回已核销的坏账并入账是什么意思
  • excel中在多个单原格中输入相同数据
  • Win7/Win8/Win10单、多系统一键安装教程 只需30秒!
  • windows7iis安装
  • 新版edge浏览器如何打开ie浏览器
  • 债券类资产的远期合约是什么
  • 小微企业一般纳税人
  • php值传递和引用传递 原理
  • qqbak文件怎么打开
  • 苹果手机系统升级后电量消耗快
  • 单位代缴住房公积金分录
  • dghm.exe是什么程序
  • jquery向下滑动元素
  • 未注销的坏账可以转出吗
  • 税前可扣除的税费
  • php img
  • 任意公积金可以不提取吗
  • php中哪个命令用来删除当前目录
  • 黄喉蜂虎鸟是保护动物吗
  • vue项目打包后还能修改吗
  • 图表库网站
  • 固定资产折旧应计入什么费用
  • 民办学校学费收入
  • 退社保基金怎么办理
  • 托盘账务处理
  • 劳务派遣公司账务处理
  • Python打开文件的代码
  • mysql分表的3种方法
  • 报销人和收款人是一个人
  • 会务费如何入账
  • 维修费开专票怎么做账
  • 税控服务费减免月底怎样结转
  • 冲销暂估入账用什么凭证
  • 机物料消耗计入什么费用
  • 其他应付款跨年了
  • 含运费的原材料会计分录
  • 预付卡销售和充值怎么做账
  • 应收帐款表
  • 企业发票冲红的风险
  • 请问,制造企业有哪些?
  • 红字冲销凭证怎么登明细账
  • MySQL PXC构建一个新节点只需IST传输的方法(推荐)
  • linux虚拟系统
  • win7系统IE浏览器版本
  • ubuntu下安装QT教程
  • win10mobile最新版本
  • linux !!
  • python绘制球面
  • perl执行shell命令
  • 彻底弄懂js中的this指向
  • JavaScript驾驭网页-CSS与DOM
  • ssh,scp自动登陆的实现方法
  • vue router详解
  • unityprefab
  • 防止shell脚本重复执行
  • 特岗教师服务期满证书
  • 民办非企业税务登记流程
  • 广东省电子税务局电话
  • 水利基金按什么计提
  • 从量定额资源税口诀
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设