我对在Codepen中玩的特定for循环的确切执行顺序感到有些困惑。看看这两个循环,它们都做同样的事情:
var a = ['orange','apple'];
for (var i=0; i<2;i++) {
alert(a[i]);
}
for (var j=0, fruit; fruit = a[j++];) {
alert(fruit);
}
您可以在此处查看此操作:http://codepen.io/nickbarry/pen/MYNzLP/
第一个循环是编写for循环的标准,vanilla方式。正如预期的那样,它会警告&#34; orange&#34;然后&#34; apple&#34;。
我使用MDN的建议写了第二个循环(搜索&#34; idiom&#34;,这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript)。
它有效,但我不太明白为什么。我对for循环的理解,在某种程度上显然是不正确的(不止一种方式?)是: * for循环在第一次运行之前评估第二个表达式的真实性。因此,当for循环正在评估第二个表达式的真实性时,它应该在设置fruit的值之前增加j。因此,第一次通过循环,水果应该等于&#34; apple&#34;。 *并且循环应该只运行一次,因为在第一次通过之后,当它再次评估第二个表达式以查看它是否仍然为真时,它应该再次增加j,然后再返回一个值水果,因为在索引位置2没有值,它应该返回一个假结果,然后退出循环。
我不明白究竟发生了什么。在评估第二个表达式之前,for循环是否运行一次?但这似乎是不可能的,因为如果发生这种情况,警报会在第一时间发出警报,因为水果还没有价值。
此外,MDN文章的作者似乎喜欢编写循环的第二种方式 - 是否有更好的方法?它使用较少的字符,这是好的,我想。跳过for循环中的第三个表达式可以节省大量时间吗?或者它只是一个很酷的因为它很聪明&#34;有点事吗?
答案 0 :(得分:5)
for (var j=0, fruit; fruit = a[j++];) {
alert(fruit);
}
伪代码等于:
initialize j = 0 and fruit = undefined
assign fruit = a[j] (j = 0, fruit = 'orange')
j = j + 1 (j = 1)
check fruit for being truthy (true)
alert(fruit) ('orange')
assign fruit = a[j] (j = 1, fruit = 'apple')
j = j + 1 (j = 2)
check fruit for being truthy (true)
alert(fruit) ('apple')
assign fruit = a[j] (j = 2, fruit = undefined)
j = j + 1 (j = 3)
check fruit for being truthy (false)
exit loop
重要提示:
后缀一元++
运算符的作用如下:
跳过for循环中的第三个表达式会节省大量时间吗?
它根本不保存任何东西
此外,MDN文章的作者似乎喜欢编写循环的第二种方式 - 是否有更好的理由?
以任何方式都不是更好。作者只是认为这很酷,作者喜欢很酷(虽然他们不喜欢)。
答案 1 :(得分:0)
for循环实际上只是编写while循环的简写方式。 例如这个循环
for(var i = 0, j = 10; i < 10; i++, j++) {
alert(i + ", " + j);
}
只是一种较短的写作方式
var i = 0, j = 10;
while(i < 10) {
alert(i + ", " + j);
i++; j++;
}
这就是这个循环
for(var j=0, fruit; fruit = a[j++];) {
alert(fruit);
}
与此相同
var j = 0, fruit;
while(fruit = a[j++]) {
alert(fruit);
}
答案 2 :(得分:0)
您可以使用SlowmoJS按照JavaScript for
循环的执行顺序执行:http://toolness.github.io/slowmo-js/
主页已经将for
循环加载到控制台中以用于演示目的,但您可以根据需要评估任何代码的操作顺序。