当前位置:首页 > 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 允许组件在其模板中调用自身,通过 name 选项…

react函数如何调用redux

react函数如何调用redux

在React函数组件中调用Redux 使用react-redux库提供的useSelector和useDispatch钩子函数,可以在函数组件中访问Redux状态和派发action。 安装必要依赖:…

react如何定义全局函数

react如何定义全局函数

定义全局函数的几种方法 在React中定义全局函数可以通过多种方式实现,以下是常见的几种方法: 使用全局变量挂载 将函数直接挂载到window对象上,使其成为全局可访问的函数。这种方式简单直接,但…

react项目如何定义全局函数

react项目如何定义全局函数

定义全局函数的方法 在React项目中,可以通过以下几种方式定义全局函数,以便在整个应用中复用。 使用全局变量挂载 将函数挂载到window对象上,使其成为全局可访问的函数。这种方式简单直接,但可能…

react箭头函数如何传参

react箭头函数如何传参

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

react如何阻止函数组件更新

react如何阻止函数组件更新

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