js数组底层实现

本文探讨了JavaScript数组的两种实现方式——快数组和慢数组,快数组提供高效的查询性能,而慢数组利用散列表实现灵活的增删改操作。JS数组在元素类型不一致或空元素过多时会自动转换。此外,还介绍了数组的扩容策略,例如长度变为1.5倍加16。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值