堆数据结构

堆数据结构是一种树状结构。它的存取数据的方式与书架和书非常相似。我们只需要知道书的名字就可以直接取出书了,并不需要把上面的书取出来。JSON格式的数据中,我们存储的key-value可以是无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。

队列

队列是一种先进先出(FIFO)的数据结构,这是事件循环(Event Loop)的基础结构。

变量的存放

首先我们应该知道内存中有栈和堆,那么变量应该存放在哪里呢,

  • 1、基本类型 --> 保存在内存中,因为这些类型在内存中分别占有固定大小的空间,通过按值来访问。基本类型一共有6种:Undefined、Null、Boolean、Number 、String和Symbol
  • 2、引用类型 --> 保存在内存中,因为这种值的大小不固定,因此不能把它们保存到栈内存中,但内存地址大小的固定的,因此保存在堆内存中,在栈内存中存放的只是该对象的访问地址。当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。

在计算机的数据结构中,栈比堆的运算速度快,Object是一个复杂的结构且可以扩展:数组可扩充,对象可添加属性,都可以增删改查。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。所以查找引用类型值的时候先去查找再去查找。

几个问题

问题1:

var a = 20;
var b = a;
b = 30; // 这时a的值是多少?

问题2:

var a = { name: '前端开发' }
var b = a;
b.name = '进阶'; // 这时a.name的值是多少

问题3:

var a = { name: '前端开发' }
var b = a;
a = null; // 这时b的值是多少

现在来解答一下,三个问题的答案分别是20进阶{ name: '前端开发' }

  • 对于问题1,a、b都是基本类型,它们的值是存储在栈中的,a、b分别有各自独立的栈空间,所以修改了b的值以后,a的值并不会发生变化。
  • 对于问题2,a、b都是引用类型,栈内存中存放地址指向堆内存中的对象,引用类型的复制会为新的变量自动分配一个新的值保存在变量对象中,但只是引用类型的一个地址指针而已,实际指向的是同一个对象,所以修改b.name的值后,相应的a.name也就发生了改变。
  • 对于问题3,首先要说明的是null是基本类型,a = null之后只是把a存储在栈内存中地址改变成了基本类型null,并不会影响堆内存中的对象,所以b的值不受影响。

内存空间管理

JavaScript的内存生命周期是

  • 1、分配你所需要的内存
  • 2、使用分配到的内存(读、写)
  • 3、不需要时将其释放、归还

JavaScript有自动垃圾收集机制,最常用的是通过标记清除的算法来找到哪些对象是不再继续使用的,使用a = null其实仅仅只是做了一个释放引用的操作,让 a 原本对应的值失去引用,脱离执行环境,这个值会在下一次垃圾收集器执行操作时被找到并释放。

在局部作用域中,当函数执行完毕,局部变量也就没有存在的必要了,因此垃圾收集器很容易做出判断并回收。但是全局变量什么时候需要自动释放内存空间则很难判断,因此在开发中,需要尽量避免使用全局变量。

最新文章

  1. 数据结构:二叉查找树(C语言实现)
  2. 2013/10/24初学BOOST
  3. CentOS 7虚拟机下模拟实现nginx负载均衡
  4. java基础-变量
  5. IBM powerVM VIOS
  6. Open Sans字体兼容问题解决办法[font-face]
  7. java中关于集合的知识点梳理
  8. List<T>
  9. 鸟哥私房菜笔记:Iptables:数据包过滤软件
  10. phaser源码解析(一) Phaser.Utils类下shuffle方法
  11. tree btn
  12. V5.7_UTF8_SP1、SP2---任意前台用户登录(cookie伪造)
  13. 纯手写SpringMVC框架,用注解实现springmvc过程
  14. Constructor >> @Autowired >> @PostConstruct
  15. python 函数递归与匿名函数
  16. Egret 项目文件夹配置和基本容器、动画
  17. Leetcode——66.加一
  18. elastastic search
  19. OpenFlow PacketOut消息机制
  20. Python:正则表达式概念

热门文章

  1. c# 第19节 Arraylist数组
  2. 201871010119-帖佼佼《面向对象程序设计(java)》第十七周学习总结
  3. xSS-Reflected
  4. TCP协议的粘包问题(八)
  5. hbase链接失败
  6. zz在自动驾驶研发中充分发挥数据的潜能
  7. hdu3068-最长回文-马拉车(Manacher)算法
  8. requests--会话对象,ssl验证
  9. 【转】K-Means聚类算法原理及实现
  10. shell脚本特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)