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

歹佬们,问个 js 小问题?

  •  1
     
  •   gaocc · 2022-01-25 16:01:20 +08:00 · 1449 次点击
    这是一个创建于 1067 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 vue2 框架里看到这样一段代码,有个细节没看懂

    function getTypeIndex (type, expectedTypes): number {
      if (!Array.isArray(expectedTypes)) {
        return isSameType(expectedTypes, type) ? 0 : -1
      }
      for (let i = 0, len = expectedTypes.length; i < len; i++) {
        if (isSameType(expectedTypes[i], type)) {
          return i
        }
      }
      return -1
    }
    

    for (let i = 0, len = expectedTypes.length; i < len; i++)

    这行代码框架里是这样的

    for (let i = 0; i < expectedTypes.length; i++)

    一般习惯是这样的

    框架这种写法有什么好处吗?

    9 条回复    2022-01-25 16:45:39 +08:00
    clcx
        1
    clcx  
       2022-01-25 16:10:06 +08:00   ❤️ 1
    上满减少了计算次数,中间的比较语句只需要和一个固定值比较;
    下面每次都要先计算数组长度,再进行比较
    gaocc
        2
    gaocc  
    OP
       2022-01-25 16:14:54 +08:00
    @clcx 哦哦对哦,一下没反应过来。thanks
    kop1989smurf
        3
    kop1989smurf  
       2022-01-25 16:15:37 +08:00
    同意楼上。
    拆开就能看出区别了,一个是:if(i<30),一个是 if(i<xx.length)
    循环 n 次,下面就多获取了 n-1 次数组的长度。
    murmur
        4
    murmur  
       2022-01-25 16:16:03 +08:00
    我刚才搜了一下,对于新浏览器没区别的,你知道缓存,浏览器也不是傻子,大多数场景下你感觉不出这个优化,还是要靠不要频繁操作 dom 来获取性能
    sgiyy
        5
    sgiyy  
       2022-01-25 16:16:31 +08:00
    一般是作为性能优化的手段,用变量缓存后面重复调用的数据。涉及不同的场景,实际效果可能还不一样。
    也可以看下这个讨论: https://www.zhihu.com/question/29714976
    murmur
        6
    murmur  
       2022-01-25 16:16:51 +08:00   ❤️ 1
    https://stackoverflow.com/questions/9592241/javascript-is-the-length-method-efficient

    Iterating over a thousand items, using array.length will only cost you an extra 2 ms. In other words: beware premature optimization.

    1000 词循环只多不到 2ms ,换句话说,不要过度优化
    gaocc
        7
    gaocc  
    OP
       2022-01-25 16:42:47 +08:00
    gaocc
        8
    gaocc  
    OP
       2022-01-25 16:43:59 +08:00
    看了下,性能问题没大区别。就凸显一个代码习惯和角度问题吧
    我以后应该都是这样方式了 for (let i = 0, len = expectedTypes.length; i < len; i++)
    xujiahui
        9
    xujiahui  
       2022-01-25 16:45:39 +08:00
    就一个习惯问题吧,现在浏览器已经优化的很好了,没必要搞很复杂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   913 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:50 · PVG 05:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.