更新时间:2025-05-28 09:03点击:8
(开篇灵魂拷问)
你写的计算器是不是总出bug?明明点了等于号却显示NaN,或者连按运算符直接卡死?别慌!今天咱们从零开始手撸一个靠谱的点击计算器,保准让你搞懂每个字符背后的逻辑。
先理清基本需求,别急着写代码:
举个翻车案例:新手常忘记处理连续点击运算符,导致\"2++3\"这样的非法表达式。这就跟做菜没洗锅似的,迟早要串味!
先搭个看得见的界面,别玩纯JS那套:
html运行复制<div id=\"calculator\"> <input type=\"text\" id=\"display\" readonly> <div class=\"buttons\"> <button data-value=\"7\">7button> <button data-value=\"8\">8button> <button data-op=\"+\">+button> <button data-op=\"-\">-button> <button data-op=\"*\">×button> <button data-op=\"/\">÷button> <button id=\"equals\">=button> <button id=\"clear\">ACbutton> div> div>
关键点:用data-*属性区分数字和运算符,比用class更规范。
分三步实现基本功能,像搭积木一样:
第一步:变量声明
javascript复制let currentOperand = \'\'; let previousOperand = \'\'; let operation = undefined;
第二步:事件监听
javascript复制document.querySelectorAll(\'button\').forEach(btn => { btn.addEventListener(\'click\', () => { const value = btn.dataset.value; const op = btn.dataset.op; if (value !== undefined) { appendNumber(value); } else if (op !== undefined) { chooseOperation(op); } }); });
第三步:运算函数
javascript复制function compute() { let computation; const prev = parseFloat(previousOperand); const current = parseFloat(currentOperand); switch (operation) { case \'+\': computation = prev + current; break; case \'-\': computation = prev - current; break; case \'*\': computation = prev * current; break; case \'/\': computation = prev / current; break; default: return; } currentOperand = computation; operation = undefined; previousOperand = \'\'; }
对照这张表检查代码,避开常见雷区:
问题现象 | 错误原因 | 解决方案 |
---|---|---|
点运算符没反应 | 忘记更新previousOperand | 在chooseOperation中赋值 |
连续计算出错 | 未清除前次操作符 | 重置operation变量 |
小数点重复出现 | 未检测已有小数点 | 添加includes检查 |
除以零报错 | 未做除数校验 | 添加if(current !==0)判断 |
显示NaN | 空值参与运算 | 增加非空校验 |
去年有个学员忘记处理连续小数点,做出个能输入\"3.14.15\"的计算器,活脱脱造了个数学黑洞!
基础版跑通后,试试这些升级操作:
javascript复制document.addEventListener(\'keydown\', (e) => { if (e.key >= 0 && e.key <= 9) appendNumber(e.key); if (e.key === \'.\') appendDecimal(); if (e.key === \'Enter\') compute(); });
javascript复制const history = []; function updateHistory() { history.push(`${previousOperand} ${operation} ${currentOperand}`); }
javascript复制case \'sqrt\': computation = Math.sqrt(current); break;
(终极忠告)
要我说,写计算器最忌直接抄代码。见过太多人把计算器写成字符串拼接器,也见过死磕正则表达式的大神。记住这句话:\"理解运算逻辑比实现更重要\"。下次遇到计算结果不对,不妨拿出纸笔手动演算一遍,保准能找到bug所在!