자바스크립트에는 세 종류의 논리 연산자 ||
(OR), &&
(AND), !
(NOT)가 있다.
논리 연산자는 피연산자로 불린형 뿐 아니라 모든 타입의 값을 받을 수 있다. 연산 결과 역시 모든 타입이 될 수 있다.
‘OR’ 연산자는 두 개의 수직선 기호로 만들 수 있다.
전통적인 프로그래밍에서 OR 연산자는 불린값을 조작하는 데 쓰인다. 인수 중 하나라도 true 이면 true 를 반환하고, 그렇지 않으면 false 를 반환한다.
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
피연산자가 둘다 false 인 경우를 제외하고 연산 결과는 항상 true 이다.
피연산자가 불린형이 아니면, 평가를 위해 불린형으로 변환된다.
0제외 모든 숫자 → true 로, 0 → false 로 변환된다.
OR 연산자는 주어진 조건 중 하나라도 참인지를 테스트하는 용도로 if 문에서 자주 사용된다.
let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
alert( '영업시간이 아닙니다.' ); // 주말이기 때문임
}
자바스크립트에서만 제공하는 기능으로 논리연산자 OR 의 ‘추가' 기능이 있다.
추가 기능은 아래와 같은 알고리즘으로 동작한다.
OR 연산자와 피연산자가 여러 개인 경우
result = value1 || value2 || value3;
이때 || 연산자는 다음 순서를 따른다.
OR 연산자를 여러 개 체이닝하면 첫 번째 truthy 를 반환한다. 피연산자에 truthy 가 하나도 없다면 마지막 피연산자를 반환한다.
이러한 기능을 이용해 여러 용도로 OR 연산자를 활용할 수 있다.
변수 또는 표현식으로 구성된 목록에서 첫 번째 truthy 얻기
|| 를 사용하면 실제 값이 들어 있는 변수를 찾고, 그 값을 보여줄 수 있다. 변수 모두에 값이 없다면 ‘익명'을 반환하도록 했다.
let firstName = "";
let lastName = "";
let nickName = "바이올렛";
alert( firstName || lastName || nickName || "익명"); // 바이올렛
단락 평가
|| 가 제공하는 또 다른 기능은 단락 평가이다.
|| 는 왼쪽부터 시작해서 오른쪽으로 평가를 진행하는데, truthy 를 만나면 나머지 값들은 건드리지 않은 채 평가를 멈춘다. 이 프로세스를 단락 평가라고 한다.
이러한 동작 방식은 두 번째 피연산자가 변수 할당과 같은 부수적인 효과를 가지는 표현식일 때 유용하다.
true || alert("출력되지 않는다");
false || alert("출력된다");
첫 번째 줄은 true 를 만나자마자 평가를 멈추기 때문에 alert 를 실행하지 않는다.
이처럼 연산자 왼쪽 조건이 falsy 일 때만 명령어를 실행하고자 할 때 자주 쓰인다.
& 두 개를 연달아 쓰면 AND 연산자 && 를 만들 수 있다.
전통적인 프로그래밍에서 AND 연산자는 두 피연산자 모두가 참일 때 true 를 반환한다. 그 외의 경우는 false 를 반환한다.
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
AND 연산자 역시 피연산자가 불린형이 아니면 불린형으로 변환하여 수행된다.
AND 연산자 && 는 아래와 같은 순서로 동작한다.
즉, AND연산자는 첫 번째 falsy 를 반환하고, 피연산자에 falsy 가 없다면 마지막 값을 반환한다.
AND 연산자가 첫 번째 falsy 를 반환하는 반면, OR 연산자는 첫 번째 truthy 를 반환한다는 차이가 있다.
💡 &&의 우선순위가 || 보다 높다. 따라서 a&&b || c && d 는 (a&&b) || (c&&d) 와 동일하게 작동한다. 💡 if 를 || 나 && 로 대체해서는 안 된다.논리 연산자 NOT 은 느낌표를 써서 만들 수 있다.
NOT 연산자는 인수를 하나만 받고, 다음 순서대로 연산을 수행한다.
이 성질을 이용해, NOT 을 두 개 연달아 사용하면 값을 불린형으로 변환할 수 있다. (= Boolean 을 사용한 것과 같은 결과를 도출할 수 있다. )
alert( !!"non-empty string" ); // true
alert( !!null ); // false
alert( alert(1) || 2 || alert(3) );
alert( alert(1) && alert(2) );