#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 = '';