为什么我的Javascript将未记录的值记录到CodeCademy控制台?

时间:2016-02-23 17:07:56

标签: javascript console.log

这已经发生了很多次,直到现在我才忽略它,但是它让我烦恼,因为我不确定我的代码是否正确。

问题在于,当我在console.log(TextA)或(TextB)中然后将值放入变量时,控制台将记录我推送给变量的值。

以下示例:

我的CodeCademy代码是:

var slaying = true;
var youHit = (Math.floor(Math.random() * 2) == 1);
var damageThisRound = Math.floor(Math.random()*5 + 1);
var totalDamage = 0;

while (slaying) {
    if (youHit) {
        console.log("Congrats, you hit");
    } else {
        console.log("You were defeated by the dragon");
    } 
    slaying = false;
}

我的控制台日志是:

Congrats, you hit
false

这是否会发生在其他人身上?这只是CodeCademy系统的一个错误,还是我的Javascript不正确?

1 个答案:

答案 0 :(得分:2)

这是因为他们的解释器与浏览器控制台非常相似,它会评估您放入其中的所有代码,并且javascript中的所有操作都具有返回值。试试这个例子:

var y = (foo = 'x');
console.log(y);

赋值操作具有返回值。当您使用evalnew Function之类的东西来评估代码时,这会变得更加明显,因为它们会显示最后解释的代码行的值,然后您会看到偶数do..while语句有一个返回值。如果您更改while语句的最后一行,您会看到记录的是最后一个值,而不是false

以下是使用eval的另一个可能更好的示例:

eval('var foo = 0; i = 0; while( i < 2 ) { i++; foo = i * 9; } ')

请注意,我没有明确记录任何内容,但由于foo = i * 9(其中i = 2)是评估的最后一行,您将在控制台中看到18。另请注意,如果我在该语句中包含var,您会看到1,因为i++将是返回值的最后一个操作(以增加混淆,{{ 1}}作业返回var)。