zoukankan      html  css  js  c++  java
  • Effective JavaScript Item 49 对于数组遍历,优先使用for循环,而不是for..in循环

    本系列作为Effective JavaScript的读书笔记。

     

    对于以下这段代码,能看出最后的平均数是多少吗?


    var scores = [98, 74, 85, 77, 93, 100, 89];
    var total = 0;
    for (var score in scores) {
    	total += score;
    }
    var mean = total / scores.length;
    mean; // ?


    通过计算,最后的结果应该是88

     

    可是不要忘了在for..in循环中,被遍历的永远是key。而不是value,对于数组相同如此。

    因此上述for..in循环中的score并非期望的98 74等一系列值,而是0 1等一系列索引。

     

    所以你或许会觉得最后的结果是:

    (0 + 1+ + 6) / 7 = 21

     

    可是这个答案也是错的。另外一个关键点在于,for..in循环中key的类型永远都是字符串类型,因此这里的+操作符运行的实际上是字符串的拼接操作:

     

    最后得到的total实际上是字符串00123456

    这个字符串转换成数值类型后的值是123456。然后再将它除以元素的个数7,就得到了最后的结果:17636.571428571428

     

    所以,对于数组遍历,还是使用标准的for循环最好:


    var scores = [98, 74, 85, 77, 93, 100, 89];
    var total = 0;
    for (var i = 0, n = scores.length; i < n; i++) {
    	total += scores[i];
    }
    var mean = total / scores.length;
    mean; // 88
    

    毕竟对于这样的for循环。开发者是再熟悉只是了。绝对不会将索引变量i当做是值。而且标准的for循环也可以保证循环的顺序。保证这一点对于浮点数的算术操作十分重要。

     

    在以上的代码中。也运用到了一个小优化。

    就是在循环開始前计算好了数组的长度作为循环边界。当在for循环中不会对数组本身进行加入/删除元素操作时,可以略微提升一点性能。这样就不会在每次循环都对集合的长度进行查询了。

     

    总结:

    1. 当遍历数组时,使用标准的for循环,而不要使用for..in循环。
    2. 在必要的场合考虑预先保存数组的长度,以提高性能。


  • 相关阅读:
    QT小技巧
    C#通用类库设置开机自运行禁用任务管理器注册表等操作
    C#通用类库农历类(很全面)
    C#通用类库导出数据(比其他方式快200倍)
    如果你想当程序员!请看!
    C#通用类库汉字转拼音
    C#通用类库加密解密类
    C#制作图片压缩工具
    QT编写图片数据转换工具
    C++面试题 virtual
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7054646.html
Copyright © 2011-2022 走看看