자바스크립트는 '사전순'으로 문자열을 비교합니다. '사전편집(lexicographical)' 순이라고 불리기도 하는 이 기준을 적용하면 사전 뒤쪽의 문자열은 사전 앞쪽의 문자열보다 크다고 판단됩니다.
예를들어,
let test1 = ('I' > 'A');
let test2 = ('gentle' > 'gentla');
let test3 = ('man' > 'ma');
console.log('1.: '+ test1 );
console.log('2.: '+ test2 );
console.log('3.: '+ test3 );
1. : true
1. : true
1. : true
문자열 비교시 적용되는 알고리즘은 다음과 같습니다.
1. 두 문자열의 첫글자를 비교합니다.
2. 첫 번째 문자열의 첫 글자가 다른 문자열의 첫 글자보다 크면(작으면), 첫 번째 문자열이 두 번째 문자열보다 크다고(작다고) 결론 내고 비교를 종료합니다.
3. 두 문자열의 첫글자가 같으면 두 번째 글자를 같은 방식으로 비교합니다.
4. 글자 간 비교가 끝날 때까지 이 과정을 반복합니다.
5. 비교가 종료되었고 문자열의 길이도 같다면 두 문자열은 동일하다고 결론 냅니다. 비교가 종료되었지만 두 문자열의 길이가 다르면 길이가 긴 문자열이 더 크다고 결론 냅니다.
첫번 째 예시를 보면,
바로 비교가 되서 결과를 돌출할 수 있습니다.
두번째 예시는,
'gentl'까지 문자는 서로 같기 때문에 과정을 반복하다가 마지막 문자열인 'e' 와 'a'의 비교를 통해 결과를 도출합니다.
세번째 예시는,
'ma' 까지는 글자가 똑같지만 글자열의 갯수가 다르므로, 'man'이 더 크다는 결론을 도출합니다.
정확히는 사전 순이 아니라 유니코드 순입니다.
자바 스크립트의 문자열 비교 알고리즘은 사전이나 전화번호부에서 사용되는 정렬 알고리즘과 아주 유사하지만, 완전히 같진 않습니다.
차이점 중 하나는 자바스크립트는 대•소문자를 따진다는 것입니다. 대문자 'A'와 소문자 'a' 를 비교했을 때 소문자 'a'가 더큽니다.
자바스크립트 내부에서 사용되는 표인 유니코드에선 소문자가 대문자보다 더 큰 인덱스를 갖기 때문입니다.
null 이나 undefined와 비교
null 이나 undefined를 다른 값과 비교할 땐 예상치 않은 일들이 발생합니다. 일단 몇가지 규칙을 먼저 살펴본 후, 어떤 예상치 않은 일들이 일어나는지 구체적인 예시를 통해 살펴보도록 하겠습니다.
일치 연산자 === 를 사용하여 null 과 undefined 를 비교
두값은 자료형이 다르기 때문에 일치 비교 시 거짓을 반환합니다.
null : object
undefined : undefined;
typeof null // 'object'
typeof undefined // 'undefined'
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
동등 연산자를 사용해 null 과 undefined를 비교하면 특별한 규칙이 적용돼 true가 반환됩니다. 동등 연산자는 null과 unefined를 '각별한 커플'처럼 취급합니다. 두 값은 자기들 끼리 잘 어울리지만 다른값과는 잘 어울리지 못합니다.
let test1 = (null == undefined);
let test2 = (null >= undefined);
let test3 = (null <= undefined);
console.log('1.: '+ test1 );
console.log('2.: '+ test2 );
console.log('3.: '+ test3 );
1.: true
2.: false
3.: false
null 과 0 비교
null 과 0 을 비교하면,
let test1 = (null == 0);
let test2 = (null >= 0);
let test3 = (null <= 0);
let test4 = (null < 0);
let test5 = (null > 0);
console.log('1.: '+ test1 );
console.log('2.: '+ test2 );
console.log('3.: '+ test3 );
console.log('4.: '+ test4 );
console.log('5.: '+ test5 );
1.: false
2.: true
3.: true
4.: false
5.: false
이상하게 test3,test4 의 결과값만 true 가 나오고 나머지는 false가 나왔습니다.
이러한 이유는,
동등 연산자와 == 와 기타 비교 연산자 < , > , <=, >= 의 동작 방식이 다르기 때문입니다. null > 0 이 거짓을, null >= 0 이 참을 반환하는 이유는 (기타 비교 연산의 동작원리에 따라) null 이 숫자형으로 변환돼 0이 되기 때문이고,
동등연산자 == 은 피연산자가 undefined 이거나 null 일 때 형을 변환하지 않아 다음과 같은 결과가 나옵니다.
대신, undefined 와 null을 비교하는 경우에만 true를 반환하고, 그 이외는 무조건 false를 반환합니다.
'javascript' 카테고리의 다른 글
require vs import 문법 비교하기 (0) | 2023.06.07 |
---|---|
Method Chaining (함수 연달아 쓰기) (0) | 2023.02.14 |
스프레드 문법(...arr) (0) | 2023.02.14 |
소수 출력하는 알고리즘 (0) | 2023.02.13 |
옵셔널 체이닝 (0) | 2023.02.12 |