博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中的堆栈
阅读量:5806 次
发布时间:2019-06-18

本文共 1153 字,大约阅读时间需要 3 分钟。

  • 栈(stack) 栈stack为自动分配的内存空间,它由系统自动释放;
  • 堆(heap) 堆heap是动态分配的内存,大小不定也不会自动释放。
JavaScript 中的变量分为基本类型和引用类型。
  • 基本类型 (Undefined、Null、Boolean、Number和String)
    基本类型在内存中占据空间小、大小固定 ,他们的值保存在栈(stack)空间,是按值来访问
  • 引用类型 (对象、数组、函数)
    引用类型占据空间大、大小不固定, 栈内存中存放地址指向堆(heap)内存中的对象。是按引用访问的

如下图所示:栈内存中存放的只是该对象的访问地址, 在堆内存中为这个值分配空间 。 由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。

image

当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。

栈内存&堆内存

为了使程序运行时占用的内存最小,通常要实现垃圾回收机制。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈存里,随着方法的执行结束,这个方法的栈存也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本开销较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

思考问题

demo1.var a = 1;var b = a;b = 2;// 这时a是?

demo1中在变量对象中的数据发生复制行为时,系统会自动为新的变量分配一个新值。var b = a执行之后,b虽然重新赋值为2,但是他们其实已经是相互独立互不影响的值了。

demo2.var m = { a: 1, b: 2 }var n = m;n.a = 2;// 这时m.a的值呢?

demo2中我们通过var n = m执行一次复制引用类型的操作。引用类型的复制同样也会为新的变量自动分配一个新的值保存在变量对象中,但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,但是在变量对象中访问到的具体对象实际上是同一个。因此当我改变n时,m也发生了变化。这就是引用类型的特性。

转载地址:http://qhubx.baihongyu.com/

你可能感兴趣的文章
Log4Net 配置说明
查看>>
MSSQL和oracle数据通讯
查看>>
MVC内容background-image: url('')问题
查看>>
springboot~rabbitmq的队列初始化和绑定
查看>>
Working with SharePoint’s Discussion Lists Programmatically – Part 1
查看>>
iOS 对overflow:scroll使用
查看>>
Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈
查看>>
CDH升级 5.7.5 --> 5.13.3(tar包方式)
查看>>
Vue.js 基本功能了解一下~
查看>>
[转]Kinect for Windows SDK开发入门(二):基础知识 上
查看>>
二维子数组和的最大值
查看>>
dl以及dt,dd,以及table的tr,th,td最清楚分析
查看>>
瓣数字阅读计划上线 作者可直接获取收益
查看>>
phpcms V9实现wap上一篇、下一篇功能
查看>>
phpcms v9 wap内容页内容显示方法
查看>>
jQuery异步提交与JSON解析
查看>>
第七次作业--项目需求分析(团队)
查看>>
nsoperation
查看>>
GET和POST
查看>>
html5 audio组件禁止下载
查看>>