[JS]09_논리 연산자

2u·2023년 3월 24일

JavaScript

목록 보기
43/43

1. 논리 연산자

: JS에는 세 종류의 논리 연산자 ||(OR), &&(AND), !(NOT) 이 있다.

1) ||(OR)

: '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

(1) 첫 번째 truthy를 찾는 OR 연산자 '||'

: 자바스크립트에서 제공하는 논리연산자 OR에는 '추가'기능이 있다.
-> 추가 기능은 아래와 같은 알고리즘으로 동작한다.

  • OR 연산자의 피연산자가 여러 개인 경우:
result = value1 || value2 || value3;

(1) 가장 왼쪽 피연산자부터 시작해 오른쪽으로 나아가며 피연산자를 평가한다.
(2) 각 피연산자를 불린형으로 변환한다. 변환 후 그 값이 ture이면 연산을 멈추고 피연산자의 변환전 원래 값을 반환한다.
(3) 피연산자 모두를 평가한 경우(모든 피연산자가 fasle로 평가되는 경우)엔 마지막 피연산자를 반환한다.

(2) 단락 평가

: RO연산자 ||에는 '단락 평가'라는 기능이 있다.

true || alert("not printed");
false || alert("printed");
//-> printed

-> 첫 번째 줄의 || 연산자는 ture를 만나자마자 평가를 멈추기 때문에 alert가 실행되지 않는다.
-> 단락 평가는 연산자 왼쪽 조건이 falsy일 때만 명령어를 실행하고자 할때 자주 쓰인다.

즉! 첫번째는 true이기 때문에 OR 연산자는 첫번째 true에서 더이상 평가하지 않는다. -> 멈춤
하지만! 두번쩨는 먼저온 것이 false! 다음 true를 찾아 OR연산자는 떠난다 ㅎㅎ
그다음이 alert("printed")는 값이 있는것 == ture이기 때문에 ture를 출력한다>_<!

2) &&(AND)

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창은 실행되지 않습니다.");
}
//-> 실행되지 않음

(1) 첫 번쨰 falsy를 찾는 AND 연산자 '&&'

  • AND 연산자와 피연산자가 여러 개인 경우
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
  • AND 연산자도 피연산자 여러 개를 연속해서 전달할 수 있다. 첫 번째 falsy가 어떻게 변환되는지 보자!
alert(1 && 2 && null && 3); //null
  • AND 연산자의 피연산자가 모두 truthy이면 마지막 피연산자를 반환한다.
alert(1 && 2 && 3); // 마지막 값, 3

우선순위(&& > ||)
&&의 우선순이가 ||보다 높다.
따라서 a && b || c && d는 (a && b) || (c && d)와 동일하다.

3) !(NOT)

result = !value;
  • NOT 연산자는 인수 하나만 받는다.
    (1) 피연산자를 불린형(true / false)으로 변환한다.
    (2) 1에서 변환된 값을 역을 반환한다.
alert (!ture); // false
alert ( !0); //true
  • NOT을 두개 연덜어 사용(!!)하면 변환된 값 그대로 불린형으로 변환할 수 있다.
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은 출력되지 않는다.

0개의 댓글