如何 return 使用 indexOf() 而不是 includes() 的布尔值?

How to return a boolean using indexOf() instead of includes()?

我正在做一个计算器挑战,当我开始解决小数点的部分时,它给了我意想不到的行为。我制作了一个名为输入数字的函数,当单击小数点键时,我需要将小数点附加到显示中已存在的数字。 在函数内部,我使用 if 语句通过使用 (...)indexOf(dot) === -1!(...).includes(dot) 检查对象的 属性 是否不包含点,如果不包含我将添加到 属性反对点。但是浏览器中的结果是,当我单击该点时,它显示了两个点而不是一个点,我想知道我做错了什么。

到目前为止,这是我的代码:

const calculator = {
  displayValue: '0',
  firstOperand: null,
  waitingForSecondOperand: false,
  operator: null
};

function inputDigit(digit) {

  const {
    displayValue
  } = calculator;
  calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;

}

//*here is the function that adds a dot* 
function inputDecimal(dot) {
  if (!calculator.displayValue.includes(dot)) {
    calculator.displayValue += dot;
  }
}

function updateDisplay() {
  const display = document.querySelector('#screen');
  display.value = calculator.displayValue;
}

updateDisplay();

const keys = document.querySelector('.calculator-keys');

keys.addEventListener('click', (e) => {

  const {
    target
  } = e; // is equivalent to const target = event.target;

  if (!target.matches('button')) {
    return;
  }

  if (target.classList.contains('operator')) {
    console.log('operator', target.value);
    return;
  }

  if (target.classList.contains('decimal')) {
    inputDecimal(target.value);
    updateDisplay();

  }

  if (target.classList.contains('all-clear')) {
    console.log('clear', target.value);
    return;
  }

  inputDigit(target.value);
  // /
  updateDisplay();

});
html {
  font-size: 62.5%;
  box-sizing: border-box;
}

*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

.calculator {
  border: 1px solid #ccc;
  border-radius: 5px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 400px;
}

.calculator-screen {
  width: 100%;
  font-size: 5rem;
  height: 80px;
  border: none;
  background-color: #252525;
  color: #fff;
  text-align: right;
  padding-right: 20px;
  padding-left: 10px;
}

button {
  height: 60px;
  background-color: #fff;
  border-radius: 3px;
  border: 1px solid #c4c4c4;
  background-color: transparent;
  font-size: 2rem;
  color: #333;
  background-image: linear-gradient(to bottom, transparent, transparent 50%, rgba(0, 0, 0, .04));
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .05), inset 0 1px 0 0 rgba(255, 255, 255, .45), inset 0 -1px 0 0 rgba(255, 255, 255, .15), 0 1px 0 0 rgba(255, 255, 255, .15);
  text-shadow: 0 1px rgba(255, 255, 255, .4);
}

button:hover {
  background-color: #eaeaea;
}

.operator {
  color: #337cac;
}

.all-clear {
  background-color: #f0595f;
  border-color: #b0353a;
  color: #fff;
}

.all-clear:hover {
  background-color: #f17377;
}

.equal-sign {
  background-color: #2e86c0;
  border-color: #337cac;
  color: #fff;
  height: 100%;
  grid-area: 2 / 4 / 6 / 5;
}

.equal-sign:hover {
  background-color: #4e9ed4;
}

.calculator-keys {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 20px;
  padding: 20px;
}
<div class="calculator">

  <input type="text" id="screen" class="calculator-screen" value="" disabled />
  <div class="calculator-keys">

    <button type="button" class="operator" value="+">+</button>
    <button type="button" class="operator" value="-">-</button>
    <button type="button" class="operator" value="*">&times;</button>
    <button type="button" class="operator" value="/">&divide;</button>

    <button type="button" value="7">7</button>
    <button type="button" value="8">8</button>
    <button type="button" value="9">9</button>

    <button type="button" value="4">4</button>
    <button type="button" value="5">5</button>
    <button type="button" value="6">6</button>

    <button type="button" value="1">1</button>
    <button type="button" value="2">2</button>
    <button type="button" value="3">3</button>

    <button type="button" value="0">0</button>
    <button type="button" class="decimal function" value=".">.</button>
    <button type="button" class="all-clear function" value="all-clear">AC</button>

    <button type="button" class="equal-sign operator" value="=">=</button>

  </div>

</div>

在您的 addEventListener 代码中,由于您正在处理除数字以外的所有情况,对于所有事件侦听器,将为每种类型的按钮点击调用 inputDigit(target.value) 函数,无论是数字,小数或运算符。因此,在添加小数点时,有两个函数,分别称为 inputDecimalinputDigit,这就是您在每次点击小数点按钮时获得两个小数点的原因。

为避免这种情况,您只需为所有数字输入添加 'digit' class,如下所示

  <button type="button" value="1" class="digit">1</button>
  <button type="button" value="2" class="digit">2</button>
  <button type="button" value="3" class="digit">3</button>

并且在事件侦听器中您可以添加以下代码

if (target.classList.contains('digit')) {
  inputDigit(target.value);
  updateDisplay();
}

HTML 的完整代码是

<div class="calculator">
  <input type="text" id="screen" class="calculator-screen" value="" disabled />
  <div class="calculator-keys">
    <button type="button" class="operator" value="+">+</button>
    <button type="button" class="operator" value="-">-</button>
    <button type="button" class="operator" value="*">&times;</button>
    <button type="button" class="operator" value="/">&divide;</button>

    <button type="button" value="7" class="digit">7</button>
    <button type="button" value="8" class="digit">8</button>
    <button type="button" value="9" class="digit">9</button>

    <button type="button" value="4" class="digit">4</button>
    <button type="button" value="5" class="digit">5</button>
    <button type="button" value="6" class="digit">6</button>

    <button type="button" value="1" class="digit">1</button>
    <button type="button" value="2" class="digit">2</button>
    <button type="button" value="3" class="digit">3</button>

    <button type="button" value="0" class="digit">0</button>
    <button type="button" class="decimal function" value=".">.</button>
    <button type="button" class="all-clear function" value="all-clear">AC</button>

    <button type="button" class="equal-sign operator" value="=">=</button>

  </div>

</div>

而 JavaScript 代码是

<script>
  const calculator = {
    displayValue: '0',
    firstOperand: null,
    waitingForSecondOperand: false,
    operator: null
  };

  function inputDigit(digit) {

    const { displayValue } = calculator;
    calculator.displayValue = displayValue === '0' ? digit : displayValue + digit;
  }

  function inputDecimal(dot) {
    if (!calculator.displayValue.includes(dot)) {
      calculator.displayValue += dot;
    }
  }

  function updateDisplay() {
    const display = document.querySelector('#screen');
    display.value = calculator.displayValue;
  }

  updateDisplay();

  const keys = document.querySelector('.calculator-keys');

  keys.addEventListener('click', (e) => {
    const { target } = e; // is equivalent to const target = event.target;
    if (!target.matches('button')) {
      return;
    }
    if (target.classList.contains('operator')) {
      return;
    }
    if (target.classList.contains('decimal')) {
      inputDecimal(target.value);
      updateDisplay();
    }
    if (target.classList.contains('all-clear')) {
      console.log('clear', target.value);
      return;
    }
    if (target.classList.contains('digit')) {
      inputDigit(target.value);
      updateDisplay();
    }
  });
</script>