Javascript while 循环返回值

IT技术 javascript loops syntax while-loop
2021-01-29 03:32:09

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

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

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

<- 9

这个返回值从何而来?

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

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

3个回答

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

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

{1 + 1; 3 + 3;}

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

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

while循环结果在此处涵盖

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

不,这些结果在代码中是不可访问的。例如,你不能做var x = while (count < 10 { count++; });或类似的。你必须捕捉到你想要的结果循环/块/等,将其分配给一个变量或类似的。或者(我不是建议这样做),eval 像 Alin 指出的那样使用.

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

如果您将代码更改为:

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

它会改为 log <- 10

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

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

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

是的,但您需要分配它:

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

console.log(lastcount);

请注意,如果您在控制台中运行此代码段,则会9记录两个s(一个来自最后一个循环,一个来自 extra console.log),然后是<- undefined,因为最后一个console.log返回undefined

@James Thorpe 我认为您的回答并不完全准确。实际上有一个返回值,您可以在不分配的情况下捕获它。
2021-04-06 03:32:09
好的,现在明白了。循环后的记录值始终是最后执行的表达式。我在想它是否与 while 条件有某种联系。但它没有。基本上,最后的任何表达式都会进入控制台日志。谢谢!
2021-04-12 03:32:09
@sachad 查看 TJ Crowder 的答案——虽然我的录音是对的,但他的在技术上更准确(我今天学到了一些新东西!)。
2021-04-13 03:32:09
@AlinPurcaru:eval正如您所指出的那样,这才是真正的元编程。(但这是一个好点。)
2021-04-14 03:32:09

我认为答案可以在eval行为中找到

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

你扔进控制台的eval()东西很可能是通过一个(或类似的东西)。最后一个评估的表达式,在你的情况下count++被返回,然后记录到控制台。由于后增量该值为9,而不是10)。

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

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

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