JavaScript函数getComputerChoice为何有时返回undefined?
问题原因与修复方案
核心问题
你代码里的if/else if判断逻辑犯了一个关键错误:每次判断条件时都调用了一次randomLetterGen(),这意味着三次判断用的是三个完全独立的随机结果,而不是同一个固定的随机值。
举个具体场景:
- 第一次调用
randomLetterGen()返回s,第一个if判断"s" == "r"不成立,跳过; - 第二次调用
randomLetterGen()生成新的随机值r,第二个else if判断"r" == "p"不成立,跳过; - 第三次调用
randomLetterGen()生成新的随机值p,第三个else if判断"p" == "s"不成立,跳过; - 此时
cpuInput从未被赋值,自然返回undefined。
关于Math.random()*3≥2的现象解释
Math.random()*3≥2对应randomNumGen()返回2,也就是字符s。但这并不是导致undefined的直接原因——只是当某次随机到s时,另外两次随机结果恰好让三个条件都不匹配的概率存在,你刚好观察到了这个场景。本质还是三次独立随机导致的判断逻辑失效。
修复代码
只需要调用一次randomLetterGen(),把结果存起来,再用这个固定值去判断:
function getComputerChoice(){ function randomLetterGen(){ function randomNumGen(){ return Math.floor(Math.random()*3); } let word = "rps"; return word.charAt(randomNumGen()); } const cpuChoice = randomLetterGen(); // 仅生成一次随机值 let cpuInput; if (cpuChoice == "r"){ cpuInput = "rock"; } else if (cpuChoice == "p"){ cpuInput = "paper"; } else if (cpuChoice == "s") { cpuInput = "scissors"; } return cpuInput; } console.log(getComputerChoice());
另外,原函数的参数randomLetterGen是多余的,因为内部重新定义了同名函数,参数被覆盖,所以直接删掉即可。
内容的提问来源于stack exchange,提问作者jnam
相关产品推荐
相关产品推荐

