数据
- 是什么
- 本质为二进制
- 特点
- 可读
- 可传递 b=a 注意:万物皆数据,函数也是数据
内存
- 是什么?
- 内存条通电后产生的存储空间(临时)
- 产生:通电;结束:断电
- 栈主要存储 基本变量、占用内存小
- 堆主要存储 引用、地址 对象,占用空间大
变量
- 是值可以变化的量
数据、内存、变量三者的关系
* 赋值操作传递的是地址值
* 变量保存的是基本变量类型
* 对象保存地址值
内存是一个容器, 用来存储程序运行需要操作的数据
变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据
JavaScript如何管理内存
- 释放内存:
- 没有引用的时候将对象的值赋为null,在堆中释放,但是栈中的变量没有释放
- 为执行函数分配的栈空间内存: 函数执行完自动释放(函数自上而下的执行,执行完毕后的函数不再执行,释放掉)
- 注意:闭包
- 垃圾回收机制GC:1、垃圾回收器会定时清理内存中不再继续使用的变量
- 2、由于垃圾回收器清除内存的开销比较大,所以不是实时清除,而是定时清除
- 3、当一个变量不再继续被使用时,就会被垃圾回收器清除掉。清除一般分为两种:计数清除、标记清除
- 计数清除:指针个数为1时,不会被清除,但是有缺陷。如下:
-
var foo={}; var bar={}; foo.a=bar; bar.b=foo; //此时指针个数永远不会为0
- 4、清除的一般为局部变量,闭包除外。
- 闭包的作用:延长外部函数局部变量的声明周期
- 关于闭包,详见:适合初级前端程序员:闭包是什么?