Skip to content

JS中数组的本质

在JS中数组存在两种形式,一种是在内存中分配连续地址的线性存储方式;一种是以HashTable结构存储的慢数组。

引子

  1. JavaScript里的数组,存储数据在内存中是连续的还是不连续的?
  2. 面试官: 100万个成员的数组取第一个和最后一个有性能差距吗?
  3. 为什么JS里的数组可以存储对象?
  4. 为什么typeof Array是对象?

正文

快数组

与数据结构的数组一样的内存形式,线性存储。数组长度可变,是内部通过扩容和收缩机制实现,类似Java中的ArrayList扩容形式,达到一定的阈值则拷贝内存到一个更大的空间中。

慢数组

是一种哈希表的内存形式。不用开辟大块连续的存储空间,节省了内存,但是由于需要维护这样一个 HashTable,其效率会比快数组低。

js
var LIMIT = 6 * 1024 * 1024;
var arr = new Array(LIMIT);
arr.push(10);console.time("Array");
for (var i = 1; i < LIMIT; i++) arr[i] = i;
console.timeEnd("Array")
// Array: 414.39892578125 ms

参考

探究JS V8引擎下的“数组”底层实现

深入理解Js数组

V8引擎