javascript开发web计算器实例教程

2023-10-27

计算器的主要作用是进行数字运算,开发一个计算器功能的web实例,有助于更好的掌握js基础的数字运算能力。
本实例详细分析一个js计算器的开发步骤,学习本教程时最好先具备一些基础的js知识。
计算器包括显示数字区域和按键区域两大部分,先把计算器的这两个区域的html元素编写出来,如下所示:

<div class="calculator_wrap" id="calculator"><!--计算器外包元素-->
  <div class="show_num"><!--显示数字区域-->
    <div class="num_save" id="numSave"></div><!--计算公式-->
    <div class="num_cur" id="numCur">0</div><!--计算结果-->
    <div class="show_m" id="showM">M</div><!--记忆存储标志-->
  </div>
  <div class="btn_wrap" id="btnWrap"><!--按钮区域-->
    <div class="btn" data-key="MC">MC</div><!--记忆清零-->
    <div class="btn" data-key="MR">MR</div><!--记忆读取-->
    <div class="btn" data-key="MS">MS</div><!--存储记忆-->
    <div class="btn" data-key="MA">M+</div><!--记忆加-->
    <div class="btn" data-key="ML">M-</div><!--记忆减-->
    <div class="btn" data-key="BACK"></div><!--退格-->
    <div class="btn" data-key="CE">CE</div><!--清除当前-->
    <div class="btn" data-key="Clear">C</div><!--清除-->
    <div class="btn" data-key="Negate">±</div><!--正负转换-->
    <div class="btn" data-key="Square">√ ̄</div><!--平方根-->
    <div class="btn" data-key="Num" data-value="7">7</div><!--7-->
    <div class="btn" data-key="Num" data-value="8">8</div><!--8-->
    <div class="btn" data-key="Num" data-value="9">9</div><!--9-->
    <div class="btn" data-key="Base" data-value="/">/</div><!--除-->
    <div class="btn" data-key="Percentage">%</div><!--百分号-->
    <div class="btn" data-key="Num" data-value="4">4</div><!--4-->
    <div class="btn" data-key="Num" data-value="5">5</div><!--5-->
    <div class="btn" data-key="Num" data-value="6">6</div><!--6-->
    <div class="btn" data-key="Base" data-value="*">*</div><!--乘-->
    <div class="btn" data-key="Reciprocal">1/x</div>  <!--倒数-->
    <div class="btn" data-key="Num" data-value="1">1</div><!--1-->
    <div class="btn" data-key="Num" data-value="2">2</div><!--2-->
    <div class="btn" data-key="Num" data-value="3">3</div><!--3-->
    <div class="btn" data-key="Base" data-value="-">-</div><!--减-->
    <div class="btn equal" data-key="Equal">=</div><!--等于-->
    <div class="btn zero" data-key="Num" data-value="0">0</div><!--0-->
    <div class="btn" data-key="Point">.</div><!--小数点-->
    <div class="btn" data-key="Base" data-value="+">+</div><!--加-->
  </div>
</div>

读者可以自己编写一些样式,设计一个自己喜欢的计算器效果。本实例的计算器效果如下图所示:
在这里插入图片描述
原代码可以从 《原生js计算器实例文件》 中下载

对于新手来说,计算器功能看起来好像很复杂,那么多按钮、多种计算方式,不知如何开始。其实任何一个功能,只需要理清楚思路,一步一步编写代码,会发现实现起来都不难。

1 获取各个html元素
web前端不论要在页面上做什么,都要先获取页面上的各个DOM元素。看起来整个计算器的按钮较多,实际开发中可以使用事件代理来操作按钮,所以只获取所有按钮的容器元素即可。代码如下:

//获取外包元素
var eCalculator = document.getElementById('calculator');
//保存运算数据(公式)容器
var eNumSave = document.getElementById('numSave');
//当前数字容器
var eNumCur = document.getElementById('numCur');
//按钮外部容器,用于事件代理
var eBtnWrap = document.getElementById('btnWrap');
//记忆存储标志元素
var eShowM = document.getElementById('showM');

2 声明相关变量
在运算过程中,需要一些变量来进行辅助计算、存储结果和判断等,如下所示:

//运算公式
var sStep = '';
//当前数字
var sCurValue = '0';
//运算结果
var nResult = null;
//运算符
var sMark = '';
//MR记忆存储数据
var nMvalue = 0;
//输入状态。false:输入数字替换原数字;true:输入数字加到原数字后面;
var bLogStatus = false;

3 按键上添加点击事件
因为整个计算器按键较多,每一个按钮都单独绑定一个事件会显得太多,很繁琐,还会影响性能,且容易出错。所以刚才只获取了按键的外部容器 eCalculator。
再使用事件代理,就只需要在容器上添加点击事件,判断当前点击的按键是哪一个,再执行对应的计算即可。用鼠标点击按键的时候,可能会因为点得太快而选择了按键上的文字,因此还需要在外包容器上添加一个阻止默认行为的操作,代码如下所示:

//外包容器添加鼠标按下事件,用于防止选中文字
eCalculator.addEventListener('mousedown',function(event){
  //阻止鼠标按下时的默认行为,防止点击按钮过快时选中文字
  event.preventDefault();
});

//按键容器添加点击事件,用于代理所有按键的操作
eBtnWrap.addEventListener('click',function(event){

});

3.1 获取点击的按键和值
通过事件函数传入的event参数,可以获取到鼠标点击的元素。再通过元素上的data-key和data-value属性判断鼠标点击的是哪一个按键以及它的值,如下所示:

eBtnWrap.addEventListener('click',function(event){
  //获取点击的元素
  var eTarget = event.target;
  //判断按下的键
  var key = eTarget.dataset.key;
  //获取按下的值
  var value = eTarget.dataset.value;
});

3.2 判断按键及值,数字键和小数点执行输入操作
如果按键属性data-key是’Num’表示按下的是数字,'Point’表示小数点。
这些按键都是执行输入,因为数字有多个,所以把数字输入封装到fnInputNum函数中。再封装fnShowResult函数把数据显示到显示数字区域。如下所示:

eBtnWrap.addEventListener('click',function(event){
  /* … */

  //判断点击的是否是按键
  if(key){
    //用switch语句判断不同的按键执行对应的操作
    switch(key){
      //数字键执行操作
      case 'Num':
        fnInputNum(value);
        break;
      //小数点操作
      case 'Point':
        //判断是否有已小数点,用于限制只能输入一个小数点
        if(sCurValue.indexOf('.')==-1){
          sCurValue = sCurValue + '.';
          bLogStatus = true;
        }
        break;
    }
    //显示数据到显示数字区域
    fnShowResult();
  }
});
//输入数字
function fnInputNum(num){
  //根据输入状态判断是替换当前数字还是添加到当前数字后面
  if(bLogStatus){
    sCurValue = sCurValue + num;
  }else{
    //限制第一个数字不能是0
    if(num!=0){
      bLogStatus = true;
    }
    sCurValue = num;
  }
}
//显示计算结果
function fnShowResult(){
  //显示计算公式
  eNumSave.innerHTML = sStep;
  //限制数字总长度
  if(sCurValue.length>14){
    sCurValue = sCurValue.slice(0,14);
  }
  //显示当前数字
  eNumCur.innerHTML = sCurValue;
}

这时候已经可以点击数字和小数点,输入到计算器显示屏上,如图所示:
在这里插入图片描述
3.3 加减乘除运算
计算器最基本的就是加减乘除运算。为了实现对数字进行加减乘除并计算结果功能,封装fnCountResult、fnBaseCount和fnEqual三个函数。
fnCountResult用于根据运算符计算结果;
fnBaseCount修改计算公式或计算结果;
fnEqual用于按下=号时计算结果,并重置数据。如下所示:

eBtnWrap.addEventListener('click',function(event){
  /* … */

  //判断点击的是否是按键
  if(key){
    //用switch语句判断不同的按键执行对应的操作
    switch(key){
      /* … */
      //加减乘除基本运算
      case 'Base':
        fnBaseCount(value);
        break;
      //等于
      case 'Equal':
        fnEqual();
        break;
    }
    //显示数据到显示数字区域
    fnShowResult();
  }
});
//计算结果
function fnCountResult(){
  //判断当前运算符并执行运算
  switch(sMark){
    case '+':
      nResult = nResult===null?+sCurValue:nResult + (+sCurValue);
      break;
    case '-':
      nResult = nResult===null?+sCurValue:nResult - sCurValue;
      break;
    case '*':
      nResult = nResult===null?+sCurValue:nResult * sCurValue;
      break;
    case '/':
      nResult = nResult===null?+sCurValue:nResult / sCurValue;
      break;
    default:
      nResult = +sCurValue;
  }
}
//加减乘除基础运算
function fnBaseCount(key){
  //如果是输入状态,进行运算
  if(bLogStatus){ 
    //修改输入状态
    bLogStatus = false;
    //计算公式
    sStep = sStep + ' ' + sCurValue + ' ' + key;
    //计算结果
    fnCountResult();
    sCurValue = ''+nResult;
  }else{
    //如果公式为空,先加上原始数字
    if(sStep==''){  
      sStep = sCurValue + ' ' + key;
    }else{  //如果已有公式,更改最后的运算符
      sStep = sStep.slice(0,sStep.length-1) + ' ' + key;
    }
  }
  //更改运算符,用于计算
  sMark = key;
}
//等于
function fnEqual(){
  //如果没有运算符,阻止后续操作
  if(sMark=='')return;
  //计算结果
  fnCountResult();
  sCurValue = ''+nResult;
  //重置数据
  sStep = '';
  sMark = '';
  bLogStatus = false;
}

现在已经可以在计算器上做加减乘除的计算了,如图所示:
在这里插入图片描述
3.4 再给其他按键添加操作,代码如下所示:

eBtnWrap.addEventListener('click',function(event){
  /* … */

  //判断点击的是否是按键
  if(key){
    //用switch语句判断不同的按键执行对应的操作
    switch(key){
      /* … */

      //清除
      case 'Clear':
        fnClear()
        break;
      //退格
      case 'BACK':
        fnBack();
        break;
      //CE
      case 'CE':
        //清空当前显示数值
        sCurValue = '0';
        bLogStatus = false;
        break;
      //取反
      case 'Negate':
        //当前数值取反
        sCurValue = ''+(-sCurValue);
        break;
      //取平方根
      case 'Square':
        //当前数值取平方根
        nResult = Math.sqrt(+sCurValue);
        //其他数据初始化
        sCurValue = ''+nResult;
        sStep = '';
        sMark = '';
        bLogStatus = false;
        break;
      //倒数
      case 'Reciprocal':
        //当前数值取倒数
        //其他数据初始化
        nResult = 1/sCurValue;
        sCurValue = ''+nResult;
        sStep = '';
        sMark = '';
        bLogStatus = false;
      break;
      //M系列
      case 'MC':
        //记忆数值清零
        nMvalue = 0;
        fnShowM()
        break;
      case 'MR':
        //显示记忆数值
        sCurValue = '' + nMvalue;
        fnShowM()
        break;
      case 'MS':
        //记忆数值改为当前数值
        nMvalue = +sCurValue;
        fnShowM()
        break;
      case 'MA':
        //当前数值加到记忆数值中
        nMvalue += +sCurValue;
        fnShowM()
        break;
      case 'ML':
        //从记忆数值中减去当前数值
        nMvalue -= +sCurValue;
        fnShowM()
        break;
    }
    //显示数据到显示数字区域
    fnShowResult();
  }
});
//清除
function fnClear(){
  //初始化所有数据
  sStep = '';
  sCurValue = '0';
  nResult = null;
  sMark = '';
  bLogStatus = false;
}
//退格
function fnBack(){
  //必须是输入状态才可以退格
  if(bLogStatus){
    //减去数值最后一位数
    sCurValue = sCurValue.slice(0,sCurValue.length-1);
    //如果最后数值为空或负号(-),改为0,重置输入状态为false,不可再退格
    if(sCurValue==''||sCurValue=='-'){
      sCurValue = '0';
      bLogStatus = false;
    }
  }
}
//判断是否有M记忆存储
function fnShowM(){
  bLogStatus = false;
  //判断是否显示记忆存储标志
  eShowM.style.display = nMvalue==0?'none':'block';
}

4 绑定键盘事件
写到这里,计算器已经可以正常使用了。不过只能用鼠标点击按键操作效率不高,为了可以更快的使用计算器,还需要加上键盘事件,当按下对应按键时,执行操作,如下所示:

//键盘事件
document.addEventListener('keyup',function(event){
  //获取当前键盘按键
  var key = event.key;
  //获取按键code
  var code = event.keyCode;
  //限制正确的按键才修改显示的数据
  var comply = false;
  //输入数字
  if((code>=48&&code<=57)||(code>=96&&code<=105)){
    fnInputNum(key);
    comply = true;
  }
  //加减乘除
  if( key=='*'||key=='+'||key=='/'||key=='-'){
    fnBaseCount(key);
    comply = true;
  }
  //esc键
  if(code==27){
    fnClear();
    comply = true;
  }
  //回车键
  if(code==13){
    fnEqual();
    comply = true;
  }
  //退格键
  if(code==8){
    fnBack();
    comply = true;
  }
  if(comply){
    //显示数据到计算器屏幕
    fnShowResult();
  }
});

一个简单的计算器就完成了,如果以学习为目的话,建议不要直接复制代码,最好直接手动输入代码及注释,加深印象和提高学习效果。如果想查看效果,也可以从《原生js计算器实例文件》 中下载源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript开发web计算器实例教程 的相关文章

  • chrome 调试器承诺在暂停时不会解析?

    也许我没有正确调试承诺 但基本上 如果您在断点处停止并运行异步代码 它实际上不会完成 直到您恢复执行为止 这是一个问题 调试器允许您快速试验多个 api 方法 但如果您恢复它 您就不能 debugger now type the follo
  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 用隐藏单元格补充 colspanned 表格有什么不好吗?

    我一直在表格上开发一些排序和选择功能 我发现在具有跨单元格的表格中定位非常困难 我只是添加了跨区单元格并将其隐藏 它看起来不错 它与我的 js 一起工作 非常适合索引 但我想知道这是否是合法的方法 stuffing display none
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • HTML2canvas 和 Canvas2image,下载的屏幕截图不显示我的 HTML 图像

    我一直在开发一个 HTML 页面 我想将其转换为图像 我一直在使用 html2canvas 和 canvas2image 脚本并采用此代码http jsfiddle net 8ypxW 3 http jsfiddle net 8ypxW 3
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 将 javascript 整数转换为字节数组并返回

    function intFromBytes x var val 0 for var i 0 i lt x length i val x i if i lt x length 1 val val lt lt 8 return val func
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • JavaScript创建对象的9种方式

    JavaScript创建对象的九种方式 Object构造函数创建对象 不再赘述 对象字面量 不再赘述 工厂模式 用函数来封装以特定接口创建对象的细节 function createPerson name age job var o new
  • SQLSERVER储存过程批量添加10万条数据

    SQLSERVER批量添加10万条数据 insert into PatInfo PID name sex birthday createDate updateDate ownerID permBits contact memo select
  • Python手册(Machine Learning)--statsmodels(列联表和多重插补)

    列联表和多重插补 Contingency tables 列联表 Independence 独立性 Symmetry and homogeneity 对称性和同质性 A single 2x2 table 单个2x2表 Stratified 2
  • 动态规划 Leetcode 1458 Max Dot Product of Two Subsequences(两个子序列的最大点积)

    题目 给你两个数组 nums1 和 nums2 请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积 数组的非空子序列是通过删除原数组中某些元素 可能一个也不删除 后剩余数字组成的序列 但不能改变数字间相对顺序 比
  • 心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

    文章目录 前言 介绍 系统框架 原项目地址 本项目开发开源地址 硬件PCB 软件功能 详细内容 硬件外壳制作 WS2812级联及控制 MAX30102血氧传感器 0 96OLED FreeRTOS 效果视频 总结 前言 在好几年前 我好像就
  • elastic job任务不执行

    1 查zk namespace下的instance 2 查dd quartz线程还在不在 3 查定时任务worker线程是不是卡在io上
  • 北京大学肖臻老师《区块链技术与应用》公开课 笔记目录

    北京大学肖臻老师 区块链技术与应用 公开课学习笔记 分章节进行整理 持续更新中 该系列文章中如有任何侵权内容请及时与我个人联系删除或修改 北京大学肖臻老师 区块链技术与应用 视频链接 点击这里 文章目录 01 课程介绍 点击这里 BTC 0
  • RPC远程服务调用

    1 基本概念 跨网络 跨进程的方法调用 因为客户端和服务端位于网络上不同的地址 要完成一次rpc调用 则需要以下步骤 首先建立网络连接 建立连接后 双方需要按照某种约定的协议进行网络通信 能正常通信后 服务端收到请求后需要以某种方式处理 处
  • 使用RestTemplate 远程调用,传递文件类型参数

    使用RestTemplate 远程调用 传递文件类型参数 类私有属性声明 Value server remoteIpPort private String remoteIpPort Resource private RestTemplate
  • 中国“互联网+”案例100征集活动正式启动

    中国互联网技术联盟做为中国第一互联网 专业服务平台 以 技术驱动跨界连接 合作创新 为使命 积极推动中国企业 互联网 的落地应用 继推出 互联网 系列权威发布 本文下方附录可查阅权威发布的具体内容 之后 中国互联网技术联盟在 国务院推进 互
  • 【数论】矩阵快速幂,递推优化,模板

    目录 一 矩阵快速幂用于优化递推 二 矩阵快速幂的推导 一 矩阵快速幂用于优化递推 矩阵快速幂用于优化递推公式 例如 斐波那契的递推公式为 f 1 1 f 2 1 f n f n 1 f n 2 n gt 3 当我们想要求第1e8项时 直接
  • QT Android wifi自动重连开发

    QT Android wifi自动重连开发 配置安卓wifi操作权限 通过监听QNetworkConfigurationManager信号判断WiFi是否失去连接 Java代码 QT代码 小米平板连接无公网的路由器时 断开后不会自动连接 原
  • [Oracle] 修改字符串最大长度解决 ORA-12899: value too large for column

    问题分析 出现这个问题的原因是 某列中包含的数据长度超出了建表时对该列的限制 一般情况下修改出错列的长度设置 然后重新建表即可 不过有时问题会更复杂一些 存储字符串常用的 VARCHAR2 类型的默认长度上限是 4000 bytes 如果要
  • LTE学习笔记:频带、信道带宽和频点号EARFCN

    转自 https blog csdn net m 052148 article details 51322260 1 频带 Band 所谓频带 指代的是一个频率的范围或者频谱的宽度 即无线解码器的最低工作频率至最高工作频率之间的范围 单位是
  • C++二进制转换

    include
  • ..\HAREWARE\LED.H(4): warning: #1295-D: Deprecated declaration led_init - give arg types

    MDK头文件定义空函数中无参数要加 void eg void led init 要写成 void led init void 转载于 https www cnblogs com 520sbc p 7756859 html
  • sql for循环_循环查询数据的性能问题及优化

    大数据技术与架构 点击右侧关注 大数据开发领域最强公众号 暴走大数据 点击右侧关注 暴走大数据 糟糕的代码 对代码维护 性能 团队协作都会造成负面影响 所以 先设计再实现 谋而后动 这里的循环查询 指的是在一个for循环中 不断访问数据库来
  • c#发送简单的post、get请求

    POST发送请求及接受响应流程 根据目标地址址创建HttpWebRequest对象 设置响应的请求参数 Method ContentType 等 使用HttpWebRequest对象获取请求流并且写入消息体 使用HttpWebRequest
  • Spring Boot 接入支付宝完整流程实战

    1 将支付宝开放平台里下载的3个证书放在resources下面 2 写支付宝支付的配置文件 alipay properties alipay appId 你的应用id alipay serverUrl https openapi alipa
  • javascript开发web计算器实例教程

    计算器的主要作用是进行数字运算 开发一个计算器功能的web实例 有助于更好的掌握js基础的数字运算能力 本实例详细分析一个js计算器的开发步骤 学习本教程时最好先具备一些基础的js知识 计算器包括显示数字区域和按键区域两大部分 先把计算器的