少数人在解算数表达式计算时,会采纳遍历数组优先计算乘除而后以计算结果替换和删除数组元素的的形式,这种形式须要重复遍历数组且须要对数组元素进行删除和插入(On),工夫复杂度较高O(n^2),性能较差,请尝试优化到 O(n)。

限度

  • 你不能够应用 eval() 函数来执行计算
  • 你不能够应用 new Function('...') 函数来执行计算

用例

  1. 用户能够看到显示屏显示以后输出的数字或最初一次操作的后果。
  2. 用户能够看到一个蕴含数字 0-9、操作符 —— '+'、'-'、'*'、'/' 和 '=' 按钮的输入板,一个 'AC' 按钮(用于革除所有)。
  3. 用户能够通过点击输入板上的数字来输出最多八位数的数字序列,任何超过8位的数字的输出都将被疏忽。
  4. 用户能够点击 'AC' 按钮来革除所有的外部工作区域,并将显示值设为 0。
  5. 初始值为 0,输出操作符则以 0 为操作数,否则按支出的数字作为操作数;
  6. 最初输出等号后,将计算结果作为下一轮计算的初始值;
  7. 以后操作数为 0 时,再反复输出 0 时须要疏忽,避免出现 00000123 这样的显示;
  8. 临时不反对数字正负符号输出,所有操作符号都以最初输出为准;
    例如:当初是 3 + ,再输出减号变为 3 -
  9. 如果上一次输出的是操作符,当初输出等号反对主动去掉多余的操作符再进行计算。
  10. 初始输出表达式含 1 万个操作数和随机操作符,在每次计算前后打印出计算耗时日志。

脚手架

https://codesandbox.io/s/calc...

性能测试示例:

function test() {  function randomOperator() {    return [      { type: "operator", value: "plus", display: "+" },      { type: "operator", value: "minus", display: "-" },      { type: "operator", value: "multiply", display: "×" },      { type: "operator", value: "divide", display: "÷" }    ][Math.floor(Math.random() * 4)];  }    function randomOperand() {    const value = Math.floor(1 + Math.random() * 100);    return {      type: "operand",      value,      display: String(value)    };  }  var input = [randomOperand()];  for (let index = 0; index < 100000; index++) {    input.push(randomOperator());    input.push(randomOperand());  }  var calculator = new Calculator();  for (let index = 0; index < input.length; index++) {    calculator.press(input[index]);  }  var begin = performance.now();  console.log("> result", calculator.compute());  console.log("> elapsed time", performance.now() - begin);}