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

