본문 바로가기
JAVASCRIPT

[JS][강제변환] 암시적 강제변환 : 불리언 -> 숫자

by KBS 2022. 2. 11.
728x90

암시적 강제변환 : 불리언 -> 숫자

암시적 강제변환의 효용성은 복잡한 형태의 불리언 로직을 단순한 숫자 덧셈 형태로 단순화할 때 빛을 발한다. 범용적인 기법은 아니지만 특정 상황에선 기발안 해법이 될 수 있다.

function onlyOne(a, v, c) {
  return !!((a && b && c) || (!a && b && c) || (!a && !b && c));
}

var a = true;
var b = false;

onlyOne(a, b, b); // true
onlyOne(b, a, b); // true

onlyOne(a, b, a); // false

 

onlyOne()는 세 인자 중 정확히 하나만 true/truthy인지 아닌지를 확인하는 함수로 truthy 체크 시 암시적 강제변환을 하고 최종 반환 값을 포함한 다른 부분은 명시적 강제변환을 한다.

그런데 이런 식으로 4개 5개... 20래 인자를 처리해야 할 경우, 모든 비교 로직을 조합하여 코드를 구현해야 한다는게 상당히 어렵다는 사실을 금방 알 수 있다.

function onlyOne() {
  var sum = 0;
  for (var i = 0; i < arguments.length; i++) {
    // falsy 값은 건너 뛴다.
    // 0으로 취급하는 셈이다. 그러나 NaN은 피해야 한다.
    if (arguments[i]) {
      sum += arguments[i];
    }
  }

  return sum == 1;
}

var a = true;
var b = false;

onlyOne(b, a); // true
onlyOne(b, a, b, b, b); // true

onlyOne(b, b); // false
onlyOne(b, a, b, b, b, a); // false

 

true/truthy를 숫자로 강제변환 하면 1이므로 그냥 숫자를 모두 더한 것이 전부이고, sum += arguments[i]에서 암시적 강제변환이 일어난다. 인자 중 딱 하나만 true일때 sum은 1이고, 그외에는 1이 되지 않으므로 조건에 부합하는지 판단할 수 있다.

같은 기능을 만들때 명시적 강제변환이 더 나은 방버일까? 암시적 강제변환 코드에서 주석으로 달아논 NaN함정은 잘 피해갔다. 하지만 어디까지나 판단은 우리의 몫이다.

 


참고

  • You Don't Know JS - 타입과 문법, 스코프와 클로저( 한빛 미디어 )
728x90

댓글