为何我的加减运算验证程序始终输出'foo'?
帮你排查一下问题,这几个小细节导致了你的bug:
1. checkResult函数的逻辑顺序完全错了
你在函数里先根据运算符return计算结果,这会直接结束函数,后面的正确性判断代码永远不会执行!这就是为什么你永远看不到console.log('hey')的核心原因。
2. 点击按钮时没有给checkResult传参,变量全是undefined
按钮的onclick="checkResult()"没有传递任何参数,所以函数里的a、b、sign、result都是undefined,这会导致判断逻辑直接走else if分支,打印foo。
3. 答对后没有生成新题目
就算逻辑对了,你也没写答对后刷新题目的代码,所以不会显示新的数字和运算符。
4. 输入值是字符串,直接对比会有类型问题
input.value获取到的是字符串,比如用户输入5,拿到的是'5',直接和数字5对比会不相等。
修复后的完整代码
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Thinking...</title> </head> <body> <div> <span id="a">A</span> <span id="sign"></span> <span id="b">B</span> = <label for="result"></label><input type="number" id="result"> <button type="button" id="btn" onclick="checkResult()">press</button> </div> <script> let numberA = document.getElementById('a'), numberB = document.getElementById('b'), sign = document.getElementById('sign'), input = document.getElementById('result'); // 封装生成新题目的函数,方便复用 function generateNewQuestion() { let aRandom = getRandomNumber(1, 10); let bRandom = getRandomNumber(1, 10); let signRandom = getRandomSign(); // 更新页面显示 numberA.innerHTML = aRandom; numberB.innerHTML = bRandom; sign.innerHTML = signRandom; } function checkResult() { // 先获取页面上当前的数值和运算符 const a = parseInt(numberA.innerHTML); const b = parseInt(numberB.innerHTML); const currentSign = sign.innerHTML; // 把输入值转成数字 const userAnswer = parseInt(input.value); // 计算正确答案 let correctAnswer; if (currentSign === '-') { correctAnswer = a - b; } else { correctAnswer = a + b; } // 判断答案是否正确 if (userAnswer === correctAnswer) { console.log('hey'); // 答对了,生成新题目 generateNewQuestion(); } else { console.log('foo'); } // 清空输入框 input.value = ''; } function getRandomSign() { let signs = ['-', '+']; return signs[Math.floor(Math.random()*signs.length)]; } function getRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // 页面加载时生成第一个题目 generateNewQuestion(); </script> </body> </html>
修复说明:
- 把生成题目的逻辑封装成
generateNewQuestion函数,页面加载和答对后都可以调用 checkResult函数不再依赖传参,直接从页面元素获取当前的数值和运算符,更可靠- 先计算正确答案,再和转成数字的用户输入对比,解决类型不匹配问题
- 答对后调用
generateNewQuestion生成新题目,同时清空输入框 - 去掉了原代码中提前
return的逻辑,让判断代码可以正常执行
内容的提问来源于stack exchange,提问作者10100011001




