代码之家  ›  专栏  ›  技术社区  ›  nandu kk

为什么这个'do'while'循环在结束后重复最后一个值?[复制品]

  •  1
  • nandu kk  · 技术社区  · 7 年前

    我在谷歌浏览器控制台中尝试了下面的代码,我得到了这个输出。为什么还要印4张呢?

    var i = 0;
    
    do{
      console.log(i);
      i++;
    } while(i < 5);

    输出:

    0
    1
    2
    3
    4
    4
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   kiddorails    7 年前

    最后没有多余的4个。你的循环是正确的,工作正常:)。这是 i++ 你错以为是表情 console.log 在开发人员控制台中。试试这个,你会发现的;

    var i=0;do{console.log('i = ', i);i++;}while(i<5);

    编辑 感谢@ggorlen指出这一点,它是块中最后一个表达式的返回值( {} 这是 i++ , i 增加值并返回它的最后一个值(如果i=4; i++ 返回4并使值i=5),”( ++i ,返回5并使值i=5)

    var i=0;do{console.log('i = ', i);++i;}while(i<5);
    

    返回值为5

        2
  •  2
  •   Felix Kling    7 年前

    javascript的概念是 "Completion Records" 。基本上每个语句都会生成一个完成记录。

    完成类型是用来解释值和控制流的运行时传播的记录,例如执行非本地转移的语句(中断、继续、返回和抛出)的行为。

    在用户地域代码中,通常不能使用这些,但运行时需要这些程序正确执行程序。然而,Chrome控制台将打印其执行的最后一条语句的完成记录的值。

    不必多说细节,下面是发生的事情:


    演示此行为的最简单示例是

    42;
    

    计算此表达式的结果 陈述 是一个看起来像

    {
      type: normal,
      value: 42,
      target: empty
    }
    

    你会看到它印出来的 42 在控制台中,因为这是表达式语句的完成记录的值。

    一个稍微进化的例子:

    if (true) {
      42;
    }
    

    将打印相同的。

        3
  •  0
  •   inafalcao    7 年前

    是的,额外的4个是正常的。 它叫 表达式求值 . ID并不意味着它是打印,而是评估。 i 给你。

    检查 here 去了解更多。

    这只是Chrome帮助您了解变量的动态环境。