function monthClassify(month){
if(month == 1 || 3 || 5 || 7 || 8 || 10 || 12){
console.log(`${month}월의 날 수는 31`)
}else if(month == 4 || 6 || 9 || 11){
console.log(`${month}월의 날 수는 30`)
}else if(month == 2){
console.log(`${month}월의 날 수는 28 또는 29`)
}
}
monthClassify(2);
이렇게 했을 때 뭐가 출력될 것 같은지 예상해봅시다.
"혹시 2월의 날 수는 28 또는 29"를 예상하고 이렇게 만드셨다면 틀리셨습니다.
함수 인수에다 어떤 숫자를 넣어도
"2월의 날 수는 31" 이 출력이 됩니다.
왜그런 것인가 ??
||는 or을 뜻하는 것인데 왜 제대로 작동을 안 할까?
다시한번 코드를 보자
if(month == 1 || 3 || 5 || 7 || 8 || 10 || 12)
혹시 이 부분을 "month의 값이 1 또는 3 또는 5 또는 7 또는 8 또는 10 또는 12와 같은가?" 라고 해석하면 완전 땡! 이다.
위의 조건문은 month의 값이 어떤 값인가를 따지는 것이 아니라 month의 타입을 따지는 조건문이다.
다시 처음부터 생각해보자 || 이 표시는 OR연산자를 뜻하고 OR연산자는 논리 연산자이다.
(논리연산자에는 || (or) , &&. (and) , ! (not) 이 있다)
OR연산자는 boolean 값을 조작하는데 사용한다.
OR연산자는 모두가 false인 경우를 제외하고 연산 결과는 항상 true입니다.
피연산자가 boolean형이 아니면 평가를 위해 boolean형으로 변환됩니다.
예를 들어, 연산과정에서 1은 true로 , 숫자 0은 false로 바뀌어서 평가를 합니다.
이를 바탕으로 위의 조건을 보면 month === 1 또는 true 또는 ture 또는 true 또는 true 또는 true 라고 묻는거와 다름이 없다.
다시말해 ||은 비교연산자가 아니고 boolean 값을 조작하는 연산자이다.
그렇기 때문에 1이든 3이든 5든 7이든 2든 0이 아닌 값들은 전부 ture이기때문에 첫번째 조건에서 모두 걸리는 것이다.
그렇다면 어떻게 수정해야 우리가 원하는 대로 동작할까?
바로 비교 연산자를 사용해줘야한다.
비교연산자는 피연산자 사이의 상대적 크기를 판단하여 참과 거짓을 반환한다.
== , === , != , !=== , > , >= , < , <= 이 존재한다.
자바스크립트에서 비교 연산자는 타입에 따라 두 가지 기준으로 비교를 진행한다.
1. 피연산자가 둘 다 숫자면, 해당 숫자를 서로 비교한다.
2. 피연산자가 둘 다 문자열이면, 문자열의 첫 번째 문자부터 알파벳 순서대로 비교한다.
function monthClassify(month){
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
console.log(`${month}월의 날 수는 31`)
}else if(month == 4 ||month == 6 || month == 9 || month == 11){
console.log(`${month}월의 날 수는 30`)
}else if(month == 2){
console.log(`${month}월의 날 수는 28 또는 29`)
}
}
monthClassify(2); //2월의 날 수는 28 또는 29
이렇게 하면 우리가 의도한대로 작동한다.
꼭 기억하자 논리 연산자는 주어진 논리식을 판단하여, 참과 거짓을 반환한다.
source:https://arainablog.tistory.com/136
http://www.tcpschool.com/javascript/js_operator_comparison
https://ko.javascript.info/logical-operators
'Javascript > 개념' 카테고리의 다른 글
[JS - 개념] 함수 (0) | 2022.07.29 |
---|---|
[JS - 개념] Date() (0) | 2022.07.27 |
[JS - 개념] 비트 연산자 ( ing~) (0) | 2022.07.23 |
[JS 개념] DOM 요소 선택 (0) | 2022.07.21 |
[JS 개념] DOM 요소 선택 (0) | 2022.07.21 |