(开篇灵魂拷问)
你写的计算器是不是总出bug?明明点了等于号却显示NaN,或者连按运算符直接卡死?别慌!今天咱们从零开始手撸一个靠谱的点击计算器,保准让你搞懂每个字符背后的逻辑。
一、计算器必备功能清单
先理清基本需求,别急着写代码:
- 数字按钮输入(0-9)
- 基本运算(+-×÷)
- 等于号计算结果
- 清除键(AC)
- 小数点处理
- 连续运算支持
举个翻车案例:新手常忘记处理连续点击运算符,导致"2++3"这样的非法表达式。这就跟做菜没洗锅似的,迟早要串味!
二、HTML骨架搭建
先搭个看得见的界面,别玩纯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核心逻辑
分三步实现基本功能,像搭积木一样:
第一步:变量声明
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}`); }
- 科学计算扩展:
添加平方、开方等按钮,使用Math对象实现:
javascript复制case 'sqrt': computation = Math.sqrt(current); break;
(终极忠告)
要我说,写计算器最忌直接抄代码。见过太多人把计算器写成字符串拼接器,也见过死磕正则表达式的大神。记住这句话:"理解运算逻辑比实现更重要"。下次遇到计算结果不对,不妨拿出纸笔手动演算一遍,保准能找到bug所在!