【问题标题】: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
      相关资源
      最近更新 更多