다른 프로그래밍 언어들과 마찬가지로 자바스크립트도 논리연산자 문법을 사용할 수 있습니다. ||
(OR), &&
(AND), !
(NOT) 총 세 종류의 논리 연산자가 존재합니다. 피연산자로 모든 타입의 값을 받을 수 있고 평가는 Boolean 형으로 변환되어 진행되게 됩니다. 결과 또한 모든 타입이 될 수 있습니다.
javascript에서 Boolean 값은 true와 false 중 하나의 값입니다. javascript에서 거짓으로 판정되는 값(falsy)은 undefined
, null
, 0
, -0
, NaN
, ""
총 6개입니다. 참으로 판정되는 값(truthy)은 앞서 거짓으로 판정되는 6개 값을 제외한 값들입니다.
||
(OR) 연산자는 비교하는 두 개의 인수 중 하나라도 true인 경우 true를 반환하고 그 외의 경우에 false를 반환합니다.
true || true // true
true || false // true
false || true // true
false || false // false
&&
(AND) 연산자는 비교하는 두 개의 인수 모두 true인 경우 true를 반환하고 그 외의 경우에 false를 반환합니다.
true && true // true
true && false // false
false && true // false
false && flase // false
&&
(AND) 는 !
(NOT) 보다 우선순위가 낮고 ||
(OR) 보다 우선순위가 높습니다.
!
(NOT) 연산자는 피연산자를 Boolean 형으로 변환한 뒤 변환된 값의 역을 반환합니다.
!true // false
!false // true
!"something" // false
!undefined // true
Boolean형으로 변환된 값이 true인 경우는 false로 false인 경우는 true로 변환됩니다.
alert(!!undefined); // false
alert(Boolean(undefined)); // false
alert(!!"something") // true
alert(Boolean("something")) // true
!!
같이 사용할 경우 특정 값을 Boolean형으로 변환 가능합니다. 또한 Boolean
내장 함수를 사용해도 특정 값을 Boolean 형으로 변환 가능합니다.
논리연산자의 연산자 우선순위는 !
(NOT), &&
(AND), ||
(OR) 순으로 실행됩니다.
자바스크립트 논리연산자는 왼쪽에서 오른쪽 평가를 진행합니다. ||
(OR) 연산자의 경우 평가가 진행되는 도중 truthy를 만나면 평가를 멈추는 특성을 가지게 되는데 이것을 숏 서킷 평가(short circuit evaluation)라고 합니다.
true || true;
// true
true || false;
// true
false || false;
// false
위 세 가지 경우에 대한 예제 중 첫 번째, 두 번째의 경우 모두 첫 번째 값이 truthy 이기 때문에 오른쪽 인수가 무엇이 되었든 상관없이 거기서 평가를 멈추고 true를 반환하게 됩니다.
false || alert("alert 창이 뜰까요??")
true || alert("alert 창이 뜰까요??")
다음은 숏 서킷 평가에서 truthy를 만나면 평가를 멈춘다는 것을 좀 더 명확하게 확인하기 위한 예제입니다. 첫 번째 경우는 왼쪽 인수가 false이기 때문에 다음 인수 평가로 넘어가게 되고 truthy이므로 alert 창이 뜨게 됩니다. 하지만 두 번째 경우 왼쪽 인수가 truthy 이므로 숏 서킷 평가에 의해 평가를 멈추게 되어 alert창이 뜨지 않습니다.
이렇듯 숏 서킷 평가는 왼쪽 조건이 falsy일 경우에만 오른쪽 인수를 실행하도록 할 때 사용할 수 있습니다.
var car = {
wheel: 4
}
console.log(car.body || 'white'); // white
var car = {
wheel: 4,
body: 'black'
}
console.log(car.body || 'white'); // black
위 예제들과 같이 car라는 객체에 body라는 key가 없어 undfined를 반환하더라도 안전하게 처리할 수 있도록 해준다.
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
console.log(f);
다음은 stack overflow에서 실제로 화제가 되었던 코드입니다. console에 무엇이 출력될까요?
var a; // undefined (falsy value)
var b = null; // null (falsy value)
var c = undefined; // undefined (falsy value)
var d = 4; // number (truthy)
var e = 'five'; // assigment short circuits before reaching here
var f = a || b || c || d || e;
a
부터 c
까지 falsy value 이므로 평가를 진행하다 d
에서 truthy를 반환하므로 평가를 멈추됩니다. 따라서 변수 f
에 저장되는 값은 변수 d
의 값인 4가 됩니다.