循环执行Javascript的确切顺序是什么?

时间:2015-04-16 02:52:59

标签: javascript loops for-loop

我对在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;有点事吗?

3 个答案:

答案 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

重要提示:

后缀一元++运算符的作用如下:

  1. 我们返回变量
  2. 当前值
  3. 我们增加变量的值
  4.   

    跳过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循环加载到控制台中以用于演示目的,但您可以根据需要评估任何代码的操作顺序。