: JS에는 세 종류의 논리 연산자 ||(OR), &&(AND), !(NOT) 이 있다.
: 'OR'연산자는 두 개의 수직선 기호로 만들 수 있다.
result = a||b;
== 인수 중 하나라도 ture이면 ture를 반환하고, 그렇지 않으면 false를 반환한다.
alert(ture || ture); // ture
alert(flase || ture); //true
alert(true || false); // true
alert(false || fasle); //flase
-> 피연산자는 모두 false인 경우 제외하고 연산 결과를 항상 true이다.
if(1 || 0) { //if(true || flase)와 동일하게 동작
alert('true');
}
-> OR연산자 ||은 if문에서 자주 사용된다.
let hour = 9;
if(hour < 10 || hour > 18){
alert('영업시간이 아닙니다.');
}
let hour = 12;
let isWeekend = true;
if(hour < 10 || hour > 18 || isWeekend){
alert('여업시간이 아닙니다.');
// 시간은 12시지만 주말이기 때문에
}
alert(1 || 0); //1이 ture이기 때문에 true
alert(null || 1); //1이 ture이기 떄문에 true
alert(null || 0 || 1);// 1이 ture이기 떄문에 ture
alert(undefined || null || 0); // 0
// ->모두 false값이기 때문에 fasle
: 자바스크립트에서 제공하는 논리연산자 OR에는 '추가'기능이 있다.
-> 추가 기능은 아래와 같은 알고리즘으로 동작한다.
result = value1 || value2 || value3;
(1) 가장 왼쪽 피연산자부터 시작해 오른쪽으로 나아가며 피연산자를 평가한다.
(2) 각 피연산자를 불린형으로 변환한다. 변환 후 그 값이 ture이면 연산을 멈추고 피연산자의 변환전 원래 값을 반환한다.
(3) 피연산자 모두를 평가한 경우(모든 피연산자가 fasle로 평가되는 경우)엔 마지막 피연산자를 반환한다.
: RO연산자 ||에는 '단락 평가'라는 기능이 있다.
true || alert("not printed");
false || alert("printed");
//-> printed
-> 첫 번째 줄의 || 연산자는 ture를 만나자마자 평가를 멈추기 때문에 alert가 실행되지 않는다.
-> 단락 평가는 연산자 왼쪽 조건이 falsy일 때만 명령어를 실행하고자 할때 자주 쓰인다.
즉! 첫번째는 true이기 때문에 OR 연산자는 첫번째 true에서 더이상 평가하지 않는다. -> 멈춤
하지만! 두번쩨는 먼저온 것이 false! 다음 true를 찾아 OR연산자는 떠난다 ㅎㅎ
그다음이 alert("printed")는 값이 있는것 == ture이기 때문에 ture를 출력한다>_<!
result = a && b;
== AND 연산자는 두 피연산자가 모두 참일 때 ture를 반환한다.
-> 그 외에는 false를 반환한다.
alert (true && true); // ture
alert (false && true); // false
alert (true && false); // false
alert (false && false); //false
let hour = 12;
let minute = 30;
if(hour == 12 && minute == 30){
alert('현재 시각은 12시 30분 입니다.');
}
//-> 현재 시각은 12시 30분 입니다.
if(1 && 0){ //피연삱가ㅏ 숫자형이지만 논리형으로 바뀌어 true && false
alert("if 문 안에 falsy가 들어있으면 alert창은 실행되지 않습니다.");
}
//-> 실행되지 않음
result = value1 && value2 && valus3;
(1) 가장 왼쪽 피연산자부터 시작해 오른쪽으로 나아가며 피연산자를 평가한다,.
(2) 각 피연산자는 불린형으로 변환된다. 변환 후 값이 false이면 평가를 멈추고 해당 피연산자의 변환 전 원래 값을 반환한다.
(3) 피연산자는 모두가 평가되는 경우(모든 피연산자가 ture로 평가되는 경우)엔 마지막 피연산자가 반환된다.
-> 즉, AND 연산자는 첫 번째 falsy를 반환한다. 피연산자에 falsy가 없으면 마지막 값을 반환한다.
OR(||)와 AND(&&)의 차이점
- AND 연산자가 첫 번째 falsy를 반환하는 반면
- OR은 첫 번째 truthy를 반환한다.
// 첫 번째 피연산자가 truthy이면,
// AND는 두 번째 피연산자를 반환한다.
alert(1 && 0); //0
alert(1 && 5); //5
// 첫 번째 피연산자가 falsy이면,
// AND는 첫 번째 피연산자를 반환하고, 두 번쨰 피연산자는 무시한다.
alert(null && 5); //null
alert(0 && "아무거나 나와도 상관없음!!"); //0
alert(1 && 2 && null && 3); //null
alert(1 && 2 && 3); // 마지막 값, 3
우선순위(&& > ||)
&&의 우선순이가 ||보다 높다.
따라서 a && b || c && d는 (a && b) || (c && d)와 동일하다.
result = !value;
alert (!ture); // false
alert ( !0); //true
alert(!!"non-empty string"); // ture
alert(!!null);//false
== 내장 함수 Boolean을 사용하면 !!을 사용한 것과 같은 결과를 도출할 수 있다.
alert(Boolean("non-empty string"));//true
alert(Boolean(null)); //false
NOT 연산자는 우선순위는 모든 논리 연산자 중에 가장 높기 때문에 항상 &&나 || 보다 먼저 실행된다.
//다음 OR연산자 결과는 무엇일까?
alert(null || 2 || undefined);
//-> 2
//OR연산자의 피연산자가 alert라면?
alert(alert(1) || 2 || alert(3));
//-> 1,2
-> alert 메서드는 값을 반환하지 않는다.
-> 즉! undefined를 반환한다.
-> (1) 첫 번째 OR ||은 왼쪽 피연산자 alert(1)를 평가한다.
이때, 첫 번째 얼럿창에 1이 출력된다.
-> (2)alert 메서드는 undefined를 반환하기 때문에,
OR연산자는 다음 피연산자를 평가한다. truthy를 찾기 위해서...
-> (3) 두 번째 피연산자(오른쪽 피연산자)인 2는 truth이기 때문에 실행이 멈추고
2가 반환된다. 반환된 값 2는 제일 바깥 alert의 피연산자가 되어 두 번째
얼럿 창에 출력된다.
평가가 alert(3)까지 진행되지 않기 때문에 3은 출력되지 않는다.