likes
comments
collection
share

数据结构中对数据的定义与js数组一样吗?

作者站长头像
站长
· 阅读数 32

前言

今天闲来无事,想去学点什么,但好像不知道该学点什么,于是就想什么东西是通用的。哎,对了算法呀,既能提升思维又能活跃脑子,于是就点开了让我疑惑万分的那个视频。

里面讲述了数据结构中的数组在其中我了解到了数组定长,数组的长度是不可变的也就是所谓的数组定长,但在js中不用管是因为js引擎会自动扩容,而扩容会影响性能,以下是我对这么视频的总结。

视频总结

数组特性:

  • 存储在物理空间上是连续的
  • 底层的数组长度是不可变的。
  • 数组的变量,指向了数组第一个元素的位置。

优点:

  • 查询性能好,指定查询某个位置。

缺点:

  • 因为空间必须得是连续的,所以如果数组比较大,当系统的空间碎片较多的时候,容易存不下。
  • 因为数组的长度是固定的,所以数组的内容难以被添加和删除。

视频末尾:

  • 综上所述,当确定数组的最大长度时,最好还是使用new Array(n)来定义数组,这样能提升性能。
  • 因为这样不会触发js引擎的自动扩容而自动扩容会降低性能。

疑惑

这样乍一看,很合理对吧,其实它自身确实是没什么问题的(狗头保命),问题就出在js这一块。既然他说会影响性能,那不得马上去实践实践,可这一实践就蒙圈了。

const date=new Date().getTime()
console.log(date);
const arr=new Array(10000000)
for(let i=0;i<=10000000;i++){
    arr.push(i)
}
console.log(new Date().getTime()-date)

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

const date=new Date().getTime()
console.log(date);
const arr=[]
for(let i=0;i<=10000000;i++){
    arr.push(i)
}
console.log(new Date().getTime()-date)

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

大家可以看出用new Array()的方式稳定在720ms左右,但直接字面量的创建方式只有150ms左右。

我直接???

说好的自动扩容会增加性能呢,如果说两者性能差不多那就算了,这差的。。。一言难尽啊。于是我赶紧去查阅文献。

查阅文献

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

数据结构中对数据的定义与js数组一样吗?

既然他都这么说了,那我肯定要去试试 数据结构中对数据的定义与js数组一样吗? 哦豁,不错哟!

那我们再来看看小数组的结果

数据结构中对数据的定义与js数组一样吗? 然而在小数组里面没啥差别,完全可以忽略不计(因为毫秒下还有更小的单位)。

文献地址:www.zhihu.com/question/38…

总结

  • js数组是有容量和扩容的
  • v8引擎中new Array(n)会存在空洞从而影响到性能

我的看法

这篇文献正解决了我的疑问,因为空洞导致这性能变高,但是在正常开发中也不会用到这么大的数组,基本都会做虚拟列表或分页查询,而在小数组中的差别完全可以忽略不计。所以本人还是更推荐用字面量的方式去创建,因为字面量易懂、代码量小、开发人员更喜欢。当然,特殊情况特殊对待。

最后有什么问题欢迎各位大佬指出,各位有见解的老哥轻点喷,本人只是个前端小白。

转载自:https://juejin.cn/post/7366818154821320755
评论
请登录