关于 javascript 的对象和数组在性能上的思考和比较

2016-09-20 23:24:56 +08:00
 imjeen
最近在处理一个比较大的数据,看到很多人基本趋向于使用 [数组] 存取数据,而很少使用对象,当然有考虑数组有很多内部封装的方法。那么就有礼这样的思考:

数组:使数据有序存取,有序的,有更多的封装方法;
而对象是简单的键值存取,某种意义上是无序的, 键不重复(声明时,后面重复的键会覆盖前面的),可以说数组是一个特殊的对象。

那么,存放同样的大量数据,取同一个值,它们的(平均)性能会有差别吗?


## 猜想

从数组中取值,需要遍历(先抛开各种遍历算法),
获得对象的键的值,内部自身也会遍历(寻址)到对应的键(键是不重复的)

从遍历的角度来讲, for 和 for...in 都可以遍历,但数组有更多封装的方法遍历( forEach , map 等)


数组作为对象的一个特殊对象,是不是从某种意义上(同等条件、均衡)遍历时, 性能上会更加好呢?
1538 次点击
所在节点    问与答
3 条回复
bdbai
2016-09-21 00:41:40 +08:00
再给楼主丢个坑
ES6 的 Map/Set/WeakMap/WeakSet
for...of
YuJianrong
2016-09-21 00:43:52 +08:00
看不懂你在说啥。

Array 的性能基于实现,实现比较简单的 JS 引擎当然就是直接用 Object 来做 Array ,但现在的 JS 引擎都有大量优化,并不会这么做。
sodatea
2016-09-21 01:17:46 +08:00
1. 取值不需要遍历
2. 稀疏数组的表现一般跟对象一样,稠密数组遍历肯定比对象快
3. 固定格式(用 constructor 创建)的对象比普通对象的操作快
4. 以上只是 v8 的优化,不同引擎优化方式不同,性能表现不同,但是一般来说稠密数组优化起来最容易
5. 自己写 benchmark 得到的结果最准确,这里有个很好的例子: http://stackoverflow.com/a/8584173/2302258

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/307676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX