헷갈렸던 부분 1

위의 예제를 콘솔창에 출력 해보면 "간식 드셨나요?"가 출력됩니다.
제가 의도한 바는 hours가 16보다 크거나 같고 17보다 작을때만을 위해
예제와 같이 작성을 해주었는데
알고보니 16 <= hours < 17은 16 <= hours || hours < 17 과 같은 것이었습니다.
즉, 예제에서 보이는 hours 는 현재 21인 상황인데 '간식 드셨나요?' 가 출력되는 이유가
16 <= hours < 17 는 || 과 같이 작동하므로 hours가 16보다 큰 것이 true가 되어
뒤의 17보다 작음은 확인하지 않고 바로 '간식 드셨나요?' 가 출력되는 것이었습니다.
이를 해결해주기 위해 16 <= hours && hours < 17 이렇게 적어주었습니다.
헷갈렸던 부분 2
const a = parseInt(prompt('숫자를 입력해주세요'));
if (a === NaN) {
alert('숫자를 입력해주세요');
} else if (a === 0) {
alert('0입니다');
} else if (a > 0) {
alert('양수입니다.');
} else {
alert('음수입니다.');
}
위의 예제에서 알림창에 숫자를 입력하지 않으면 '숫자를 입력해주세요'
를 출력하고 싶었습니다.
그러기 위해 parseInt(prompt('숫자를 입력해주세요')) 에 문자를 입력하였을 때
NaN임을 console.log로 찍어 확인을 하였고 예제와 같이 코드작성을 해주었습니다.
그러나 제가 원하는 바와는 다르게 계속 '음수입니다.' 가 출력 되었습니다.
이 또한 알고보니 변수 a가 NaN이라 할지라도 if조건문에서와 같이 NaN과 비교하면
false가 출력되는 것이었습니다.
확인을 위해 콘솔 창에서 NaN === NaN을 비교해주었고 false가 출력 되는 것을 확인했습니다.
즉, 굳이 비교하자면 무한대 === 무한대 또한 true가 아니듯이 NaN도 똑같다는 것입니다.
이를 해결해주고자 isNaN()을 사용하여 NaN이 맞냐 아니냐를 판단해주었고
코드를
const a = parseInt(prompt('숫자를 입력해주세요'));
if (isNaN(a)) {
alert('숫자를 입력해주세요');
} else if (a === 0) {
alert('0입니다');
} else if (a > 0) {
alert('양수입니다.');
} else {
alert('음수입니다.');
}
위와 같이 고쳐주니 제대로 작동했습니다.
찾아보니 NaN === NaN 이 false 인것은 JavaScript 언어 설계의 오류라고 합니다.. 허허