단순히 입력한 수 중에 큰 수를 출력해주는 함수가 있다.
function compare(a, b) {
if (a > b) {
console.log(`입력된 수: ${a},${b} / 큰수 : ${a}`)
} else if (a < b){
console.log(`입력된 수: ${a},${b} / 큰수 : ${b}`)
} else if (a===b){
console.log("Same Value, Same Type")
} else if (a==b) {
console.log("Same Value, Different Type")
} else {
console.log("오류발생!")
}
};
compare(5, '15'); // case 1
compare('5', '9'); // case 2
compare('5', '15'); // case 3
스크롤을 내리기 전에 case 1, 2, 3의 결과를 조금만 고민해보자.
.
.
.
.
결과는 ?
compare(5, '15'); // 입력된 수: 5,15 / 큰수 : 15
compare('5', '9'); // 입력된 수: 5,15 / 큰수 : 9
compare('5', '15'); // 입력된 수: 5,15 / 큰수 : 5
우선 case별로 살펴보자.
case 1
5와 '15'의 비교.
이 경우 자바스크립트같은 동적언어의 특징인 자동 타입변환이 일어나면서
'15' 를 15로 변환해서 판정해준다.
그러므로 결과는 단순히 큰 수를 출력해준다.
case 2
그렇다면 문자열과 문자열의 비교는 어떨까?
일단 '5' 와 '9' 중 '9'가 크니 결과는 '9' 일 것 같다.
그리고 실제로 실행해보니 예측한대로 나왔다.
여기까지만 하면 큰 문제가 없다.
case 3
일단 결과가 믿기 힘들다. '5', '15' 중 대체 왜 큰 수가 '5'가 나올까?
그리고 case 2에서는 왜 제대로 큰 수가 나왔을까?
해답은 아스키코드( ASCII )에 있다.
숫자와 알파벳 대소문자의 아스키코드를 보자.
- 숫자 0 ~ 10 : 48 ~ 57
- 알파벳 대문자 A ~ Z : 65 ~ 90
- 알파벳 소문자 a ~ z : 97 ~ 122
숫자 < 알파벳 대문자 < 알파벳 소문자 순으로 코드 값이 커진다.
즉, case 2 에서 비교했던 값은 단순히 '5'와 '9'비교한것이 아닌 아스키코드값 53과 56을 비교했던 것이다.
그럼 case 3 의 경우는?
아스키코드를 비교할때 사전 순으로 빠를 수록 큰 수라는 것을 명심하자.
apple과 banana 중 사전에 먼저오는 단어는 당연히 apple일 것이다. 즉, 단어의 첫 글자로 우선순위를 매기는 것이다.
이제 case 3 를 보자.
아스키코드의 시점으로 '5', '15' 를 보자.
'5', '15' 를 비교하는 것이 아니다. 단어의 첫글자인 '5', '1' 를 비교하고 있는 것이다.
그렇게 보는 순간 당연히 '5', '1' 중 큰 수는 당연히 '5'이다.
이제 '5', '15' 를 비교하면 '5'가 큰 수로 나오게 되는 어처구니 없는 현상을 이해할 수 있게 되었다..!
'JavaScript' 카테고리의 다른 글
[JS 완전가이드] 타입, 값, 변수 요약 (1) | 2023.10.17 |
---|---|
[JS] 관용어처럼 쓰이는 타입변환 예 (0) | 2023.10.16 |
JS 형변환에 대해서 (0) | 2023.10.06 |
0의 Boolean을 이용한 n번 실행되는 반복문 (0) | 2023.10.04 |
자바스크립트 객체와 클래스 관련 용어정리 (0) | 2023.09.26 |
댓글