javascript数组是如何寻址的

606 阅读1分钟

数组一般定义:它们是内存中一段连续的存储空间,用来存储相同类型的数据。

  • 线性表
  • 连续的内存空间和相同类型的数据

所以看看JS中的数组

稀疏数组和非稀疏数组

数组中元素的索引是连续的就是非稀疏数组。

理解引擎会为非稀疏数组分配一个连续的内存空间。寻址的时候通过第一个元素的地址,然后加上下标乘上每个元素的空间来快速计算出内存地址。

稀疏的数组会通过映射的方式,比如链表来实现。

连续的数组VS链表 访问数据的差异

  • 它们插入、删除、随机访问操作的时间复杂度正好相反。
  • 数组是连续的内容空间可以借助CPU的缓存机制,比较快的读取数据。缺点是大小固定。
  • 链表支持动态扩容。数组的动态扩容需要拷贝数据。
  • 链表需要更多的空间去存指针,频繁操作也会触发垃圾回收。

引入类型化数组 于是我们就有了ArrayBuffer WebGL需要高效处理二进制数据所以需要高性能、高效率的类型化数组。

于是便有了处理ArrayBuffer的视图,比如:Int8Array,Uint8Array,Int16Array,Uint16Array…

var buffer = new ArrayBuffer(8);
var view  = new Int32Array(buffer);
view[0] = 100;

所以JS中的数组分为连续和不连续的,而且后面引入了类型化数组,提高效率。

欢迎大家指正~