명시적 강제변환 : * -> 불리언
String()
, Number()
도 그렇듯이 Boolean()
은 명시적인 강제변환 방법이다.
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
Boolean(a); // true
Boolean(b); // true
Boolean(c); // true
Boolean(d); // false
Boolean(e); // false
Boolean(f); // false
Boolean(g); // false
Boolean()
은 분명히 명시적이지만 그리 자주 쓰이지는 않는다.
+단항 연산자가 값을 숫자로 강제변환 하는 것처럼 ! 부정 단항 연산자도 값을 불리언으로 명시적으로 강제변환한다. 문제는 그 과정에서 truthy
, falsy
까지 뒤바뀐다는 점이다. 그래서 일반적으로 자바스크립트 개발 시 불리언 값으로 명시적인 강제변환을 할 땐 !!이중부정 연산자를 사용한다. 두 번재 !이 패리티를 다시 원상복구 하기 때문이다.
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
!!a; // true
!!b; // true
!!c; // true
!!d; // false
!!e; // false
!!f; // false
!!g; // false
이 같은 ToBoolean
강제변환 모두 Boolean()
이나 !!를 쓰지 않으면 if()
문 등의 불리언 콘텍스트에서 암시적인 강제변환이 일어난다.
자료 구조의 JSON 직렬화 시 true
/false
값으로 강제변환 하는 것도 명시적인 ToBoolean
강제변환의 일례다.
var a = [
1,
function () {
/* ... */
},
2,
function () {
/* ... */
},
];
JSON.stringify(a); // "[1, null, 2, null]"
JSON.stringify(a, function (key, val) {
if (typeof val == "function") {
// 함수를 ToBoolean 강제변환 한다.
return !!val;
} else {
return val;
}
});
// "[1, true, 2, true]"
그렇다면 삼항 연산자라는 것을 들어보았을 것이다.
var a = 42;
var b = a ? true : false;
삼항 연산자 ? :
는 표현식의 평가 결과에 따라 true
또는 false
를 반환한다.
true
/false
중 하나가 연산 결과로 도출된다는 점에서 명시적인 ToBoolean
강제변환의 모습과 닮았다.
그러나 여기엔 암시적 강제변환이 매복해 있다. a를 일단 불리언으로 강제변환해야 표현식 전체의 true
/false
여부를 따져볼 수 있기 때문이다. 이전에도 이런 코드를 '명시적으로 암시적'이다라고 했는데, 어쨌든 이런 코드는 무조건 쓰지 말자. 별로 얻을 것도 없고, 가면뒤에 숨겨져 있는 불편한 진실이 있을 뿐이다.
Boolean(a)
이나 !!a
같은 명시적 강제변환이 훨씬 좋다.
참고
- You Don't Know JS ( 한빛 미디어 )
'JAVASCRIPT' 카테고리의 다른 글
[JS][강제변환] 암시적 강제변환 : 문자열 <-> 숫자 (0) | 2022.02.11 |
---|---|
[JS][강제변환] 암시적 강제변환 : 개요 (0) | 2022.02.11 |
[JS][강제변환] 명시적 강제변환 : 숫자 형태의 문자열 파싱 (0) | 2022.02.10 |
[JS][강제변환] 명시적 강제변환 : ~(틸드) (0) | 2022.02.10 |
[JS][강제변환] 명시적 강제변환 : 날짜 <-> 숫자 (0) | 2022.02.10 |
댓글