【问题标题】:JavaScript while loop in console prints extra results [closed]控制台中的 JavaScript while 循环打印额外的结果 [关闭]
【发布时间】:2013-05-25 11:06:26
【问题描述】:

谁能解释为什么以下代码在作为函数的一部分运行时有效,但在 Chrome 控制台窗口中自行运行时会产生奇怪的结果?

var foo = function() { 
    var x = 1;
    while (x<3) { 
        console.log(x);
        x = x+1;
    }
}

foo(); // This prints 1,2 as expected

但是当我直接在 Chrome 控制台中运行 while 部分时,我得到 1,2,3 这没有任何意义(请参见输出图像):

    var y = 1;
    while (y<3) { 
        console.log(y);
        y = y+1;
    }

    // This prints 1,2,3 in the console

请注意,关于console.log 有一些类似的问题导致undefined (Chrome/Firefox console.log always appends a line saying undefined),但在我的示例中没有函数调用,while 不会返回任何值。

【问题讨论】:

  • 你有 jsFiddle 来证明你的说法吗?
  • 如果第二个返回那个,你应该用浏览器换一个更新的版本吗?
  • @fenderog 都为我记录了相同的日志,正如预期的那样 - 1,2
  • 朋友们,在你投反对票之前,这是一个比你想象的更合理的问题。尝试将第二段代码粘贴到 Chrome 控制台中,您就会明白为什么它可能会令人困惑。
  • @Isaac 和 Lucero - 你确实是对的:最初措辞的问题绝对令人困惑。 (很抱歉我最初的评论措辞严厉 - 我把它调低了!)迈克克里斯滕森对问题进行了出色的编辑,添加了一个屏幕截图,显示了 Chrome 开发工具的令人困惑的输出。用那个截图好多了!

标签: javascript google-chrome console


【解决方案1】:

您被 Chrome 的 JavaScript 控制台误导了。

除了console.log() 调用的输出之外,控制台还会显示您在其中运行的代码中执行的最后一个表达式的值。

在您的第一个示例中,最后一个表达式是末尾的 foo(); 调用。 foo() 不返回任何值,因此结果为 undefined,这就是在 console.log(y) 调用 print 的 12 之后打印的内容。

在第二个示例中,console.log() 仍然只被调用了两次,再次打印 12。之后打印的3 不是来自console.log() 调用,它是执行的最后一个表达式的值,最后一个y = y + 1;y 带到3 并导致while 循环终止。

这是另一个例子。将此代码粘贴到控制台中:

var y = 1, message = '';
while( y < 3 ) { 
    console.log( y );
    y = y + 1;
    message = 'y is ' + y;
}

现在打印出来了:

1
2
"y is 3"

12 再次像以前一样来自 console.log(y) 调用。与其他示例一样,在代码运行完成后,它会打印最后执行的表达式——但现在该表达式是:

message = 'y is ' + y;

其中y 又是3

或者一个更简单的例子。在控制台中输入:

console.log( 'Hi!' );

打印出来:

Hi!
undefined

Hi! 是您正在执行的console.log()undefinedconsole.log() 调用的返回值

这里的另一个线索是每个示例中打印到控制台的最后一个值左侧的小符号。看起来该符号表示开发工具正在自动打印该值,而不是来自 console.log() 调用。

【讨论】:

  • 啊,谢谢。那个“3”字的解释是什么?
  • 也许chrome开发者认为输出终止条件对其他开发者有帮助..
  • 啊,你说得对!如果可以的话,我会删除我的反对票..
  • @fenderog 这对于评估表达式很有用:我可以输入2 + 2 并立即返回4,而不是执行console.log(2+2)。另外,如果我做了x = 4 然后自己运行“x”行怎么办?您希望它输出表达式x 的值吗?
  • @apsillers,输出表达式结果很有用,但在 JS 中,while 循环不是一个表达式,这就产生了一个问题,即为什么它在这种情况下会输出一些东西(并且,由方式,如果您添加分号,这将更改为undefined)一个非常有效的分号。 ;)
【解决方案2】:

它不仅限于控制台,如下所示:

<script>
console.log(eval("var y = 1;while (y<3) { console.log(y);y = y+1;}"))
</script>

这是复制输出的粗略方法,但可能会注意到eval 将以相同的方式执行

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2015-11-28
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多