Post

동등 비교 연산자를 지양해야 하는 이유

JavaScript에서 연산자 중 비교 연산자는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 불리언 값으로 반환한다. 비교 연산자는 if문이나 for문과 같은 제어문의 조건식에서 주로 사용한다.
비교 연산자에는 동등 비교 연산자일치 비교 연산자가 있는데, 이는 엄격성의 정도에 따라 구분이 된다.

동등 비교 연산자

그 중 동등 비교(==) 연산자좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다.

이 비교 연산자가 편리한 경우도 있지만, 암묵적 타입 변환으로 인해 결과를 예측하기도 어렵고 실수하기도 쉽다. 이 연산자를 남발하게 된다면 안티 패턴이라는 가독성, 성능, 유지보수 등에 부정적인 영향을 줄 수 있어 지양하는 패턴이 되게 된다.

그래서 이를 사용하지 말고 일치 비교 연산자를 사용하는 것이 좋다.

일치 비교 연산자

일치 비교(===) 연산자좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다.

1
2
3
4
5
6
// 일치 비교
1 === 5 // true

// 암묵적 타입 변환을 하지 않고 값을 비교한다.
// 즉, 값과 타입이 모두 같은 경우만 true를 반환한다.
1 === '1' // false


이 연산자에서 주의해야 할 점은 NaN0이다.

먼저 NaN은 자신과 일치하지 않는 유일한 값이다. 따라서 숫자가 NaN인지 조사하려면 빌트인 함수 Number.isNaN 을 사용한다.

1
2
3
4
// Number.isNaN 함수는 지정한 값이 NaN인지 확인하고 그 결과를 불리언 값으로 반환한다.
Number.isNaN(NaN); // -> true
Number.isNaN(10); // -> false
Number.isNaN(1 + undefined); // -> true


그리고 숫자 0양의 0음의 0이 있는데, 이를 일치 비교 연산자를 사용하여 비교하면 true가 나온다. 만약 이를 구분해서 비교하고 싶다면, Object.is() 메서드를 사용하면 된다.

1
2
3
4
5
-0 === +0; // -> true
Object.is(-0, +0); // -> false

NaN === NaN; // -> false
Object.is(NaN, NaN); // -> true