【问题标题】:Javascript while loop return valueJavascript while循环返回值
【发布时间】:2016-05-29 00:21:32
【问题描述】:

我有一个关于 Javascript 中的 while 循环的简单问题。 当我在浏览器控制台中运行这个简单的循环时:

var count = 0;
while (count < 10) {
    console.log(count);
    count++;
}

控制台日志的输出是 0,1,2...9。 (如预期)。 但是还有一个数字返回到控制台:

<- 9

这个返回值从何而来?

我假设这是count++ expression 的返回值。但是为什么不是每个循环都返回值呢?

是否有可能以某种方式将该返回值捕获到变量中?

【问题讨论】:

标签: javascript loops syntax while-loop


【解决方案1】:

当您直接在浏览器控制台中运行代码时,它会运行代码然后记录最后执行的表达式的值,在本例中为 count++ 的值,在最终执行时为 9(它已更改到10 使用后自增运算符,即在值9 为“读取”之后)。

如果您将代码更改为:

var count = 0;
while (count < 10) {
  console.log(count);
  ++count;
}

它会改为记录&lt;- 10

但是为什么不是每个循环都返回值呢?

因为它根本没有被返回,它只是控制台的行为。

是否有可能以某种方式将该返回值捕获到变量中?

是的,但您需要分配它:

var count = 0;
var lastcount;
while (count < 10) {
  console.log(count);
  lastcount = count++;
}

console.log(lastcount);

请注意,如果您在控制台中运行此 sn-p,您将记录两个 9s(一个来自最终循环,一个来自额外的 console.log),然后是 &lt;- undefined,因为最后一个console.log 返回undefined

【讨论】:

  • 好的,现在知道了。循环后的记录值始终是最后执行的表达式。我在想它是否与 while 条件有关。但事实并非如此。基本上,无论最后的表达式是什么,它都会进入控制台日志。谢谢!
  • @sachad 查看 T.J. 的答案。 Crowder - 虽然我的录音是正确的,但他的录音在技术上更准确(我今天学到了一些新东西!)。
  • @James Thorpe 我认为您的回答并不完全准确。实际上有一个返回值,你可以在不分配它的情况下捕获它。
  • @AlinPurcaru:正如你所指出的,只有eval,这真的是元编程。 (但这是一个很好的观点。)
【解决方案2】:

Read-eval-print-loops (REPL) 类似于浏览器控制台显示代码生成的最后结果。有点令人惊讶的是,JavaScript while 循环和块有一个结果。对于块,它是块中最后一条语句的结果。对于while 语句,它是附加到while 的语句的最后一次迭代的结果(在您的情况下是一个块)。

这是一个简单的例子,只有一个块:

{1 + 1; 3 + 3;}

在像浏览器控制台这样的 REPL 中,上面会显示 6,因为它是一个包含两个 ExpressionStatements 的块。第一个 ExpressionStatement 的结果是 2(那个结果被扔掉了),第二个的结果是 6,所以块的结果是 6。这是covered in the specification

  1. blockValue 为评估 StatementList 的结果。
  2. 将正在运行的执行上下文的 LexicalEnvironment 设置为 oldEnv。
  3. 返回blockValue

while 循环结果为covered here

是否有可能以某种方式将该返回值捕获到变量中?

不,这些结果无法在代码中访问。例如,您不能执行 var x = while (count &lt; 10 { count++; }); 或类似操作。您必须在循环/块/等捕获您想要的结果,将其分配给变量或类似的。或者(我建议这样做),使用evalas Alin points out

【讨论】:

    【解决方案3】:

    我觉得可以在behavior of eval找到答案:

    eval() 返回最后一个表达式的值。

    您在控制台中输入的内容很可能是通过eval()(或类似的东西)传递的。最后一个评估的表达式,在你的情况下count++被返回,然后记录到控制台。 (值是 9,而不是 10,因为是后增量)。

    我不认为你可以存储评估的结果,除非你明确地把它通过另一个eval()

    var x = eval("var count = 0;while (count < 10) {console.log(count);count++;};");
    

    或者,在 Google Chrome 控制台中,您可以使用$_

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2023-03-16
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多