我不懂简单的 JavaScript 'while 循环'

Posted

技术标签:

【中文标题】我不懂简单的 JavaScript \'while 循环\'【英文标题】:I don't understand a simple JavaScript 'while loop'我不懂简单的 JavaScript 'while 循环' 【发布时间】:2016-08-25 14:08:53 【问题描述】:

我目前正在Code Academy 上学习 javascript,我在 while 循环部分的末尾。

以下代码:

j = 0;
while (j < 3) 
    j++;

在控制台上产生一个2,我不知道为什么。我尝试在Eclipse JaveEE 上运行它,却发现使用带有此代码的html 文件作为脚本会给我带来不同的结果:空白页。

这对我来说很有意义,因为我只是将j 增加到3,但没有打印出来。不知道为什么 CodeAcademy 控制台给了我 2。

这是控制台输出的截图:

【问题讨论】:

这是完整的代码吗?您在某个时候返回 2,因此它出现了。您的 while 循环没有要在控制台上打印的控制台语句。 代码中的 console.log() 语句在哪里 只是一个控制台,返回最后一个表达式的值。这种行为非常棘手,所以现在最好不要去想它。 @virendrao 不应该有一个 - 控制台在每种情况下都会输出一些值。 也许 codeacademy 控制台正在取最后一句话的值。当最后一个 j++ 被执行时,表达式本身被计算为 2,因为后增量运算符的计算返回变量在增量之前的值。执行后j等于3,但最后一句话的评价是2。 【参考方案1】:

您观察到的行为是因为浏览器控制台就是这样工作的。

对于您评估的每个代码,它都会尝试返回一些值。对于琐碎的表达式,这很容易 - 2 + 2 可能会返回 4

对于由多个语句组成的代码,它要复杂得多,并且控制台尝试变得聪明。更复杂的是控制台的行为不是标准化的,因此我们目前观察到的给定浏览器不能保证适用于另一个浏览器或同一版本的另一个版本。

让我们试着找出发生了什么:

j = 0;
while (j < 3) 
    j++;

对于此代码,浏览器会尝试智能并输出最新找到的表达式的值,在本例中为j++;。它返回2,因为这是循环终止前最后一次迭代中j 的值。而且由于后缀增量在修改它之前返回当前值 - 它返回2

如果我们把它改成

j = 0;
while (j < 3) 
    ++j;

出于同样的原因,输出将是 3。

现在让我们尝试一些不同的东西:

j = 0;
while (j < 3) 
    j++;
    a = 42;

这将输出42。由于a = 42 是此代码中的最新表达式。

j = 0;
while (j < 3) 
    j++;
    var a = 42;

对于此示例,它将再次返回 2,因为控制台决定忽略赋值语句并恢复为最新的表达式。

总结:这种行为不是标准化的,浏览器只是试图有用并输出一些东西,即使它不是你所期望的。所以我的建议是不要依赖隐式的控制台输出,而是明确地使用console.log(),以防你想得到结果。

【讨论】:

控制台并没有真正尝试做任何聪明的事情。它只是给出正在执行的eval() 的结果。 @squint 不需要返回eval() 的结果。顺便说一句,很想在浏览器中看到相应的实现。 是的,我并不是说他们必须这样做。我只是说这就是他们正在做的事情(很可能无论如何),而不是试图执行聪明的分析技巧。源代码会很有趣。

以上是关于我不懂简单的 JavaScript 'while 循环'的主要内容,如果未能解决你的问题,请参考以下文章

当我不懂很多术语时如何学习编程?

20)内联函数(其实,我不懂)

javascript题目:获取所有的checkbox?

温故而知我不懂的CSS

我不懂微服务:RPC远程调用

我不懂微服务:RPC远程调用