본문 바로가기

javascript

문자열 비교

자바스크립트는 '사전순'으로 문자열을 비교합니다. '사전편집(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