2016-04-30 39 views
4

我目前在Code Academy上学习JavaScript,并且我在while循环部分的末尾。我不明白一个简单的JavaScript'while循环'

下面的代码:

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

产生控制台上的2,我不知道为什么。我试着在EclipseJaveEE上运行这个,只是意识到使用这个代码的HTML文件作为脚本会给我一个不同的结果:一个空白页。

这对我很有意义,因为我只增加了j3,但没有打印。不知道为什么CodeAcademy控制台给了我2

这是控制台输出的屏幕截图:

codeacademy console output

+0

这是完整的代码?你在某个时候返回2,因此它正在出现。您的while循环没有控制台语句可以在控制台上打印。 –

+1

代码中的console.log()语句 – virendrao

+0

这只是一个控制台,它返回最后一个表达式的值。这种行为非常棘手,所以最好暂时不要考虑它。 – zerkms

回答

6

你观察到的行为,因为这是如何浏览器控制台的作品。

对于您评估的每个代码,它都尝试返回一些值。对于微不足道的表达很容易 - 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()

+0

控制台并非真的在做任何聪明的事情。它只是给出正在执行的'eval()'的结果。 – 2016-04-30 15:02:13

+0

@squint不需要返回'eval()'的结果。顺便说一句,它会很好奇在浏览器中看到相应的实现。 – zerkms

+1

是的,我不是说他们被要求。我只是说这就是他们正在做的事情(很可能无论如何),而不是试图执行聪明的分析技巧。源代码很有趣。 – 2016-04-30 21:28:21