当前位置:首页 > JavaScript

js函数实现简单计算器

2026-04-05 03:15:23JavaScript

实现基础四则运算

创建一个函数,接收两个数字和一个运算符(+-*/),返回计算结果。使用switch结构处理不同运算符:

function basicCalculator(num1, operator, num2) {
  switch (operator) {
    case '+':
      return num1 + num2;
    case '-':
      return num1 - num2;
    case '*':
      return num1 * num2;
    case '/':
      return num2 !== 0 ? num1 / num2 : 'Error: Division by zero';
    default:
      return 'Error: Invalid operator';
  }
}

处理连续运算

通过数组存储输入序列,使用reduce方法实现连续运算。假设输入格式为[5, '+', 3, '*', 2]

js函数实现简单计算器

function chainedCalculator(operations) {
  return operations.reduce((acc, curr, index, arr) => {
    if (typeof curr === 'string') {
      const nextNum = arr[index + 1];
      return basicCalculator(acc, curr, nextNum);
    }
    return acc;
  }, operations[0]);
}

支持优先级运算

引入括号和运算符优先级处理。使用两个栈(数字栈和运算符栈)实现:

function advancedCalculator(expression) {
  const tokens = expression.match(/(\d+|\+|-|\*|\/|\(|\))/g);
  const values = [];
  const ops = [];

  const precedence = { '+': 1, '-': 1, '*': 2, '/': 2 };

  tokens.forEach(token => {
    if (!isNaN(token)) {
      values.push(parseFloat(token));
    } else if (token === '(') {
      ops.push(token);
    } else if (token === ')') {
      while (ops[ops.length - 1] !== '(') {
        applyOp(values, ops);
      }
      ops.pop();
    } else {
      while (ops.length && precedence[ops[ops.length - 1]] >= precedence[token]) {
        applyOp(values, ops);
      }
      ops.push(token);
    }
  });

  while (ops.length) {
    applyOp(values, ops);
  }

  return values.pop();
}

function applyOp(values, ops) {
  const b = values.pop();
  const a = values.pop();
  const op = ops.pop();
  values.push(basicCalculator(a, op, b));
}

添加事件监听示例

HTML中绑定按钮点击事件,使用eval快速实现(注意安全风险):

js函数实现简单计算器

<input type="text" id="display" readonly>
<button onclick="appendToDisplay('1')">1</button>
<!-- 其他数字/运算符按钮 -->

<script>
let currentInput = '';

function appendToDisplay(value) {
  currentInput += value;
  document.getElementById('display').value = currentInput;
}

function calculate() {
  try {
    const result = eval(currentInput);
    document.getElementById('display').value = result;
    currentInput = String(result);
  } catch {
    document.getElementById('display').value = 'Error';
    currentInput = '';
  }
}
</script>

安全增强方案

替代eval的方案,使用Function构造函数限制作用域:

function safeEval(expr) {
  try {
    return new Function('return ' + expr)();
  } catch {
    return NaN;
  }
}

支持科学计算功能

扩展运算符处理,添加^幂运算和Math函数支持:

function scientificCalculator(expr) {
  const processed = expr
    .replace(/\^/g, '')
    .replace(/sqrt\(/g, 'Math.sqrt(')
    .replace(/sin\(/g, 'Math.sin(');
  return safeEval(processed);
}

标签: 计算器函数
分享给朋友:

相关文章

vue实现计算器

vue实现计算器

Vue 实现计算器的方法 使用 Vue 实现计算器可以充分利用其响应式数据和组件化特性。以下是一个简单的实现方案: 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目: npm i…

vue中实现节流函数

vue中实现节流函数

使用 Lodash 的 _.throttle 方法 安装 Lodash 并导入 throttle 方法: npm install lodash 在 Vue 组件中使用: import { thro…

react箭头函数如何传参

react箭头函数如何传参

箭头函数传参基础语法 箭头函数通过括号内的参数列表接收参数,单参数时可省略括号。例如: const greet = name => `Hello, ${name}!`; console.log…

react如何控制函数组件更新

react如何控制函数组件更新

控制函数组件更新的方法 在React中,函数组件的更新通常由状态(state)或属性(props)的变化触发。以下是几种常见的控制函数组件更新的方法: 使用React.memo进行浅比较 React…

react如何让函数组件缓存

react如何让函数组件缓存

缓存函数组件的常用方法 在React中,函数组件本身是无状态的,但可以通过以下方式实现类似类组件的缓存或优化效果: 使用React.memo进行浅比较缓存 React.memo是一个高阶组件,它会记…

react如何在model层写函数调接口

react如何在model层写函数调接口

React 中 Model 层函数调用接口的实现 在 React 应用中,Model 层通常负责数据管理和接口调用。可以通过以下方式组织代码: 创建独立的 API 服务模块 将接口调用封装在单独的…