【问题标题】:Why does this `do`–`while` loop repeat the last value after the end? [duplicate]为什么这个`do`-`while`循环在结束后重复最后一个值? [复制]
【发布时间】:2018-12-02 05:45:29
【问题描述】:

我在 Google Chrome 控制台中尝试了以下代码,我得到了这个输出。为什么要多打印 4 个?

var i = 0;

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

输出:

0
1
2
3
4
4

【问题讨论】:

  • 没有多余的4
  • 这是返回值,您将其误认为是 console.log。试试var i=0;do{console.log('i = ', i);i++;}while(i&lt;5);,你会明白的
  • @Taplar:至少在 Chrome 中打印undefined
  • 请注意,Chrome 的控制台在最后一个 4 旁边放了一个小“
  • 这里是另一个例子:if (true) { 5 }。 Chrome 控制台显示语句的completion record 的值,仅此而已。

标签: javascript google-chrome-devtools


【解决方案1】:

最后没有多余的 4。你的循环是正确的并且工作得很好:)。这是i++ 表达式的返回值,您在开发者控制台中将其误认为console.log。试试这个,你会明白的;

var i=0;do{console.log('i = ', i);i++;}while(i&lt;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

【讨论】:

  • 我会说:var i=0;do{console.log(i);i++;}while(i&lt;5); 返回4,这是最后一个 :)
  • 具体是i++语句的返回值,要明确。在控制台中试一试:var i = 0; i++; 输出将为0i 中存储的值为 1。
  • 与@Andrew 担保
  • 你好,你能不能也说说你的返回值是什么意思。
  • @nandukk 表达式通常在表达式执行结束时有一个值。如true 是一个返回值为true 的表达式。 (3 && 4) 是一个返回值为 4 的表达式。返回值被结合使用来创建强大的逻辑。在你的 js 旅程中阅读更多关于它的信息:)
【解决方案2】:

是的,额外的 4 个是正常的。 这称为表达式评估。 Id 并不意味着它正在打印,而是向您评估 i

查看here 了解更多信息。

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

【讨论】:

    【解决方案3】:

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

    Completion 类型是一个 Record,用于解释值和控制流的运行时传播,例如执行非本地控制转移的语句(break、continue、return 和 throw)的行为。

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

    不谈太多细节,下面是发生的事情:


    演示这种行为的最简单的例子就是

    42;
    

    评估这个表达式语句的结果是一个完成记录,看起来像

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

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

    一个稍微进化的例子:

    if (true) {
      42;
    }
    

    将打印相同的内容。

    【讨论】:

    • 因为42返回42,这就是为什么我们得到42,lmao :)
    • @Andrew:把它扩展了一点,这样点就更清楚了。
    • 我可以像这样快速理解你的答案吗:console.log(do{...}while(...)) prints 4?
    • @Andrew:不完全是,因为这在语法上无效。但是,如果有一个神奇的等价于console.log 的打印完成记录,那么printCompletion do{...}while(...) 将打印{type: normal, value: 4, target: emtpy}。 Chrome 将其中的value 取出并打印出来。
    猜你喜欢
    • 2018-04-06
    • 2017-04-18
    • 2017-06-26
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多