为什么`do`–`while`循环在结束后重复最后一个值?

时间:2018-06-22 17:42:58

标签: javascript google-chrome-devtools

我在Google Chrome控制台中尝试了以下代码,并获得了此输出。为什么还要再打印4张?

var i = 0;

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

输出:

0
1
2
3
4
4

3 个答案:

答案 0 :(得分:5)

最后没有多余的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

答案 1 :(得分:2)

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

  

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

您通常无法在用户登陆代码中对其进行任何操作,但是运行时需要这些来正确执行程序。但是,Chrome控制台会打印它执行的最后一条语句的完成记录的值。

在不涉及太多细节的情况下,会发生以下情况:


展示此行为的最简单示例就是

42;

对该表达式 statement 求值的结果是一个完成记录,看起来像

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

您将在控制台中看到它打印42,因为那是表达式语句的完成记录的值。

一个稍微进化的示例:

if (true) {
  42;
}

将打印相同的内容。

答案 2 :(得分:0)

是的,多加4是正常的。 称为表达评估。 ID并不表示它正在打印,而是向您评估i

选中here以了解更多信息。

这仅仅是Chrome,可以帮助您了解变量的动态环境。