반응형

&& 와 || 연산자의 결과값이 논리 값(불리언)이 아니다.
두 피연산자 중 한쪽(오직 한쪽의) 값이다. 즉, 두 피연산자의 값들 중 하나를 선택한다.
&& 또는 || 연산자의 결과값이 반드시 불리언 타입이어야 하는 것은 아니며,
항상 두 피연산자 표현식 중 어느 한쪽 값으로 귀결된다.

var a = 42;
var b = "abc";
var c = null;

a || b;
a && b;

c || b;
c && b;

-----------------------------------------------------------------------------------------------

|| , && 연산자는 우선 첫번째 피연산자(a , c)의 불리언 값을 평가한다. 피연산자가 비 불리언 타입이면 먼저 ToBoolean로 강제변환 후 평가를 계속한다.

|| 연산자는 그 결과가 true면 첫번째 피연산자(a , c) 값을, false면 두 번재 피연산자(b) 값을 반환한다.

&& 연산자는 그 결과가 true면 두번재 피연산자(b)의 값을, false면 첫 번재 피연산자( a , c)의 값을 반환한다.

||, && 표현식의 결과값은 언제자 피연산자의 값 중 하나이고, 평가 결과가 아니다. 

c && b 에서 c는 null이므로 falsy 값이다. 그러나 && 표현식은 평가 결과인 false(falsy를 강제변환)가 아니라 c 자신의 값, null로 귀결된다.

a || b;
// 대략 다음과 같다
a ? a : b;

a && b;
// 대략 다음과 같다
a ? b : a;

function foo( a , b) {
  a = a || "hello";
  b = b || "world";
 
  console.log(a + " " + b);
}

foo();

foo("second test", " best");

위의 || 연산자의 패턴은 falsy 값은 무조건 건너뛸 경우에만 사용해야 한다. 그렇지 않으면 조건 평가식을 삼항 연산자( ? : )로 더욱 명시적으로 지정해야 한다.

-----------------------------------------------------------------------------------------------

function foo() {
  console.log(a);
}

var a = 30;
a && foo();

&& 연산자는 첫번째 피연산자의 평가 결과가 truthy일 때에만 두 번째 피연산자를 '선택'한다고 했는데 이런 특성을 '가드 연산자(Guard Operator)라고 한다. 첫 번째 표현식이 두번째 표현식의 '가드' 역학을 한다.

-----------------------------------------------------------------------------------------------

|| , && 연산 결과가 실제로 true  / false 가 아니다. 

var a = 42;
var b = null;
var c = "foo";

if ( a && ( b || c)) {
  console.log( "Yes");
}

 

a && ( b || c) 표현식의 실제 결과는 true가 아닌 "foo" 다. if문은 이 "foo"를 불리언 타입으로 강제변환하여 true로 만든다.

-----------------------------------------------------------------------------------------------

 

반응형