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;
它会改为记录<- 10
。
但是为什么不是每个循环都返回值呢?
因为它根本没有被返回,它只是控制台的行为。
是否有可能以某种方式将该返回值捕获到变量中?
是的,但您需要分配它:
var count = 0;
var lastcount;
while (count < 10)
console.log(count);
lastcount = count++;
console.log(lastcount);
请注意,如果您在控制台中运行此 sn-p,您将记录两个 9
s(一个来自最终循环,一个来自额外的 console.log
),然后是 <- 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 < 10 count++; );
或类似操作。您必须在循环/块/等内捕获您想要的结果,将其分配给变量或类似的。或者(我不建议这样做),使用eval
as 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 循环间歇性地无限运行?