본문 바로가기
JAVASCRIPT

[JS][강제변환] 명시적 강제변환 : * -> 불리언

by KBS 2022. 2. 10.
728x90

명시적 강제변환 : * -> 불리언

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 ( 한빛 미디어 )
728x90

댓글