深层次理解数组
数组
在js中,可以在数组中保存不同类型值,并且数组可以动态增长;
- 万能数组
1.作为数组:
var a=[1,2.3];
2.栈
var a=[1,2,3];
a.pop();//出栈
a.push(4);//入栈
3.队列
var a=[1,2,3];
a.push(4);//入列
a.shift();//出列
- 数组的存储
fast:快数组,存储结构是 FixedArray,push或pop时可能会伴随着动态扩容或减容;
slow:慢数组,存储结构是哈希表,并且数组下标作为key;
快数组:一段连续的内存,使用索引直接定位,新创建的空数组就是快数组;
慢数组:以哈希表的形式存储在内存空间中,需要额外维护一个哈希表,与快数组相比,性能相对较差;
- 数组的动态扩容与减容
扩容:
1.push 操作时,发现数组内存不足;
2.申请 new_capacity = old_capacity /2 + old_capacity + 16 那么长度的内存空间;
3.将数组拷贝到新内存中;
4.把新元素放在当前 length 位置;
5.数组的 length + 1;
6.返回 length;
减容:
1.pop 操作时,获取数组 length
2.获取 length - 1 上的元素(要删除的元素)
3.数组 length - 1
4.判断数组的总容量是否大于等于 length - 1 的 2 倍
5.是的话,使用 RightTrimFixedArray 函数,计算出需要释放的空间大小,并做好标记,等待 GC 回收
6.不是的话,用 holes 对象填充
7.返回要删除的元素