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
'JAVASCRIPT' 카테고리의 다른 글
[JS][강제변환] 느슨한/엄격한 동등 비교 ( ==, ===) (0) | 2022.02.12 |
---|---|
[JS][강제변환] 암시적 강제변환 : * -> 불리언, || 와 && 연산자 (0) | 2022.02.11 |
[JS][강제변환] 암시적 강제변환 : 문자열 <-> 숫자 (0) | 2022.02.11 |
[JS][강제변환] 암시적 강제변환 : 개요 (0) | 2022.02.11 |
[JS][강제변환] 명시적 강제변환 : * -> 불리언 (0) | 2022.02.10 |
댓글