calculator

Creating the dots·2021년 6월 21일
0

Javascript

목록 보기
5/24

calculator 만들기

const calculator = document.querySelector('.calculator');
const buttons = document.querySelector('.calculator__buttons');
const firstOperend = document.querySelector('.calculator__operend--left');
const operator = document.querySelector('.calculator__operator');
const secondOperend = document.querySelector('.calculator__operend--right');
const calculatedResult = document.querySelector('.calculator__result');

//enter 버튼을 눌렀을때, 작동하는 함수 
function calculate(n1,operator,n2){
  let result = 0;
  
  n1 = Number(n1);
  n2 = Number(n2);
  
  if(operator==='+') //여기서 operator는 매개변수 operator. 
  {
    result = n1+n2;
  }
  else if(operator==='-')
  {
    result = n1-n2;
  }
  else if(operator==='*')
  {
    result = n1*n2;
  }
  else if(operator==='/')
  {
    result = n1/n2;
  }
  
  return String(result);
}

let isFilled=false; 

buttons.addEventListener('click',function(event){
  
  const target = event.target;
  const action = target.classList[0];
  const buttonContent = target.textContent; //textContent는 string을 리턴한다.
	
  if(target.matched('button'))
  {
    if(action==='number' && isFilled===false)
    {
      firstOperend.textContent = buttonContent;
      isFilled=true;
      return; //return하지 않으면 다음 조건도 이어서 만족하므로 첫번째와 두 번째 숫자가 같게 출력되므로 꼭 return을 해줘야한다!
    }
    if(action==='number' && isFilled)
    {
      secondOperend.textContent = buttonContent;
    }
    if(action==='operator')
    {
      operator.textContent = buttonContent;
    }
    if(action==='decimal')
    {
      //console.log('소수점 버튼');
    }
    if(action==='clear')
    {
      firstOperend.textContent = '0';
      secodnOperend.textContent = '0';
      operator.textContent = '+';
      calculatedResult.textContent = '0';
      
      return isFilled = false;
    }
    if(action==='calculate')
    {
      calculate(firstOperend.textContent,operator.textContent,secondoperend.textContent);
      calculateResult.teextContent = result;
    
    }
  }
  
});

textContent

let isFilled=false

클릭된 버튼이 '숫자'이고, 클릭 전 입력값이 없는 경우, firstOperend에 클릭값을 할당하고, isFilled에 true를 재할당한다.

if(action==='number' && firstOperend.textContent==='0'){
  firstOperend.textContent = buttonContent;
}
if(action==='number' && firstOperend.textContent!=='0'){
  secondOperend.textContent = buttonContent;
}

만약 isFilled를 선언하지 않고, 위와 같이 firstOperend.textContent==='0'인지 아닌지로 조건을 나눈다면, 어떤 문제가 발생할까?
buttonContent==='0'인 경우, 즉 유저가 0을 클릭한 경우 firstOperend.textContent==='0'인 상태가 유지되어 0이 아닌 숫자를 먼저 입력해야만 하는 것이다. 따라서 0+1, 0*2 ,..., 등 0으로 시작하는 연산을 할 수 없게 된다.

그러므로 다음과 같이 작성해줘야 한다.

let isFilled=false;
//이하 중략
if(action==='number' && isFilled===false)
{
  firstOperend.textContent = buttonContent;
  isFilled=true;
}
if(action==='number' && isFilled)
{
  secondOperend.textContent = buttonContent;
}
//이하 중략
if(action==='clear')
{//0+0=0의 상태로 초기화시키고, isFilled도 false로 초기화!
  firstOperend.textContent = '0';
  secondOperend.textContent = '0';
  operator.textContent = '+';
  calculatedResult = '0';
  isFilled=false;
}

이 경우, firstOperend.textContent==='0'이라는 조건이 없으므로 0으로 시작하는 연산도 가능해진다.

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글

관련 채용 정보