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

JS骰子游戏校验1-6区间输入时前导零输入可通过校验问题

问题原因

  • 你的校验逻辑没有做严格的格式校验,JavaScript 对字符串和数字进行大小比较时,会自动将字符串隐式转换为数字:你测试时传入的'03'会被转成数值3,自然满足>0 && <7的条件,因此可以通过校验。
  • 额外隐藏风险:后续判断猜测是否正确时用的是宽松相等==,如果用户输入字符串格式的数字,也会和数值型的骰子结果判定为相等,不符合严格校验的要求。

修复方案

可以直接用正则对输入做格式校验,一次性过滤所有非法输入(前导零、多位数、非数字字符、超出范围的数字都可以直接拦截):

let diceRolled = false;

const rollDice = (guess) => {
  console.log('guess:', guess);
  
  // 统一转成字符串并去除首尾空格
  const guessStr = String(guess).trim();
  // 正则校验:只能是1-6的单个数字,无其他多余字符
  const isValid = /^[1-6]$/.test(guessStr);
  const guessNum = Number(guessStr);

  if (!isValid) {
    console.log(`你只能选择1到6之间的数字`);
  } else if (diceRolled) {
    console.log(`骰子已经掷过了,请稍后再试`);
  } else {
    diceRolled = true;
    let dice = Math.floor(Math.random() * 6) + 1;
    console.log(`骰子已掷出`);
    setTimeout(() => {
      // 改用严格相等判断,避免类型转换导致的逻辑漏洞
      if (dice === guessNum) {
        console.log(`猜测正确!骰子的结果是:${dice} :thumbsup:`);
      } else {
        console.log(`猜测错误,骰子的结果是:${dice} :thumbsdown:`);
      }
      diceRolled = false;
    }, 5000);
  }
};

rollDice('03'); // 现在会触发非法输入提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:30:01