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

JavaScript函数getComputerChoice为何有时返回undefined?

问题原因与修复方案

核心问题

你代码里的if/else if判断逻辑犯了一个关键错误:每次判断条件时都调用了一次randomLetterGen(),这意味着三次判断用的是三个完全独立的随机结果,而不是同一个固定的随机值。

举个具体场景:

  1. 第一次调用randomLetterGen()返回s,第一个if判断"s" == "r"不成立,跳过;
  2. 第二次调用randomLetterGen()生成新的随机值r,第二个else if判断"r" == "p"不成立,跳过;
  3. 第三次调用randomLetterGen()生成新的随机值p,第三个else if判断"p" == "s"不成立,跳过;
  4. 此时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:53:23