<!--meta title: falsy & truthy description: falsy 와 truthy 개념을 스펙을 통해 알아본 글. keywords: falsy, truthy, boolean -->
falsy & truthy
falsy 와 truthy는 ECMA 스펙에 등장하는 단어는 아닙니다. JavaScript 동작을 이해하기 쉽게 하기위해 사용되는 단어입니다. 번역해보면 truthy는 "참 같은 값", falsy는 "거짓 같은 값" 정도로 해석되며, 다음과 같이 정리할 수 있습니다.<dl> <dt><strong>falsy</strong></dt> <dd>불리언 값으로 평가되는 문맥에서, false로 평가되는 값.</dd> <dd>undefined, null, false, 0, -0, NaN, ""(빈문자열), 0n 등이 있음 (ECMA 2020 기준)</dd><dt><strong>truthy</strong></dt> <dd>불리언 값으로 평가되는 문맥에서, true로 평가되는 값</dd> <dd>falsy를 제외한 값들</dd> </dl>truthy와 falsy 개념은 JavaScript의 값이 특정 문법, 연산에서 true나 false로 동작한다는 것을 말해줍니다.그럼 ECMA 스펙에서 어떤 부분이 falsy와 truthy 개념을 만들어 내는지 살펴 보겠습니다. 스펙 문서는 ECMA 2020 기준입니다.
ToBoolean
ECMA 스펙에서 어떤 값을 true, false로 변환하는 연산은 7.1.2 ToBoolean에 정의되어 있습니다. 이 연산은 추상 연산(Abstract Operation)으로 ECMASCript 언어의 런타임 스펙을 정의할 때 사용되는데, 값을 불리언 값으로 변환하는 역할을 합니다.추상 연산(Abstract Operation) : 스펙을 위해 정의된 연산으로, 스펙 내에서만 존재하며 실제로 구현되어 있는 연산은 아닙니다.ToBoolean 스펙을 일부 번역한 내용을 살펴보겠습니다.7.1.2 ToBoolean ( argument )7.1.2 ToBoolean ( argument ) 추상 연산 ToBoolean 은 argument를 인자로 받고, Table 10 에 따라 argument 를 Boolean 타입 값으로 변환한다:Table 10: ToBoolean 변환
argument 타입
결과
Undefined
false 반환
Null
false 반환
Boolean
argument 를 그대로 반환
Number
argument 가 0, -0, NaN 이면 false, 그 외 true 반환
String
argument 가 빈 문자열(길이가 0인)이면 false; 아니면 true 반환
Symbol
true 반환
BigInt
argument 가 0n 이면 false 반환, 그외 true 반환
Object
true 반환
ToBoolean(argument)의 argument 타입과 값에 따라 true를 반환하는지, false를 반환하는지 정의되어 있습니다.값으로 정리해보면, undefined, null, false, 0, -0, NaN, ""(빈문자열), 0n 의 8개의 값만 false로 변환되고, 그 외의 값은 true로 변환되는 것을 알 수 있습니다. 우리가 이미 알고 있는 truthy, falsy 에 해당하는 값들과 일치합니다.왠지 false로 변환될 것 같은 [], {} 도 Object 타입이기 때문에 true로 변환되는 값인 걸 알 수 있습니다.
런타임 스펙에서 사용되는 ToBoolean
이제 런타임 스펙에서 ToBoolean이 사용되는 모습을 살펴보겠습니다. ToBoolean은 Not 연산자(!), if, while, for, 삼항 연산자 ...등의 런타임 스펙에서 특정 값을 불리언 타입 값으로 변환하는데 사용됩니다.
참고: 아래에서 ToBoolean 앞의 ! 표시는 해당 연산이 추상 연산이라는 표시입니다.