2.1基础数据类型与变量对象
最新的 ECMAScript 标准号定义了7种数据类型,其中包括六种基础数据类型与一种引用数据类型 (Object)
基础类型如下:
类型 | 值 |
---|---|
Boolean | true与false |
Null | null |
Undefined | undefined |
Number | 所有数字 |
String | 所有字符串 |
Symbol | symbol 类型的值 |
2.2 引用数据类型与堆内存空间
我们知道简单数据类型指向栈内存,引用数据类型是指向堆内存空间。
不知道的可以科普一下,或者继续往下看,有助于理解
//demo01
let a=20;
let b=a;
b=30
//这时a的值是多少
//demo02
let m={
a:10,
b:20
}
let n=m;
n.a=15;
//这时m.a的值是多少
在demo01中基础数据类型发生了一次复制行为。在demo02中,引用数据类型发生了一次复制行为。
-
demo01中,通let b =a 发生复制之后,虽然a与b的值都等于20,但简单数据类型赋值其实就是重新开辟一个栈内存。所以当我们修改了 b的值以后, a的值并不会发生改变
image.png
-
demo02中,let n=m发生复制,引用类型的复制会使它们指向同一个堆内存,因此n.a=15,也改变了堆内存的数据,所以m.a=15
image.png
2.3内存空间管理
let a=10
alert(a+10)
a=null
上面的 条语句,分别对应如下三个过程:
1.分配内存;
2.使用分配到的内存;
3.不需要时释放内存
分配内存与使用内存都比较好理解,我们需要重点理解的是第三个过程 这里涉及 JavaScript垃圾回收机制的实现原理
JavaScript 的垃圾回收实现主要依靠“引用”的概念 当一块内存空间中的数据能够被访问时,垃圾回收器就认为“该数据能够被获得”。不能够被获得的数据,就会被打上标记,并回收内存空间。这种方式叫作 标记 清除算法
这个算法会设置一个全局对象,并定期地从全局对象开始查找,垃圾回收器会找到所有可获得与不能够被获得的数据
因此在上面这个例子中,当我们将a设置为 null 时,那么刚开始分配的 10 ,就无法被访问到了,而是很快会被自动回收
注意:在局部作用域中,当函数执行完毕后,局部变量也就没有存在的必要了,因此垃圾收集器很容易做出判断并回收。但是在全局中,变量什么时候需妥自动释放内存空间则很难判断,因此我们在开发时,应尽量避免使用全局变量 如果使用了全局变量,则建议不再使用它时,通过a= null 这样的方式释放引用,以确保能够及时回收内存空间。