Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
217 views
in Technique[技术] by (71.8m points)

javascript - Cannot read property 'toString' , 'isNan' of undefined

I have been getting this error repeatedly and I haven't been able to find the exact cause for this. The error is:

Cannot read property 'toString' of undefined
    at Calculator.appendNumber (calc.js:16)
    at HTMLButtonElement.<anonymous> (calc.js:96)

This is happening with toString as well as isNan

Here is my HTML :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="calc.css">
    <title>Calculator</title>
</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>
    <script type="text/javascript" src="calc.js">
    </script>
</body>
</html>

Here is my Javascript:

class Calculator {
    constructor(previousOperandTextElement, currentOperandTextElement) {
        this.previousOperandTextElement = previousOperandTextElement
        this.currentOperandTextElement = currentOperandTextElement
    }
    clear(){
        this.currentOperand = ''
        this.previousOperand = ''
        this.operation = undefined
    }
    delete(){
      this.currentOperand =  this.currentOperand.toString().slice(0, -1)
    }
    appendNumber(number){
        if (number === '.' && this.currentOperand.includes('.')) return
    this.currentOperand = this.currentOperand.toString() + number.toString()
    }
    chooseOperation(operation){
        if (this.currentOperand === '') return
        if (this.previousOperand !== ''){
            this.compute()
        }
      this.operation = operation
      this.previousOperand = this.currentOperand
      this.currentOperand = ''

    }
    compute(){
     let computation
     const prev = parseFloat(this.previousOperand)
     const current = parseFloat(this.currentOperand)
     if(isNan(prev) || isNaN(curent)) return
     switch(this.operation){
         case '+':
             computation = prev + current
             break
        case '-':
             computation = prev - current
             break
        case '/':
             computation = prev / current
             break
        case '*':
             computation = prev * current
             break
            default:
                 return
     }
     this.currentOperand = computation
     this.operation = undefined
     this.previousOperand = ''
    }

    getDisplayNumber(number) {
        const stringNumber = number.toString()
        const integerDigits = parseFloat(stringNumber.split('.')[0])
        const decimalDigits = (stringNumber.split('.')[1])
        let integerDisplay
        if (isNan(integerDigits)) {
            integerDisplay = ''
        } else {
          integerDisplay = integerDigits.toLocaleString('en',{ maximumFractionDigits: 0})
        }
        if(decimalDigits != null){
            return `${intgerDisplay}.${decimalDigits}`
        } else {
            return integerDisplay
        }
    }

    updateDisplay(){
    this.currentOperandTextElement.innerText = this.getDisplayNumber(currentOperand)
    if (this.operation != null ) {
            this.previousOperandTextElement.innerText = 
         `${this.getDisplayNumber(this.previousOperand)} ${this.operation}`
      } else {
          this.previousOperandTextElement.innerText = ''
      }
    }

}


    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 previousOperand = document.querySelector('[data-previous-operand]')
    const currentOperand = document.querySelector('[data-current-operand]')

    const calculator = new Calculator (previousOperandTextElement, currentOperandTextElement)
    
    numberButtons.forEach(button =>{
        button.addEventListener('click', () =>{
        calculator.appendNumber(button.innerText)
        calculator.updateDisplay()
        })
    })

    operationButtons.forEach(button =>{
        button.addEventListener('click', () =>{
        calculator.chooseOperation(button.innerText)
        calculator.updateDisplay()
        })
    })

    equalsButton.addEventListener('click', button => {
      calculator.compute()
      calculator.updateDisplay()  
    })

    allClearButton.addEventListener('click', button => {
      calculator.clear()
      calculator.updateDisplay()  
    })

    deleteButton.addEventListener('click', button => {
      calculator.delete()
      calculator.updateDisplay()  
    })

I am using Electron and any help resolving this issue will be greatly appreciated.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

plese add checks with calculator.appendNumber(button.innerText) like this

button && button.innerText && calculator.appendNumber(button.innerText)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...