You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何我的加减运算验证程序始终输出'foo'?

帮你排查一下问题,这几个小细节导致了你的bug:

1. checkResult函数的逻辑顺序完全错了

你在函数里先根据运算符return计算结果,这会直接结束函数,后面的正确性判断代码永远不会执行!这就是为什么你永远看不到console.log('hey')的核心原因。

2. 点击按钮时没有给checkResult传参,变量全是undefined

按钮的onclick="checkResult()"没有传递任何参数,所以函数里的absignresult都是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

火山引擎 最新活动