표현 | 결과 |
---|---|
"" == false | true 😮 (느슨한 비교) |
"" === false | false ❌ (엄격한 비교) |
"" == false가 true인 이유:
자바스크립트의 느슨한 비교(==)는 타입을 강제로 변환(coercion)해서 비교합니다.
"" == false
↓
"" → 0 (빈 문자열 → 숫자 0)
false → 0
0 == 0 → true ✅
"" === false
↓
타입 다름 (string vs boolean) → false
JavaScript에서 false처럼 동작하는 값들 (falsy):
false
0
-0
0n // BigInt 0
""
null
undefined
NaN
위 값들은 if (value)처럼 검사했을 때 모두 false로 취급됩니다.
[] == false // ✅ true
[] === false // ❌ false
자바스크립트의 느슨한 비교(==)는 양쪽 타입이 다르면 타입 강제 변환(coercion)을 시도합니다.
Object vs Boolean일 경우, 아래 단계를 따릅니다:
[] == false
↓
false → 0 // Boolean → Number
[] → "" → 0 // Array → String → Number
0 == 0 → ✅ true
자바스크립트는 [](빈 배열)을 비교 연산에 쓸 때:
[] → toPrimitive() 호출 → toString() → ""
"" → Number("") → 0
즉:
Number([]) === 0 ✅
[] === false // ❌ false
엄격한 비교는 타입이 다르면 무조건 false입니다.
표현 | 결과 | 이유 |
---|---|---|
[] == false | ✅ true | [] → "" → 0, false → 0, 0 == 0 |
[] === false | ❌ false | 타입이 다름 (object vs boolean) |
Boolean([]) | ✅ true | 배열은 truthy — 이건 또 반대같이 느껴짐 |
맞아요. 이게 자바스크립트에서 혼동 포인트:
if ([]) {
console.log("truthy!"); // ✅ 실행됨
}
배열(심지어 빈 배열)도 객체니까 truthy로 취급됨.
하지만 == false 비교에선 타입 변환이 개입돼서 true가 되는 거예요.
null == false // ❌ false
null === false // ❌ false
자바스크립트의 느슨한 비교(==)는 특정 규칙에 따라 타입을 변환해서 비교합니다.
그런데 null은 아주 특별한 취급을 받아요.
null == undefined // ✅ true
null == false // ❌ false
null == 0 // ❌ false
null == "" // ❌ false
자바스크립트의 == 비교 규칙 중에서:
If Type(x) is null and Type(y) is boolean, return false (no coercion!).
즉, null과 false는 서로 변환해서 비교하지 않음. 그냥 false임.
Boolean(null) // false ✅
그래서 조건문에서는 이렇게 동작해요:
if (null) {
console.log("truthy");
} else {
console.log("falsy"); // ✅ 이게 출력됨
}
표현 | 결과 | 이유 |
---|---|---|
null == false | ❌ false | null은 false와 느슨한 비교도 안 함 |
null === false | ❌ false | 타입 다름 (object vs boolean) |
Boolean(null) | ✅ false | null은 falsy 값 |
null == undefined | ✅ true | JS에서 유일하게 null과 같다고 보는 값 |