V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
imjeen
V2EX  ›  问与答

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

  •  
  •   imjeen · 2016-09-20 23:24:56 +08:00 · 1539 次点击
    这是一个创建于 2985 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在处理一个比较大的数据,看到很多人基本趋向于使用 [数组] 存取数据,而很少使用对象,当然有考虑数组有很多内部封装的方法。那么就有礼这样的思考:

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

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


    ## 猜想

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

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


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

    Array 的性能基于实现,实现比较简单的 JS 引擎当然就是直接用 Object 来做 Array ,但现在的 JS 引擎都有大量优化,并不会这么做。
    sodatea
        3
    sodatea  
       2016-09-21 01:17:46 +08:00   ❤️ 1
    1. 取值不需要遍历
    2. 稀疏数组的表现一般跟对象一样,稠密数组遍历肯定比对象快
    3. 固定格式(用 constructor 创建)的对象比普通对象的操作快
    4. 以上只是 v8 的优化,不同引擎优化方式不同,性能表现不同,但是一般来说稠密数组优化起来最容易
    5. 自己写 benchmark 得到的结果最准确,这里有个很好的例子: http://stackoverflow.com/a/8584173/2302258
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1164 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:18 · PVG 02:18 · LAX 10:18 · JFK 13:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.