text/JavaScript
[18, 9].sort() = [18, 9] javascript sort weird...
hoonzii
2023. 5. 4. 16:58
반응형
[18,9]를 sort 하면 어떻게 될까?
array에 많이 들어있지도 않다. 숫자는 딱 2개… 겨우 단 2개…
컴퓨터를 사용하지 않고도, 심지에 이제 막 숫자를 배우기 시작하는 어린아이에게 18이 큰지, 9가 큰지
작은 숫자 순서대로 줄을 세워볼까? 라고 물어보면 단번에 답을 내릴 수 있는 아주 쉬운 문제다.
그런 줄 알았다.
단, javascript에게만 빼고 말이다…. 진짜 이게 무슨 말도 안 되는…
자.. 자.. 진정하고 가끔 그런 게 있을 수 있다. (아니 말도 안 되지만) 숫자라고 안 받아들이고 문자로 바꿔서 그런 거 아닐까?
제대로 정렬하기 위해서는 sort function의 인자값으로 내가 정의한
compare function(비교 함수)을 넣어줘야 한다. 아래와 같이 말이다.
[18, 9].sort(function(a, b){
return a-b;
});
당연히 여기까지 왔으면 왜?라는 물음이 나올 거다. 나도 그랬으니까.
한번 찾아보자.
유명한 MDN 사이트를 참고하자면
default로 모든 요소들을 “오름차순”, “string” 으로 변환한다고 적혀있다.
그리고,,, UTF-16 코드 단위 값의 시퀀스를 비교…
근데 왜 숫자값이 자명한데도…! 바꾸는 거지?
sort() 내부는 어떻게 구현되어 있을까? (사실 별로 안 궁금하다.) 링크는 여기
해당 함수에 대해 글로 서술된 사이트가 있어 가지고 왔다.
ECMAScript® 2024 Language Specification
해당 사이트의 글을 간단하게 표현하면 아래와 같다.
Array.prototype.sort //(sort 함수 호출)
-CompareArrayElements //(비교 함수 존재 하지 않을시 자체적인 비교함수 호출)
-ToString //(요소들을 string 으로 변환)
-Number::toString //(숫자 역시 예외없이 string으로 변환)
반응형