欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js数组底层实现

程序员文章站 2022-06-30 19:40:29
...

js数组底层实现

传统意义的数组

传统意义上的数组是插入和删除是很耗费性能的,数组的长度是固定的超出数组初始的长度的时候就会抛出异常,但是查询操作非常的优秀,要增加一个超过数组长度的元素时,需要自行将数组扩容,再增加该元素。同一个数组中 所有元素的类型必须是一样的。

快数组

  • 定义:快数组是基于下标就能够快速访问的数据结构即 传统意义上的数组

慢数组

  • 定义:慢数组的实现是基于HasTable实现的 散列表,能够方便的增加,删除,修改,且能够存放不同类型的元素,由于慢数组使用的是不连续的内存,就没有了内存连续的限制,能够动态的分配内存,就代表着可以方便的增加元素,删除元素,但是在查询方面的性能要低于快数组

数组转换

通过其他文章了解到了js数组的底层实现,也知道了js数组不一样的原因,玩过js的都知道js可以存放不同类型的数据,可以像栈一样 先进先出,可以直接push或者unshift一个元素。这些都是和其他类似java, c++,c#等数组不一样的地方。

通过v8源码得知,js数组在声明的时候如果元素类型不一致时js内部就自动将数组装换为慢数组,在数组中空元素的个数大于1024时也会自动将数组转换为慢数组

var arr = [1,2];
arr[1027] = 1;  // 那么就有1025个元素是空元素,这时底层就会将数组转换成慢数组来节约内存

for(let i=0; i< 800; i++){

	arr[i+2] = i;
}
// 通过上面的代码填充空元素后 ,满数组就会自动转换成快数组,方便访问数据,当慢数组的元素可存放在快数组中且长度在 smi 之间且仅节省了50%的空间,则会转变为快数组
smi 在64位计算机中范围是 -2^312^31 - 1
arr = [1, "a", {}];  // 元素类型不同时也会自动转换为慢元素

//js添加元素
arr = [];
arr.push(1); // 在js底层实现中是进行了扩容处理的,并不是表面上看到的这样直接添加到数组末尾的
// 扩容后的长度 = 旧容量的1.5倍 + 16