JS栈内存与堆内存
㈠JavaScript变量
⒈分类
⑴JavaScript中的变量分为基本类型和引用类型。
⑵基本类型就是保存在栈内存中的简单数据段。
⑶引用类型指的是那些保存在堆内存中的对象。
⒉基本类型
基本类型有Undefined、Null、Boolean、Number 和String。
这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们通过按值来访问的。
⒊引用类型
⑴引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。因此是按引用访问的。
⑵栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。
⑶由于这种值的大小不固定,因此不能把它们保存到栈内存中。
⑷但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。
⑸这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问
⑸当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。
⑹其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。
⑺基本类型大小固定,引用类型大小不固定,分开存放使得程序运行占用内存最小。
㈡栈内存
⒈什么是栈内存?
栈内存:引擎执行代码时工作的内存空间,除了引擎,也用来保存基本值和引用类型值的地址。
⒉栈内存的简单介绍
⑴栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。
⑵栈内存:存放基本类型。
⑶基本类型在当前执行环境结束时销毁。
㈢堆内存
⒈什么是堆内存?
堆内存:用来保存一组无序且唯一的引用类型值,可以使用栈中的键名来取得。
⒉堆内存的简单介绍
⑴堆内存存储的对象类型数据对于大小这方面,一般都是未知的。
⑵因此当我们定义一个const对象的时候,我们说的常量其实是指针,就是const对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。
⑶ 堆内存:存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个对象。)
⑷引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃圾回收机制回收。
㈣JS中的堆内存与栈内存
⑴在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
⑵栈内存主要用于存储各种基本类型的变量;而堆内存主要负责像对象Object这种变量类型的存储。
⑶具体如下图:

㈤栈内存和堆内存的区别
1.定义不同
堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

2.特点不同
堆内存实际上指的就是优先队列的一种数据结构,第1个元素有最高的优先权;栈内存实际上就是满足先进后出的性质的数学或数据结构。栈内存是存取速度比堆要快,仅次于寄存器,栈数据可以共享。
3.范围不同
堆内存中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话动态分配堆内存,那就一直被占用。栈内存中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
参考:https://www.jianshu.com/p/4d8a952d3786
JS栈内存与堆内存的更多相关文章
- js的栈内存和堆内存
栈内存和堆内存在了解一门语言底层数据结构上,挺重要的,做了个总结 JS中的栈内存堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...
- JavaScript变量——栈内存or堆内存
原文 http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...
- 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)
不多说,直接上干货! 其中 1)程序计数器:用于指示当前线程所执行的字节码执行到了第几行,可以理解为当前线程的行号指示器.每个计数器志勇赖记录一个线程的行号,所以它是线程私有的. ...
- JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝
前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScri ...
- JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...
- Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...
- (转)java内存分配分析/栈内存、堆内存
转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...
- java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...
- 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)
1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...
随机推荐
- not or and 的优先级是不同的
not or and 的优先级是不同的: not > and > or 请用最快速度说出答案: not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 an ...
- 3-MySQL DBA笔记-开发基础
第二部分 开发篇 本篇首先讲述数据库开发的一些基础知识,如关系数据模型.常用的SQL语法.范式.索引.事务等,然后介绍编程开发将会涉及的数据库的一些技巧,最后结合生产实际,提供一份开发规范供大家参考. ...
- 在javascript对象内搜索,貌似是一个新鲜的话题。
为啥 也不为啥,因为没找到. 用途 也没啥用途,比如,在电影网站找到链接,在小说网站找到链接.二货同事写的复杂对象.等等吧.反正要搜索就对了. 目标 在对象内,无论多少层,找到关键字. 关键字可能的位 ...
- python 的常见排序算法实现
python 的常见排序算法实现 参考以下链接:https://www.cnblogs.com/shiluoliming/p/6740585.html 算法(Algorithm)是指解题方案的准确而完 ...
- Spark RDD学习笔记
一.学习Spark RDD RDD是Spark中的核心数据模型,一个RDD代表着一个被分区(partition)的只读数据集. RDD的生成只有两种途径: 一种是来自于内存集合或外部存储系统: 另一种 ...
- 原生js实现选项卡样式切换的几种方式。
先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...
- 利用浏览器做好数字进制和ASCII码及Unicode教与学
浏览器是现在个人计算机的标配,一般来说一个PC至少安装一种以上的浏览器.主流网页浏览器有Google Chrome.Internet Explorer.Microsoft Edge.Mozilla F ...
- Asp.net Core 微信小程序支付
最近要做一个微信小程序支付的功能 在网上找了一下 .net Core做微信支付的博客 和 demo 几乎没有 自己研究了好几天 参考了 很多 大牛的博客 勉强做出来了 因为参数都没有 比如 opid ...
- golang在linux后台执行的方法
go build ./index.go 会生成一个index的运行文件 nohup index & 后台运行index文件 killall index 你可能还要关闭index set GOA ...
- ABAP下载的病毒扫描Virus Scan
当我使用CL_HTTP_ENTITY=>IF_HTTP_ENTITY~GET_DATA从网络下载数据时,遇到异常CX_VSI: 错误原因是数据从网络下载到Netweaver服务器上之后,在服务器 ...