불리언 컨텍스트(if, &&, ||, !)에서 모든 값은 truthy 또는 falsy 중 하나로 취급됩니다. falsy 값은 정확히 8개이며, 그 외 모든 것은 truthy입니다.
falsy 값: false, 0, -0, 0n(BigInt 0), ""(빈 문자열), null, undefined, NaN.
js
if ("") {} // 건너뜀 — 빈 문자열은 falsy
if (0) {} // 건너뜀
if ("0") {} // 실행됨 — 비어있지 않은 문자열은 truthy!
if ([]) {} // 실행됨 — 빈 배열은 truthy!
if ({}) {} // 실행됨 — 빈 객체는 truthy!
놀라운 점: "0", [], {}는 모두 "비어있는" 느낌이지만 전부 truthy입니다.
흔하고 실제적인 버그
js
const name = input || "guest"; // ❌ input이 ""나 0이면 "guest"로 대체됨
const count = input ?? 0; // ✅ ??는 null/undefined일 때만 대체
||는 어떤 falsy 값이든 대체하므로, 유효한 0이나 ""가 교체됩니다. 널 병합(nullish coalescing) 연산자 ??는 오직 null/undefined에 대해서만 대체하는데, 보통 이것이 실제로 원하는 동작입니다.
왜 중요한가
정확한 falsy 집합을 알면 미묘한 버그를 예방할 수 있습니다 — 특히 숫자를 가드할 때(if (count)가 아니라 if (count > 0)) 그리고 기본값을 위해 ?? 대 ||를 선택할 때 그렇습니다.
