Appearance
JS中数组的本质
在JS中数组存在两种形式,一种是在内存中分配连续地址的线性存储方式;一种是以
HashTable
结构存储的慢数组。
引子
- JavaScript里的数组,存储数据在内存中是连续的还是不连续的?
- 面试官: 100万个成员的数组取第一个和最后一个有性能差距吗?
- 为什么JS里的数组可以存储对象?
- 为什么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