논리 연산자는 피연산자로 불린형뿐만 아니라 모든 타입의 값을 받을 수 있다. 연산 결과 역시 모든 타입이 될 수 있다.
'OR'연산자는 두 개의 수직선 기호로 만들 수 있다.
전통적인 프로그래밍에서 OR 연산자는 불린값을 조작하는 데 쓰인다. 인수 중 하나라도 true면 true를 반환하고, 그렇지 않으면 false를 반환한다.
자바스크립트의 OR 연산자는 다루기는 까다롭지만 강력한 기능을 제공한다. OR를 어떻게 응용할 수 있는지 보기 전에, OR 연산자가 불린값을 어떻게 다루는지 알아보자.
OR 연산자는 이항 연산자이므로 아래와 같이 4가지 조합이 가능하다.
피연산자가 모두 false인 경우를 제외하고 연산 결과는 항상 true다.
피연산자가 불린형이 아니면, 평가를 위해 불린형으로 변환된다.
EX. 연산 과정에서 숫자 1은 true로, 0은 false로 변환된다.
OR 연산자 ||은 주어진 조건 중 하나라도 true인지 테스트하는 용도로 if문에서 자주 사용된다.
또한, if문 안에 여러 가지 조건을 넣을 수 있다.
EX.
이제 자바스크립트의 전통적인 기능이 아닌, 자바스크립트에서만 제공하는 추가 기능에 대해 알아보자.
1. 가장 왼쪽 피연산자부터 시작해 오른쪽으로 나아가며 피연산자를 평가한다.
2. 각 피연산자를 불린형으로 변환한다. 변환 후 그 값이 true면 연산을 멈추고, 해당 피연산자의 변환 전 원래 값을 반환한다.
3. 피연산자 모두를 평가한 경우(모든 피연산자가 false로 평가되는 경우)엔 마지막 피연산자를 반환한다.
💡 여기서 핵심 : 반환 값이 형 변환을 하지 않은, 원래 값이다!
결론
OR 연산자를 여러 개 체이닝(chaining)하면 첫 번째 truthy를 반환한다. 피연산자에 truthy가 하나도 없다면 마지막 피연산자를 반환한다.
EX.
이런 추가 기능을 이용하면 여러 용도로 OR 연산자를 활용할 수 있다.
firstName, lastName, nickName이란 변수가 있을 때, 이 값들이 모두 옵션값이라고 하자. OR (||) 연산자를 사용하면 실제 값이 들어있는 변수를 찾고, 그 값을 보여줄 수 있다. 변수 모두에 값이 없다면 '익명'을 보여주자.
모든 변수가 falsy였다면 '익명'을 출력했을 것이다.
위에서 설명한 바와 같이, OR(||) 연산자는 왼쪽부터 시작해서 오른쪽으로 평가를 진행하는데, truthy를 만나면 나머지 값들은 건드리지 않은 채 평가를 멈춘다. 이런 프로세스를 단락 평가라 한다.
단락 평가의 동작 방식은 두 번째 피연산자가 변수 할당과 같은 부수적인 효과(side effect)를 가지는 표현식 일 때 명확히 볼 수 있다.
EX. 위 예시에서 첫 번째 줄의 || 연산자는 true를 만나자마자 평가를 멈추기 때문에 alert가 실행되지 않는다.
두 번째 줄의 연산자는 false를 만나고 alert를 만나기 때문에 메시지가 출력된다.
두 개의 앰퍼샌드를 연달아 쓰면 AND 연산자이다.
전통적인 프로그래밍에서 AND 연산자는 두 피연산자가 모두 참일 때 true를 반환한다. 그 외의 경우는 false를 반환한다.
OR 연산자와 마찬가지로 AND 연산자의 피연산자도 타입에 제약이 없다.
1. 가장 왼쪽 피연산자부터 시작해 오른쪽으로 나아가며 피연산자를 평가한다.
2. 각 피연산자는 불린형으로 변환된다. 변환 후 값이 false이면 평가를 멈추고 해당 피연산자의 변환 전 원래 값을 반환한다.
3. 피연산자 모두가 평가되는 경우(모든 피연산자가 true로 평가되는 경우)엔 마지막 피연산자가 반환된다.
결론
AND 연산자는 첫번째 falsy를 반환한다. 피연산자에 falsy가 없다면 마지막 값을 반환한다.
💡 OR 연산자와 차이점
OR 연산자는 첫번째 truthy를 반환하는 반면, AND 연산자는 첫번째 falsy를 반환한다.
아래 예시에서는 AND 연산자의 피연산자가 모두 truthy이기 때문에 마지막 피연산자가 반환된다.
💡 &&의 우선순위가 ||보다 높다
따라서, a && b || c && d는 (a && b) || (c && d)와 동일하게 동작한다.
💡 if를 '||'나 '&&'로 대체하지 마라!
이 시리즈 글들을 쭉 읽었다면 왜인지는 예상할 거라 믿는다.
가독성 떨어집니다 ㅎㅎ
if 조건문이 필요하면 if를 사용하고, AND 연산자나 OR 연산자는 목적에 맞게 사용하자.
NOT 연산자의 문법은 매우 간단하다.
NOT 연산자는 인수를 하나만 받고, 다음 순서대로 연산을 수행한다.
💡 NOT을 두 개 연달아 사용(!!)하면 값을 불린형으로 변환할 수 있다.
이는 내장함수 Boolean을 사용한 결과와 같다.
alert(null || 2 || undefined);
📌 답 : 2 출력
alert( alert(1) || 2 || alert(3) );
📌 답 : 1, 2 차례로 출력
alert 메서드는 값을 반환하지 않는다. 즉 undefined를 반환한다. 따라서 OR 연산자는 alert를 수행하고 다음 피연산자를 평가하게 된다.
alert( 1 && null && 2 );
📌 답 : null 출력
alert( alert(1) && alert(2) );
📌 답 : 1, undefined 차례로 출력
alert를 호출하면 undefined가 반환된다. &&는 왼쪽 피연산자를 평가하고(이때 1 출력) 평가를 즉시 멈춘다. alert(1)의 평가 결과는 undefined로 falsy이기 때문이다. 따라서 밖의 alert는 undefined를 출력하게 된다.
alert(null || 2 && 3 || 4);
📌 답 : 3 출력
📌 답 : if(age >= 14 && age <= 90)
📌 답
1. NOT 사용 X
if(age < 14 || age > 90)
2. NOT 사용
if(!(age >= 14 && age <= 90))
📌 답 : first 출력 → third 출력
📌 답
let userName = prompt("Who's there?", '');
if(userName == "Admin"){
let pw = prompt("Password?", '');
if(pw == "TheMaster"){
alert("Welcome!");
}
else if(pw == '' || pw == null){
alert("Canceled");
}
else{
alert("Wrong Password");
}
}
else if(userName == '' || userName == null){
alert("Canceled");
}
else{
alert("I don't know you");
}
이 글은 https://ko.javascript.info/ 를 참고하여 작성하였습니다.