Chrome控制台FizzBuzz函数失效:无法替换对应数字为指定字符串
FizzBuzz代码未执行替换的问题分析
问题描述
我尝试在Chrome JavaScript控制台编写FizzBuzz测验,要求:
- 数组中能被5整除的数字替换为"Fizz"
- 能被3整除的替换为"Buzz"
- 同时被5和3整除的替换为"FizzBuzz"
- 每次调用
fizzBuzz()函数生成后续数字
但当前代码仅输出数字,未进行替换:
- 预期输出:
[1,2,"Buzz",4,"Fizz","Buzz",7,8,"Buzz","Fizz",11,"Buzz",13,14,"FizzBuzz"] - 实际输出:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
当前代码:
var output=[]; var previous = 1; function fizzBuzz(){ if (output[(previous-1)]%5===0 && output[(previous-1)]%3===0){ output.push(("FizzBuzz")); console.log(output); previous++; } else if (output[(previous-1)]%5===0){ output.push("Fizz"); console.log(output); previous++; } else if (output[(previous-1)]%3===0){ output.push("Buzz"); console.log(output); previous++; } else { output.push(previous); console.log(output); previous++; } }
失效原因
核心问题是判断条件的对象完全错误:
- 你用
output[previous-1]作为判断整除的目标,但这个值在每次调用时都是undefined:- 第一次调用时,
output是空数组,output[0]不存在,值为undefined - 后续调用时,
previous是当前要生成的数字,此时output的长度是previous-1,output[previous-1]超出数组索引范围,依然是undefined
- 第一次调用时,
undefined % 任何数字的结果都是NaN,所有if/else if条件都会判断为false,只会进入最后一个else分支,直接push数字previous,导致完全没有替换效果。
修正后的代码
把所有判断条件里的output[previous-1]替换为当前要处理的数字previous即可:
var output = []; var previous = 1; function fizzBuzz() { if (previous % 15 === 0) { // 先判断同时被3和5整除(即被15整除) output.push("FizzBuzz"); } else if (previous % 5 === 0) { output.push("Fizz"); } else if (previous % 3 === 0) { output.push("Buzz"); } else { output.push(previous); } console.log(output); previous++; }
额外优化点
- 把同时被3和5整除的判断改成
previous % 15 === 0,逻辑更简洁(15是3和5的最小公倍数) - 把重复的
console.log(output)和previous++移到条件分支外,减少冗余代码
内容的提问来源于stack exchange,提问作者victor robin
相关产品推荐
相关产品推荐

