我正在做一个简单的计算器,到目前为止,它对我来说工作得相当不错,除了当我试图输入大于9的数字时.如果我输入11+55,它会将第一个数字保存为2,将第二个数字保存为10,当我显然希望它保存11和55并返回66时,返回12.

对任何愿意花时间帮助我的人,我要提前表示感谢!

老实说,我对所有这些都是非常陌生的,但我非常确定这个问题在我的结果函数中的某个地方,在我的js文件的顶部,但我一直对它感到非常困惑.它似乎在添加它应该连接的某个地方?

这就是我要做的.

  <body>
    <h2>Calculator</h2>
    <div class="top">
      Output will show up here
      <p id="calculations"></p>
    </div>
    <div class="buttons">  
      <button id="one" onclick="results(1)">1</button>
      <button id="two" onclick="results(2)">2</button>
      <button id="three" onclick="results(3)">3</button>
      <button id="subtraction" onclick="setOperator(`-`)">-</button>
      <button id="four" onclick="results(4)">4</button>
      <button id="five" onclick="results(5)">5</button>
      <button id="six" onclick="results(6)">6</button>
      <button id="addition" onclick="setOperator(`+`)">+</button>
      <button id="seven" onclick="results(7)">7</button>
      <button id="eight" onclick="results(8)">8</button>
      <button id="nine" onclick="results(9)">9</button>
      <button id="divison" onclick="setOperator(`/`)">/</button>
      <button id="zero" onclick="results(0)">0</button>
      <button id="enter" onclick="enterButton()">Enter</button>
      <button id="clear" onclick="clearResults()">Clear</button>
      <button id="mulitplication" onclick="setOperator(`*`)">*</button>
    </div>

  </body>
</html>



let firstNumber = null;
let secondNumber = null;
let operator = null;
let result = null;

function results(input) {
    document.getElementById("calculations").insertAdjacentHTML('beforeend', (input));
  
    if (operator === null) {
      // If operator is null, update firstNumber
      if (firstNumber === null) {
        firstNumber = input;
      } else {
        firstNumber += input;
      }
    } else {
      // If operator is not null, update secondNumber
      if (secondNumber === null) {
        secondNumber = input;
      } else {
        secondNumber += input;
      }
    }
  }


function calculateResult() {
  if (firstNumber === null || secondNumber === null) {
    return null;
  }
  
  const num1 = Number(firstNumber);
  const num2 = Number(secondNumber);
  
  if (isNaN(num1) || isNaN(num2)) {
    return null;
  }

  switch (operator) {
    case "+":
      return Number(firstNumber) + Number(secondNumber);
    case "-":
      return Number(firstNumber) - Number(secondNumber);
    case "*":
      return Number(firstNumber) * Number(secondNumber);
    case "/":
      return Number(firstNumber) / Number(secondNumber);
    default:
      return null;
  }
}

function enterButton() {
  if (result === null) {
  // Calculate the result and update the calculations element
  const result = calculateResult();
  if (result !== null) {
    document.getElementById("calculations").innerHTML = result;
  }
}
    // Set firstNumber to the result, and reset secondNumber and operator
    firstNumber = result;
    secondNumber = null;
    operator = null;
  }

推荐答案

由于您要将一个数字传递给results()函数,因此在您的数字的内联onclick处理程序中,例如onclick="results(1)",您必须将输入转换为字符串:

function results(input) {
  document.getElementById("calculations").insertAdjacentHTML('beforeend', input);
  const inputAsString = `${input}`; // cast to a string

  if (operator === null) {
    // If operator is null, update firstNumber
    if (firstNumber === null) {
      firstNumber = inputAsString;
    } else {
      firstNumber += inputAsString; // string concatenation
    }
  } else {
    // If operator is not null, update secondNumber
    if (secondNumber === null) {
      secondNumber = inputAsString;
    } else {
      secondNumber += inputAsString; // string concatenation
    }
  }
}

或传入一个字符串(带引号的数字):

<button id="one" onclick="results('1')">1</button>

编辑

至于您的后续问题,您需要将结果作为字符串存储在firstNumber变量中.您应该将firstNumbersecondNumber变量视为类型化(字符串)变量.如果您使用的是TypeScrip,IDE和编译器会抱怨这一点.我将enterButton()函数更改为以下内容:

function enterButton() {
  // Calculate the result and update the calculations element
  const result = calculateResult();
  if (result !== null) {
    document.getElementById("calculations").innerHTML = result;
    // Set firstNumber to the result
    firstNumber = `${result}`; // store as string
  }
  // Reset secondNumber and operator
  secondNumber = null;
  operator = null;
}

我还删除了全局result,因为它没有意义,并且与局部作用域变量同名.

工作示例

const displayEl = document.getElementById("calculations");

let firstNumber = null;  // string
let secondNumber = null; // string
let operator = null;     // string

function results(input) {
  displayEl.insertAdjacentHTML('beforeend', input);
  const inputAsString = `${input}`; // cast to a string

  if (operator === null) {
    // If operator is null, update firstNumber
    if (firstNumber === null) {
      firstNumber = inputAsString;
    } else {
      firstNumber += inputAsString;
    }
  } else {
    // If operator is not null, update secondNumber
    if (secondNumber === null) {
      secondNumber = inputAsString;
    } else {
      secondNumber += inputAsString;
    }
  }
}

function clearResults() {
  document.getElementById("calculations").innerHTML = "";
  firstNumber = null;
  secondNumber = null;
  operator = null;
  result = null;
}

function calculateResult() {
  console.log(firstNumber, secondNumber);
  if (firstNumber === null || secondNumber === null) {
    return null;
  }

  const num1 = Number(firstNumber);
  const num2 = Number(secondNumber);

  if (isNaN(num1) || isNaN(num2)) {
    return null;
  }

  switch (operator) {
    case "+":
      return Number(firstNumber) + Number(secondNumber);
    case "-":
      return Number(firstNumber) - Number(secondNumber);
    case "*":
      return Number(firstNumber) * Number(secondNumber);
    case "/":
      return Number(firstNumber) / Number(secondNumber);
    default:
      return null;
  }
}

function enterButton() {
  // Calculate the result and update the calculations element
  const result = calculateResult();
  if (result !== null) {
    document.getElementById("calculations").innerHTML = result;
    // Set firstNumber to the result
    firstNumber = `${result}`; // store as string
  }
  // Reset secondNumber and operator
  secondNumber = null;
  operator = null;
}

function setOperator(op) {
  // Set the value of the operator
  if (firstNumber !== null && operator === null) {
    operator = op;
    document.getElementById("calculations").insertAdjacentHTML('beforeend', op);
  } else if (secondNumber !== null && operator !== null) {
    const result = calculateResult();
    if (result !== null) {
      document.getElementById("calculations").innerHTML = result + op;
      firstNumber = result;
      secondNumber = null;
      operator = op;
    }
  } else if (firstNumber !== null && operator !== null && secondNumber === null) {
    operator = op;
    document.getElementById("calculations").innerHTML = firstNumber + op;
  }
}
#calculations {
  min-height: 1rem;
}
<h2>Calculator</h2>
<div class="top">
  Output will show up here
  <p id="calculations"></p>
</div>
<div class="buttons">
  <button id="one" onclick="results(1)">1</button>
  <button id="two" onclick="results(2)">2</button>
  <button id="three" onclick="results(3)">3</button>
  <button id="subtraction" onclick="setOperator(`-`)">-</button>
  <button id="four" onclick="results(4)">4</button>
  <button id="five" onclick="results(5)">5</button>
  <button id="six" onclick="results(6)">6</button>
  <button id="addition" onclick="setOperator(`+`)">+</button>
  <button id="seven" onclick="results(7)">7</button>
  <button id="eight" onclick="results(8)">8</button>
  <button id="nine" onclick="results(9)">9</button>
  <button id="divison" onclick="setOperator(`/`)">/</button>
  <button id="zero" onclick="results(0)">0</button>
  <button id="enter" onclick="enterButton()">Enter</button>
  <button id="clear" onclick="clearResults()">Clear</button>
  <button id="mulitplication" onclick="setOperator(`*`)">*</button>
</div>

Javascript相关问答推荐

除了在Angular 16中使用快照之外,什么是可行且更灵活的替代方案?

如何使用Paged.js仅渲染特定页面

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

如何判断属于多个元素的属性是否具有多个值之一

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

从mat—country—select获取整个Country数组

基于变量切换隐藏文本

使搜索栏更改语言

如何从一个列表中创建一个2列的表?

当运行d3示例代码时,没有显示任何内容

在HTML语言中调用外部JavaScript文件中的函数

如何使用JS创建一个明暗功能按钮?

Rxjs流中生成IMMER不能在对象上操作

将相关数据组合到两个不同的数组中

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

TypeORM QueryBuilder限制联接到一条记录

有没有办法在R中创建一张具有多个色标的热图?

如何处理不带参数的redux thunk payloadCreator回调函数?

使用Java脚本在div中创建新的span标记