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

JS计算器开发异常:运算按钮触发后数组添加冗余元素

问题原因与修复方案

核心问题:冗余元素的来源

你的funcs.execute方法里的switch语句所有case都未添加break语句,导致代码会贯穿执行所有后续case。比如点击+(对应case 'add')时,代码会依次执行add、sub、mul、div四个分支,每个分支都会向stats.numbers推送一次数据,原本只应添加1条数据,结果多出来3条冗余元素。

修复步骤

1. 给switch的每个case添加break

修改funcs.execute里的switch逻辑,每个case执行完后加上break,避免代码贯穿:

execute: (o) => {
    switch (o) {
        case 'add':
            if (!stats.operationing) {
                stats.operationing = true;
            }
            stats.currentOperation = 'add';
            stats.numbers.push([Number(document.getElementById('display').innerText), 'add']);
            document.getElementById('display').innerText = '0';
            break; // 添加break
        case 'sub':
            if (!stats.operationing) {
                stats.operationing = true;
            }
            stats.currentOperation = 'sub';
            stats.numbers.push([Number(document.getElementById('display').innerText), 'sub']);
            document.getElementById('display').innerText = '0';
            break; // 添加break
        case 'mul':
            if (!stats.operationing) {
                stats.operationing = true;
            }
            stats.currentOperation = 'mul';
            stats.numbers.push([Number(document.getElementById('display').innerText), 'mul']);
            document.getElementById('display').innerText = '0';
            break; // 添加break
        case 'div':
            if (!stats.operationing) {
                stats.operationing = true;
            }
            stats.currentOperation = 'div';
            stats.numbers.push([Number(document.getElementById('display').innerText), 'div']);
            document.getElementById('display').innerText = '0';
            break; // 添加break
        case 'eq':
            let result = stats.numbers[0][0]; // 初始化result为第一个数,避免从0开始计算错误
            stats.numbers.slice(1).forEach((i) => { // 从第二个元素开始遍历
                switch (i[1]) {
                    case 'add':
                        result += i[0];
                        break; // 添加break
                    case 'sub':
                        result -= i[0];
                        break; // 添加break
                    case 'mul':
                        result *= i[0];
                        break; // 添加break
                    case 'div':
                        if (i[0] === 0) {
                            result = 'Err';
                            break;
                        }
                        result /= i[0];
                        break; // 添加break
                }
            });
            stats.operationing = false;
            stats.numbers = []; // 计算后清空数组,避免重复计算
            document.getElementById('display').innerText = result;
            break; // 添加break
        default:
            const display = document.getElementById('display');
            if (display.innerText === '0' || display.innerText === '' || display.innerText === 'Err') {
                display.innerText = `${o}`;
            } else {
                display.innerText += `${o}`;
            }
            break; // 添加break
    }
},

2. 修复其他潜在bug

  • 重定义的del函数:你定义了两个del函数,第二个会覆盖第一个,导致C按钮功能失效。重命名AC对应的函数为delAll:
function del() {
    const display = document.getElementById('display');
    display.innerText = display.innerText.slice(0, -1) || '0'; // 删完后显示0
}

function delAll() {
    document.getElementById('display').innerText = '0';
    stats.numbers = [];
    stats.currentOperation = '';
    stats.operationing = false;
}

HTML中AC按钮的onclick已调用delAll(),此处只需对应修复JS函数名即可。

  • 计算逻辑错误:原eq分支里result初始化为0,会导致第一个数被错误叠加,修复后初始化result为数组第一个元素的值,再从第二个元素开始遍历计算。

验证修复效果

修复后,点击运算按钮只会向stats.numbers添加对应的数据,不会出现冗余元素,同时计算器的基础计算功能也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:10:31