자바스크립트에서 조건문을 다루다 보면 '0' == false와 if(0)의 평가 결과가 서로 다르게 느껴져 혼란스러울 수 있습니다. 그 이유는 두 경우에 적용되는 평가 방식이 완전히 다르기 때문입니다. 하나씩 살펴보겠습니다.
1. '0' == false의 평가 과정 — 타입 강제 변환(type coercion)
동등 연산자(==)는 비교를 수행하기 전에 피연산자의 타입을 암묵적으로 변환합니다. ECMAScript 명세에는 다음과 같은 규칙이 정의되어 있습니다.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y)
즉, 피연산자 중 하나가 불리언(Boolean)이면 먼저 숫자로 변환한 뒤 비교가 진행됩니다. 이 과정에서 문자열 '0'은 숫자 0으로, false 역시 숫자 0으로 변환됩니다. 결국 0 == 0이 되므로 결과는 true입니다.
여기서 중요한 점은, 이 비교가 문자열 '0'이 스스로 참 같은 값(truthy)인지 거짓 같은 값(falsy)인지를 판단하는 것이 아니라는 사실입니다. 비교가 이루어지기 전에 이미 타입 강제 변환이 일어나 버렸기 때문입니다.
2. if(0)과 if('0')의 평가 과정 — truthy / falsy 판정
반면 if 문 안의 값은 불리언 맥락(boolean context)에서 그 자체로 평가되며, 타입 강제 변환이 발생하지 않습니다.
- if(0) : 숫자
0은 자바스크립트의 대표적인 거짓 같은 값(falsy)이므로 조건은 false로 평가됩니다. - if('0') : 빈 문자열이 아닌 모든 문자열은 참 같은 값(truthy)이므로, 내용이
'0'이라도 길이가 1인 비어 있지 않은 문자열이기 때문에 조건은 true로 평가됩니다.
다시 말해, if 문은 값이 null이거나 빈 값인지를 기준으로 판단하며, 문자열은 그 자체의 특성만으로 truthy 또는 falsy 여부를 판정받습니다.
3. 한눈에 보는 비교
| 표현식 | 결과 | 이유 |
|---|---|---|
'0' == false | true | 양쪽 모두 숫자 0으로 변환된 후 비교됨 (0 == 0) |
if('0') | true | 비어 있지 않은 문자열은 항상 truthy |
if(0) | false | 숫자 0은 대표적인 falsy 값 |
4. 실무 팁
이러한 암묵적 타입 변환으로 인한 버그를 예방하려면 동등 연산자(==) 대신 타입까지 엄격하게 비교하는 일치 연산자(===)를 사용하는 것이 좋습니다. '0' === false는 타입이 다르므로 변환 없이 즉시 false를 반환합니다.