논리연산자는 참(true) 또는 거짓(false)을 반영하는 불리언(Boolean) 값을 반환한다.
반환 시 단축평가(short circuit evaluation) 라는 것을 통해 왼쪽부터 오른쪽으로 평가를 진행하는데, 평가 도중 결과값이 나오면 다음 명제의 참,거짓 여부와 상관없이 결과값을 반환해 버린다.
연산자의 종류로는 논리곱이라 불리는 AND(&&) 연산자, 논리합이라 불리는 OR(||) 연산자, 그리고 참과 거짓을 뒤집는 NOT(!) 연산자가 있다.
&& 연산자는 '그리고'의 의미를 갖기 때문에 양쪽의 값이 모두 true여야 true값이 반환된다. 고로 단축평가를 통해 앞의 명제가 false이면 뒤의 값까지 갈 것 없이 바로 false가 반환된다.
false && true; //false
false && false; //false
true && false; //false
true && true; //true !
문자열이 오는 경우를 살펴보자. 문자열은 빈 문자열이 아니므로 true를 반환한다.
만약 모든 명제가 true라면 오른쪽에 있는 문자열을 그대로 반환한다.
false && "apple"; //false
"apple" && true; //true
"apple" && false; //false
true && "apple"; //apple !
"apple" && "orange"; //orange !
null && false; //null은 null값이 반환됨
|| 연산자는 '또는'의 의미를 갖기 때문에 둘 중 하나만 true여도 true 값이 반환된다.
고로 앞의 명제가 true이면 뒤의 명제까지 갈 것 없이 바로 true가 반환된다.
true || false; //true
true || true; //true
false || true; //true
false || false; //false !
문자열이 오는 경우, 문자열은 true를 반환하기 때문에 다른 명제가 무엇을 반환하든 상관없이 true 값이 반환된다. 왼쪽값이 최종 출력되며, 왼쪽에 false가 올 경우에만 true가 반환되는 자리에 있는 문자열이 출력된다. 양쪽 모두 문자열인 경우 뒤에 값은 볼 것도 없이 앞의 명제가 true로 평가되므로, 앞의 값을 반환한다.
"apple" || true; //apple
"apple" || false; //apple
flase || "apple"; //apple
true || "apple"; //true (앞의 값)
"apple" || "orange"; //apple
논리값을 부정하는 것으로 true는 false로, false는 true로 연산 결과를 뒤집는다.
!a //a가 false이면 true, true이면 false
논리연산자에는 우선순위가 있는데, 바로 &&(AND)가 ||(OR)보다 먼저 평가되는 것이다.
다음 예시를 보면, name=='Jane' && age>19
이 먼저 false가 나온 후에, || result
가 실행된다. result는 true이므로 무조건 '입장가능'하게 되는 식이 되어 버리는 것.
<script>
const name = 'Amy';
const age = 21;
const result = true;
if(name=='Jane' && age>19 || result){
console.log('입장가능');
} else {
console.log('입장불가');
}
//무조건 '입장가능'이 출력됨
</script>
name 값이 다르므로 '입장불가'를 출력해야 하기 때문에, 아래와 같이 식을 변경해준다.
<script>
if(name='Jane' && (age>19 || result)){
console.log('입장가능');
} else {
console.log('입장불가');
}
//'입장불가' 출력
</script>