Javascript 循环声明中的性能差异

Javascript 循环声明中的性能差异,javascript,Javascript,这两个for循环在性能上有什么不同?为什么?迭代的最佳方式是什么 var字母= [a','b','c','d','e','f','','','',''; var start=新日期() 对于(var i=0,abc=letters.length;i,正如我在使用警报的注释测试中所提到的,这完全是胡说八道,因为它会暂停循环 例如,您可以在上比较js性能 结果如下: 更新:做了一些更好的测试 代码片段1似乎更好,因为它缓存了字母的结果 测试结果如下:在旧浏览器中,在对数组等对象进行迭代时,缓存循

这两个for循环在性能上有什么不同?为什么?迭代的最佳方式是什么

var字母=
[a','b','c','d','e','f','','','','';
var start=新日期()

对于(var i=0,abc=letters.length;i,正如我在使用警报的注释测试中所提到的,这完全是胡说八道,因为它会暂停循环

例如,您可以在上比较js性能

结果如下: 更新:做了一些更好的测试

代码片段1似乎更好,因为它缓存了字母的结果
测试结果如下:

在旧浏览器中,在对数组等对象进行迭代时,缓存循环的限制几乎总是比每次获得限制(例如array.length)要快得多。在现代浏览器中,则不是这样

缓存通常只有在被迭代的对象是脚本引擎知道在迭代过程中可能会更改但不会更改的类型时才具有显著的性能优势

例如,如果迭代到以下对象:

var nodeList=document.getElementsByTagName('*');

对于(var i=0,iLen=nodeList.length;这些东西在性能上没有差异。您的基准测试是错误的。使用诸如
alert
之类的阻塞IO操作进行基准测试是非常糟糕的。使用alerts对此进行测试已经过时,因为只要您没有单击okJS解释器优化您的代码,循环就会停止,并且一个表单通常最终会被转换实际上,这并不重要。基准测试实际上是一件非常具有挑战性的事情。不要这么快就相信基准测试,一定要阅读有关微基准测试及其风险的文章。@Qwerty for循环通常在实际循环构造中花费很少的时间,并且大部分时间都在执行有效负载-这些基准测试大多是wo不管怎样,测试的URL是什么?使用COUNSOL.LIG可能是一个阻塞操作,对于比较来说是不好的。您的测试同样糟糕。请考虑更多地了解基准和风险。jsperf@BenjaminGruenbaum关于“jsperf的危险”有没有一篇好的文章?@MaheshG专注于学习语言和结构,使用结构并形成观点。无论如何,在97%的情况下,可读性和可维护性比性能更有意义——特别是如果你正在学习一门新语言。我个人会使用
letters.forEach
,因为它是最可读和最简单的IMO——但如果它介于两者之间,我会使用一个不做abc=letters.length的,因为它不太容易打字。
var nodeList = document.getElementsByTagName('*');

for (var i=0, iLen=nodeList.length; i<iLen; i++) {
  // do stuff
}
for (var i=0; i<nodeList.length; i++) {
  // do stuff
}