JavaScript中for循环的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中for循环的理解相关的知识,希望对你有一定的参考价值。

var num = 0;

for (var i = 0; i < 10; i++)
for (var j = 0; j < 10; j++)

num++;


alert(num);

var num1 = 0;

for (var i = 0; i < 10; i++)
for (var j = 0; j < 10; j++)
if (i == 5 && j == 5)
break ;

num1++;


document.write(num1 + "<br />");

为什么第一个的结果是100,为什么第二个是95,是如果理解的

当然啦,,,break的用法是跳出最近的一个循环.在这里,单i==5,j==5,时跳出j的循环,继继续执行i=6,所以在j的循环里少执行了5次,就是95 参考技术A if (i == 5 && j == 5)
break ;
主要是这个,当i=5和j=5同时成立时,就打破 for (var j = 0; j < 10; j++) 这个循环,本来正常循环num1会+多5次,分别是i=5 和j=5,j=6,j=7,j=8,j=95次,所有结果是95
参考技术B 第一个100很好理解:10*10

第二个95:10*10-(当i=5&&j=5时,遇到了break语句。那么j=5,6,7,8,9这几个都不会执行num1++了,而直接跳转到了最外层的for循环,最外层的for从i=6开始继续循环。所以少了5个)追问

请问10*10是怎么理解的

追答

当第一层for循环的i=0时,进入第二层for循环。j要从0一直循环到9才会退出循环(10次)。然后第一层for循环i=1,又一次进入到第二层for循环。也就是,每一次进入第二层循环,都要循环10次。

那么,第一层循环一共要循环几次,10次。所以num=10*10,是100.

本回答被提问者和网友采纳

javascript中的for循环变体

【中文标题】javascript中的for循环变体【英文标题】:For loop Variations in javascript 【发布时间】:2012-04-13 23:32:03 【问题描述】:

在this 网站上有一个 for 循环变体列表。我可以理解for(var i=0, len=arr.length; i&lt;len ;i++) 循环的用法(其中arr 是一个数组),因为arr.length 不是在每一步都计算出来的,因此似乎有边际性能增益。但是,使用其他变体有什么优势?例如,像

这样的循环
    for (var i=arr.length; i--;) for (var i=0, each; each = arr[i]; i++)

使用不同的 for 循环变体时,性能是否有明显变化?我通常使用for(var i=0, len=arr.length; i&lt;len ;i++),即使是非常大的数组。所以我只想知道我在这里是否遗漏了什么。

【问题讨论】:

“递减”循环在 js 中要快得多。至于最后一个我不会使用它,因为在 js false==0=="" . JavaScript - Are loops really faster in reverse...?的可能重复 @camus 第二个在循环时很有用,例如。 DOM 元素的集合。 这个jsperf 测试所有循环... @ManseUK +1 为 JSPerf。这是谷歌搜索“jsperf for loops”的第一个结果 【参考方案1】:

人们普遍认为,一个反向的while循环

var loop = arr.length;
while( loop-- ) 

是类 C 语言中最快的循环类型(这也适用于 ECMAscript 很长一段时间,但我认为所有最新的引擎即使在今天的标准循环上也相当不错)。 (jsperf)

您的“变体”实际上没有变体,只是for-loopconditional 语句的不同用法(这实际上使它成为变体..doh!)。喜欢

1)for (var i=arr.length; i--;)

只需使用for-loop 中的条件部分来完成这两项工作,迭代并检查i 是否具有真值。只要i 变为0,循环就会结束。

2) for (var i=0, each; each = arr[i]; i++)

这里我们从每次迭代中获取元素,所以我们可以直接在循环体中访问它。当您厌倦了总是重复arr[ n ] 时,这通常会使用。

您在循环之前缓存.length 属性方面做得很好。正如您正确提到的,它更快,因为我们不必在每次迭代中访问该属性。除此之外,在处理像HTMLCollections 这样的“活动结构”时,有时在 DOM 脚本中也需要它。

【讨论】:

【参考方案2】:

关键是当你递减迭代器时,你实际上是在将它与 0 而不是长度进行比较,因为“、>= 运算符需要在左侧进行类型检查,所以速度更快和右侧的运算符来确定应该使用什么比较行为。

最快的循环是:(当然如果你不关心顺序)

var i = arr.length
while(i--)


如果您确实关心订单,那么您使用的方法就可以了。

【讨论】:

【参考方案3】:

根据jsperf,JavaScript 中最快的循环类型是

var arr = new Array(10);
var i = 0;
while (i < arr.length) 
 arr[i];
 i++;
;

就在(我的默认循环)之前

var arr = new Array(10);
for (var i = 0; i < arr.length; ++i) 
 arr[i];
;

这是最慢的:

var arr = new Array(10);
arr.forEach(function(x) 
 x;
);

至少在 OSX 10.7.3 上的 Chrome 17 上。所以看起来“默认”循环毕竟很好!!!

【讨论】:

这些 jsperf 测试非常有用。谢谢!【参考方案4】:

这是对每个循环的不好使用,因为它会在错误值上失败,从而打破循环。

for (var i=0, each; each = arr[i]; i++)

我也不会使用这个循环(即使它可能会更快......)

for (var i=arr.length; i--;)

它看起来很混乱,可读性较差,你不妨写成反向while循环。

【讨论】:

以上是关于JavaScript中for循环的理解的主要内容,如果未能解决你的问题,请参考以下文章

理解 javascript 嵌套 for 循环的问题 [关闭]

译文理解 JavaScript 中的 for…of 循环

如何快速理解JavaScript 中重要语句for循环

javascript紧接上一张for循环的问题,我自己的理解

javascript中的for循环变体

javascript中的for循环是如何执行的?