Неперехваченная ошибка типа: не удается прочитать свойство ‘toString’ неопределенного —javascript

#javascript #html #ecmascript-6

#javascript #HTML #ecmascript-6

Вопрос:

Я пытаюсь создать калькулятор с помощью javascript, но я продолжаю получать сообщение об ошибке «Uncaught TypeError: не удается прочитать свойство’toString’ неопределенного значения» на консоли всякий раз, когда я нажимаю на цифровую кнопку. и в то же время кнопка с номером не отображается в строках. Что я делаю не так?

 //Javascript

class Calculator {
  constructor(previousOperandTextElement, currentOperandTextElement) {
    this.previousOperandTextElement = previousOperandTextElement;
    this.currentOperandTextElement = currentOperandTextElement;
    this.clear();
  }
  clear() {
    this.previousOperandElement = '';
    this.currentOperandElement = '';
    this.operation = undefined;
  }

  delete() {

  }

  appendNumber(number) {
    this.currentOperand = this.currentOperand.toString()   number.toString();
  }

  chooseOperation(operation) {

  }

  compute() {

  }

  updateDisplay() {
    this.currentOperandTextElement.innerText = this.currentOperand;
  }
}


const numberButtons = document.querySelectorAll('[data-number]');
const operationButtons = document.querySelectorAll('[data-operation]');
const equalsButton = document.querySelector('[data-equals]');
const deleteButton = document.querySelector('[data-delete]');
const allClearButton = document.querySelector('[data-all-clear]');
const previousOperandTextElement = document.querySelector('[data-previous-operand]');
const currentOperandTextElement = document.querySelector('[data-current-operand]');

const calculator = new Calculator(currentOperandTextElement, previousOperandTextElement);

numberButtons.forEach(button => {
  button.addEventListener('click', () => {
    calculator.appendNumber(button.innerText);
    calculator.updateDisplay();
  });
}); 
 //CSS


*,
*::before,
*::after {
  box-sizing: border-box;
  font-family: Gotham Rounded, sans-serif;
  font-weight: normal;
}

body {
  padding: 0;
  margin: 0;
  background: linear-gradient(to right, #722f37, #caa181);
}

.calculator-grid {
  display: grid;
  justify-content: center;
  align-content: center;
  min-height: 100vh;
  grid-template-columns: repeat(4, 100px);
  grid-template-rows: minmax(120px, auto) repeat(5, 100px);
}

.calculator-grid>button {
  cursor: pointer;
  font-size: 2rem;
  border: 1px solid white;
  outline: none;
  background-color: rgba(255, 255, 255, .75);
}

.calculator-grid>button:hover {
  background-color: rgba(255, 255, 255, .9);
}

.span-two {
  grid-column: span 2;
}

.output {
  grid-column: 1 / -1;
  background-color: rgba(51, 35, 35, 0.397);
  display: flex;
  align-items: flex-end;
  justify-content: space-around;
  flex-direction: column;
  padding: 10px;
  word-wrap: break-word;
  word-break: break-all;
}

.output .previous-operand {
  color: rgba(255, 255, 255, .75);
  font-size: 1.5rem;
}

.output .current-operand {
  color: white;
  font-size: 2.5rem;
} 
 <!-- HTML -->



<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" , initial-scale=1.0>
  <meta http-equiv="X-UA-compatible" content="ie=edge">
  <link href="styles.css" rel="stylesheet">
  <title>Calculator</title>
  <script src="script.js" defer></script>

</head>

<body>
  <div class="calculator-grid">
    <div class="output">
      <div data-previous-operand class="previous-operand"></div>
      <div data-current-operand class="current-operand"></div>
    </div>
    <button data-all-clear class="span-two">AC</button>
    <button data-delete>DEL</button>
    <button data-operation>÷</button>
    <button data-number>1</button>
    <button data-number>2</button>
    <button data-number>3</button>
    <button data-operation>*</button>
    <button data-number>4</button>
    <button data-number>5</button>
    <button data-number>6</button>
    <button data-operation> </button>
    <button data-number>7</button>
    <button data-number>8</button>
    <button data-number>9</button>
    <button data operation>-</button>
    <button data-number>.</button>
    <button data-number>0</button>
    <button data-equals class="span-two">=</button>
  </div>
</body>

</html> 

Комментарии:

1. Единственное место, которое вы назначаете this.currentOperand , находится в строке, на которую вы ссылаетесь this.currentOperand.toString()

Ответ №1:

Вы не инициализируете «currentOperand».

  constructor(previousOperandTextElement, currentOperandTextElement) {
    this.previousOperandTextElement = previousOperandTextElement;
    this.currentOperandTextElement = currentOperandTextElement;
    this.currentOperand = "";
    this.clear();
  }
 

Ответ №2:

при первом нажатии кнопки your this.currentOperand не имеет никакого значения, поэтому оно будет undefined переменным. и undefined переменная не имеет свойства toString . Итак, решение заключается в том, что вам нужно поставить условие в этой функции appendNumber, что если переменная не определена, то переменная просто заполняется number.toString подобным кодом ниже

 appendNumber(number) {
    if(this.currentOperand != undefined){
         this.currentOperand = this.currentOperand.toString()   number.toString();
    }else{
        this.currentOperand = number.toString();
    }
}
 

или, если вы хотите сделать это проще, вы можете определить переменную в конструкторе, потому что в основном ошибка вызвана Cannot read property 'toString' of undefined , поэтому нам просто нужно изменить переменную в первом состоянии, изменив неопределенную переменную на определенную переменную с помощью

 this.currentOperand = '';