一.内存的分配和使用
栈内存与堆内存
基本类型和引用类型
JS 中的数据类型,整体上来说只有两类:基本类型和引用类型。
其中基本类型包括:Sting、Number、Boolean、null、undefined、Symbol。这类型的数据最明显的特征是大小固定、体积轻量、相对简单,它们被放在 JS 的栈内存里存储。
而排除掉基本类型,剩下的数据类型就是引用类型,比如 Object、Array、Function 等等等等。这类数据比较复杂、占用空间较大、且大小不定,它们被放在 JS 的堆内存里存储。
symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:“new Symbol()”。
每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
图解堆与栈
let a = 0;
let b = "Hello World"
let c = null;
let d = { name: '修言' };
let e = ['修言', '小明', 'bear'];
第一个问题:上述五个变量分别对应哪种存储方式?
a —— Number类型 —— 基本类型 —— 栈内存
b —— String类型 —— 基本类型 —— 栈内存
c —— null —— 基本类型 —— 栈内存
d —— Object —— 引用类型 —— 堆内存
e —— Array —— 引用类型 —— 堆内存
第二个问题:上述五个变量在访问机制上有何区别?
在这里插入图片描述
在访问 a、b、c 三个变量时,过程非常简单:从栈中直接获取该变量的值。
而在访问 d 和 e 时,则需要分两步走:
- 从栈中获取变量对应对象的引用(即它在堆内存中的地址)
- 拿着 1 中获取到的地址,再去堆内存空间查询,才能拿到我们想要的数据