Javascript while循环返回值

Posted

技术标签:

【中文标题】Javascript while循环返回值【英文标题】:Javascript while loop return value 【发布时间】: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 的返回值。但是为什么不是每个循环都返回值呢?

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

【问题讨论】:

我只得到 0-9 @PrakashSharma 将其直接粘贴到控制台中 - OP 正在谈论 value displayed after running the code。 请点击此链接,它可能对您有所帮助。 ***.com/questions/31434942/… 【参考方案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:

    blockValue 为评估 StatementList 的结果。 将正在运行的执行上下文的 LexicalEnvironment 设置为 oldEnv。 返回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 控制台中,您可以使用$_

【讨论】:

以上是关于Javascript while循环返回值的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - while 循环间歇性地无限运行?

[译]Javascript中的do-while循环

各位懂软件,的分别使用while和do…whil循环输出1—10之间的所有数字,包括1和10这题咋做

为啥javascript不会在while循环中堆叠

Javascript,while循环返回

使用while循环语句和变量输出九九乘法表