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
相关产品推荐
相关产品推荐

