You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript循环100次console.log为何控制台未输出100条结果

问题产生原因

这个问题是JavaScript运算符优先级规则+控制台重复日志折叠机制共同导致的,具体逻辑:

  • 你的else分支中,字符串拼接和算术减法没有做优先级隔离:...around, "+i-1+" bottles...这段代码里,+和-优先级相同、遵循左结合规则,运算顺序是先把前面的歌词内容和i拼接成完整字符串,再执行减1操作。
  • 带非数字文字的字符串无法转成有效数字,和数字做减法会得到NaN,之前拼接好的所有歌词内容会在这一步直接丢失,最终输出只有固定的NaN bottles of beer on the wall.这段内容。
  • i从99到2一共98次循环,每次输出的内容完全一致,浏览器控制台会自动折叠重复的日志,在日志前标注重复次数,你看到的“98”是控制台的重复计数,不是日志本身的内容,这也是为什么你只看到一条异常输出,而不是98条。
  • 当i降到1和0的时候,走的是单独写的if/else if分支,没有混入算术减法,所以这两条输出正常。
修复方法

只需要给i-1加上小括号,强制先计算减法得到数值结果,再参与字符串拼接即可,修复后的完整代码:

function bottles_of_beer(){
    var i=99;
    while(i>=0){
        if(i==1){
            console.log(i+" bottle of beer on the wall, "+i+" bottle of beer.\nTake one down and pass it around, No more bottles of beer on the wall.");
        }
        else if(i==0){
            console.log("No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.");
        }
        else{
            // 给i-1加括号,优先计算算术结果
            console.log(i+" bottles of beer on the wall, "+i+" bottles of beer.\nTake one down and pass it around, "+(i-1)+" bottles of beer on the wall.")
        }
        i--;
    }
}

注:上面代码顺便修正了i=1时的单复数问题,原代码i=1时用了复数bottles,不符合常规歌词表述,如果不需要可以改回复数形式。修复后每个i对应的输出内容都不重复,控制台不会折叠,就能正常打印100条完整歌词。

内容的提问来源于stack exchange,提问作者arin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:31:02