深层次理解数组

数组

在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.返回要删除的元素

posted @ 2020-11-23 22:18  xiong~~  阅读(23)  评论(0)    收藏  举报