一个问题的诞生:最近在回顾数据结构与算法的知识。看着数组的定义,突然想到Js中数组不是在一个连续内存空间中存储的。就想搞懂js中不同数据类型的数据是如何存储的。✔️
在 JavaScript 中,数组存储不同类型数据时,占用的内存空间是否一致取决于引擎的优化策略。以下是关键点:
-
引擎优化机制:
- 快速模式(Packed Elements):当数组元素类型一致(如全为数字)且连续时,V8 等引擎会使用连续内存块存储,每个元素占用固定空间(如双精度浮点数占 8 字节)。
- 字典模式(Slow Elements):若数组包含混合类型或存在空洞,引擎可能转为哈希表存储,此时每个元素独立分配内存,空间可能不一致。
-
数据类型的影响:
- 原始类型(数字、布尔等):在快速模式下占固定空间(如
number可能为 8 字节,小整数可能优化为 4 字节)。 - 引用类型(对象、字符串等):存储的是指针(固定大小,如 4 或 8 字节),但实际数据在堆中分配,占用空间不固定。
- 原始类型(数字、布尔等):在快速模式下占固定空间(如
-
实际表现:
- 同类型数组(如
[1, 2, 3]):元素内存连续且大小一致,访问速度快。 - 混合类型数组(如
[1, 'a', {}]):可能触发去优化,转为字典模式,元素内存不连续且空间不一致。
- 同类型数组(如
-
结论:
- 若数组被引擎优化为快速模式(同类型),元素存储空间一致。
- 若为字典模式(混合类型),存储空间可能不一致。
- 引用类型元素在数组中存储的指针大小一致,但指向的实际数据大小不同。
建议:在性能敏感场景中,尽量保持数组元素类型一致,以便引擎优化内存布局,提高访问效率。例如,避免在数字数组中插入字符串或对象。