本系列作为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. 在必要的场合考虑预先保存数组的长度,以提高性能。

最新文章

  1. 使用VC6开发opengl配置
  2. sencha touch建立新项目
  3. 基于jQuery编写的横向自适应幻灯片切换特效
  4. 关于TableView中出现deallocated问题
  5. Android的Touch系统简介(一)
  6. 需要熟悉的几个调试命令:objdump/pmap/ldd/stace
  7. Linux系统中如何添加自己的库文件路径
  8. Android项目---快递查询
  9. bat脚本-set(setlocal enabledelayedexpansion) 学习
  10. 简单介绍如何使用robotium进行自动化测试
  11. Android 7.1 ActivityManagerService 屏幕旋转流程分析 (四)
  12. python-day71--django多表双下划线查询及分组聚合及F/Q查询
  13. Jquery——几个注意的小知识
  14. Mac下常用快捷键(转)
  15. Golang报错mixture of field:value and value initializers
  16. Mac OS X 11年9个版本的历经变化
  17. #进阶系列——WebApi 身份认证解决方案:Basic基础认证
  18. Java 面向对象编程 tricks
  19. Xamarin XAML语言教程对象元素的声明方式
  20. EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传

热门文章

  1. poi API大全
  2. java整型byte,short,int,long取值范围大小
  3. Eclipse下的java工程目录问题和路径问题理解
  4. fedora linux源代码下载
  5. 在 RedHat/CentOS 7.x 中使用 nmcli 命令管理网络
  6. MAVEN创建并打包web项目
  7. bzoj1066: [SCOI2007]蜥蜴(最大流)
  8. ServiceStack.Redis之IRedisClient&lt;第三篇&gt;【转】
  9. Opencv 编译
  10. HD-ACM算法专攻系列(13)——How Many Fibs?